编码器根据工作原理可以分为很多类,在工业控制领域,编码器也得到了广泛地应用。编码器的结构和工作原理,CSDN中有很多好的文章,我在这里就不在重复造轮子了。在此仅对STM32单片机定时器的编码器模式作一个简单的学习记录,作为以后正式使用时的参考资料。
前期准备:
MCU:野火 STM32F407IGT6 骄阳开发板
软件:STM32CUBEMX + KEIL
1,使用CUBEMX设置时钟频率,使用高速外部晶振25MHz,系统总线频率168MHz
2,编程接口设置:使用串口Serial Wire
3,选择定时器,并将定时器设置为编码器模式;
在STM32F407IGT6的三种编码器中(TIM1--TIM14),除了基本定时器(TIM6,TIM7,TIM10,TIM11,TIM13,TIM4)外,其它高级定时器和通用定时器均具备编码器接口功能,在此,我们选择通用定时器TIM3来作为编码器输出的接口
将TIM3设置为Encoder Mode编码器模式后,TIM3的信号来源固定为从TIM3 Channel1和TIM3 Channel2输入,所以该页面中时钟源等选项都变成了灰色,禁止修改。
参考下图——STM32F407IGT6通用定时器框图,编码器模式的信号来源确实为TIMx_CH1和TIMx_CH2的边沿触发。
4,对编码器模式的相关参数进行设置;
计数分频值设置为0,即输入信号不分频;
工作模式:Encoder Mode TI1 and TI2,在TI1和TI2的上升沿,下降沿同时计数,即4倍频;
Input Filter = 1,开启输入滤波器;
5,开启TIM3全局中断 TIM3 global interrupt;
计数器为16位,每计数65535次后,会产生一个计数器溢出中断,在该中断里使用变量记录产生的中断次数,即计数器溢出次数,便于后续对总的脉冲数量进行统计;
工作模式为模式3,在TI1和TI2的上升沿,下降沿同时计数,即4倍频;
至此,CUBEMX对STM32F407IGT6的初始化工作已经完成,点击GENERATE CODE自动生成初始化代码。但此时的编码器并不能够正常工作,需要对生成的代码进行相关补充:
1,启动TIM3并开启所有通道(CH1,CH2)
HAL_TIM_Encoder_Start_IT(&htim3,TIM_CHANNEL_ALL);
2,使能更新中断,用于溢出计数
__HAL_TIM_ENABLE_IT(&htim3,TIM_IT_UPDATE); //使能更新中断用于溢出计数
3,在重写更新中断回调函数“HAL_TIM_PeriodElapsedCallback”增加更新计数
/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/* TIM3定时器编码器模式,更新中断 */
if(htim->Instance == TIM3) //来自TIM3的更新中断
{
Encoder1_Overflow_count++; //Encoder1溢出次数+1
__HAL_TIM_CLEAR_IT(&htim3,TIM_IT_UPDATE); //清除Encoder1更新中断
}
}
/* USER CODE END 4 */
本文仅介绍了编码器模式的初始化代码,具体使用时还需要继续丰富代码的功能
另外,如果需要读取当前计数器的值,可以使用__HAL_TIM_GET_COUNTER(&htim3);