关联:
STM32超全笔记【秋招自用】【含PID小车、飞控等项目】
STM32定时器的三个模式我们已经学完了,最后还有一个编码器模式。
顾名思义是搭配编码器使用的。
【编码器】
【问】编码器是什么?
如图,编码器一般都安装在电机的尾部,用来测量电机的转速、方向和位置。
【问】编码器输出信号是什么?怎么根据输出信号测速和测方向?
输出A相和B相。
转速的测量方法其实有很多,我们这里用最简单能理解的方法:
转速 = 单位时间内测量到的脉冲数量
方向:两通道的相对电平关系,如图:
【STM32定时器编码器模式】
【问】我们如何通过STM32读取编码器波形,计算出速度??
【计数方向和编码器信号的关系】
这是编码器必遇到的一张图:
【问】这边我假设仅在TI1计数,那么这样一个波形的计数规则是什么?
当TI1第一个高电平来临,这个时候我们需要看一下相对信号的电平(就是TI2)是低电平,那么就对应向上计数。(图中第一个绿色箭头)
当TI1第一个低电平来临,这个时候我们需要看一下相对信号的电平(就是TI2)是高电平,那么就对应向上计数。(图中第二个绿色箭头)
【问】这相当于对原始数据几倍频?
两倍频。
下图是选择同时计数,那么就相当于四倍频。
希望您能看懂。
【例程8】编码器测速
【硬件连接】
首先是硬件连接,选择的编码器是JGA25-370。
两个电机的AB相输出引脚分别连接PA0和PA1、PB6和PB7
【问】这个引脚是怎么确定的呢?
查数据手册,如图。
【编码器模式的初始化配置】
然后这节例程我们在STM32CubeIDE中进行图形化编程配置,因为简单明了方便。
如图设置TIM2和TIM4:
同时设置对应的GPIO引脚上拉:
然后在代码中开启定时中断。
HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_ALL);//开启定时器2
HAL_TIM_Encoder_Start(&htim4,TIM_CHANNEL_ALL);//开启定时器4
HAL_TIM_Base_Start_IT(&htim2); //开启定时器2 中断
HAL_TIM_Base_Start_IT(&htim4); //开启定时器4 中断
【测试】
short Encoder1Count = 0;//编码器计数器值
short Encoder2Count = 0;
//1.保存计数器值
Encoder1Count =(short)__HAL_TIM_GET_COUNTER(&htim4);
Encoder2Count =(short)__HAL_TIM_GET_COUNTER(&htim2);
//2.清零计数器值
__HAL_TIM_SET_COUNTER(&htim4,0);
__HAL_TIM_SET_COUNTER(&htim2,0);
printf("Encoder1Count:%d\r\n",Encoder1Count);
printf("Encoder2Count:%d\r\n",Encoder2Count);
HAL_Delay(2);
最后通过串口,我们测量出定时器溢出值为4
【测转速】
打开编码器的数据手册,我们需要求出:
【问】车轮旋转一周,编码器计数器的计数值是多少?
一周旋转9.6圈,产生11个脉冲(线数),计数方式是同时计数(4倍频)
所以计数值 9.6 × 11 × 4
【测速函数】
Motor1Speed = (float)Encode1Count*100/9.6/11/4;
Motor2Speed = (float)Encode2Count*100/9.6/11/4;
printf("Motor1Speed:%.2f\r\n",Motor1Speed);
printf("Motor2Speed:%.2f\r\n",Motor2Speed);
实验结果: