基于HK32F030M的TIM编码接口模式实现编码器信号捕获分析
基于HK32F030M的TIM编码接口模式实现编码器信号捕获分析
1、HK32F030M的TIM 编码器接口模式介绍与配置;
我们打开《HK32F030M用户手册》找到12.2.16章节,大家请自行阅读改章节,我们的应用主要需要捕获两个信息,即计数方向和计数,其他应用请大家自行学习探索;
我们首先来看一个表;
上表展示了计数方向与编码器信号的关系,有效边沿计数可以选择三种,由TIM1_SMCR寄存器的SMS管理,有如果计数器只在 TI2 的边沿计数,则置 TIM1_SMCR 寄存器中的SMS=001;如果只在 TI1 边沿计数,则置 SMS=010;如果计数器同时在 TI1 和 TI2 边沿计数,则置SMS=011。
我们再来看一张图
该图是一个计数器操作的实例,显示了计数信号的产生和方向控制。它还显示了当选择了双边沿时,
输入抖动是如何被抑制的;抖动可能会在传感器的位置靠近一个转换点时产生。
2、编码器接口初始化配置与代码实现计数方向和计数值获取
我们编程之前先看一下HK32F030M的引脚配置,确定哪些引脚可以配置为编码器接口模式;打开《HK32F030M数据手册》并找到章节6.5 引脚复用(AF) 功能表,我们知道TIM的CH1和CH2都是可以配置为编码器模式的,我们这里使用TIM1的PD1和PD2,并且我们看这个表可以知道是AF3的引脚复用;
确定引脚配置我们立马进行初始化配置,这里直接上代码,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:计数方向与计数值;
基于STM32F103的TIM编码接口模式实现编码器信号捕获分析
1、STM32F103的TIM 编码器接口模式介绍与配置;
与HK32F030M的基本一致,可以打开《STM32中文参考手册》的13.3.16编码器接口模式学习;
2、编码器接口初始化配置与代码实现计数方向和计数值获取
我们打开EnCoder.ioc查看工程配置