基于HK32F030M的TIM编码接口模式实现编码器信号捕获分析

基于HK32F030M的TIM编码接口模式实现编码器信号捕获分析

1、HK32F030M的TIM 编码器接口模式介绍与配置;

我们打开《HK32F030M用户手册》找到12.2.16章节,大家请自行阅读改章节,我们的应用主要需要捕获两个信息,即计数方向和计数,其他应用请大家自行学习探索;

我们首先来看一个表;

image

上表展示了计数方向与编码器信号的关系,有效边沿计数可以选择三种,由TIM1_SMCR寄存器的SMS管理,有如果计数器只在 TI2 的边沿计数,则置 TIM1_SMCR 寄存器中的SMS=001;如果只在 TI1 边沿计数,则置 SMS=010;如果计数器同时在 TI1 和 TI2 边沿计数,则置SMS=011。

我们再来看一张图

image

该图是一个计数器操作的实例,显示了计数信号的产生和方向控制。它还显示了当选择了双边沿时,
输入抖动是如何被抑制的;抖动可能会在传感器的位置靠近一个转换点时产生。

2、编码器接口初始化配置与代码实现计数方向和计数值获取

我们编程之前先看一下HK32F030M的引脚配置,确定哪些引脚可以配置为编码器接口模式;打开《HK32F030M数据手册》并找到章节6.5 引脚复用(AF) 功能表,我们知道TIM的CH1和CH2都是可以配置为编码器模式的,我们这里使用TIM1的PD1和PD2,并且我们看这个表可以知道是AF3的引脚复用;

image

确定引脚配置我们立马进行初始化配置,这里直接上代码,NVIC在这里可以不配置的,详细代码讲解且听视频讲解;

void TIMEncoderInit(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    /* TIM1 2 clock enable */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
    /* GPIOA clock enable */
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD, ENABLE);

    /* TIM1 channel 2 pin (PD.01,PD。02) configuration */
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1 | GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

    /* Connect TIM pins to AF */
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_3);
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_3);

    /* Compute the prescaler value */
    PrescalerValue = (uint16_t) ((SystemCoreClock ) / 6000000) - 1;

    /* Time base configuration */
    TIM_TimeBaseStructure.TIM_Period = 65535;
    TIM_TimeBaseStructure.TIM_Prescaler = 0;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

    /* Prescaler configuration */
    TIM_PrescalerConfig(TIM1, PrescalerValue, TIM_PSCReloadMode_Immediate);
    TIM_EncoderInterfaceConfig(TIM1, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);


    /* TIM Interrupts enable */
    TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
    /* TIM1 enable counter */
    TIM_Cmd(TIM1, ENABLE);

    /* Enable the TIM3 gloabal Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_TRG_COM_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);	
	
	
}

void TIM1_UP_TRG_COM_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)
    {
        TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
    }
}

计数方向和计数值通过下面代码获取,可以再while中执行

	encoder.xDir=(TIM1->CR1)&TIM_CR1_DIR;
	encoder.xCount=TIM_GetCounter(TIM1);

3、下载验证

通过串口调试助手我们可以直观看到打印的log:计数方向与计数值;

image

基于STM32F103的TIM编码接口模式实现编码器信号捕获分析

1、STM32F103的TIM 编码器接口模式介绍与配置;

与HK32F030M的基本一致,可以打开《STM32中文参考手册》的13.3.16编码器接口模式学习;

2、编码器接口初始化配置与代码实现计数方向和计数值获取

我们打开EnCoder.ioc查看工程配置
image

3、下载验证

posted @ 2022-08-23 09:45  LiJin_hh  阅读(549)  评论(0编辑  收藏  举报