<总目录>
根据电路图,我们选用的引脚是PA0和PA1,这是Time2的通道1和2,而实际上我们只需要选择配置成编码器模式即可自动选择这两个引脚。
这是一个的编码器配置,应为是两个电机,要配置两个编码器,来读取速度。另一个是PB6和PB7,配置如下:
属性配置的时候就很关键了,这里我们选择TI1和TI2模式,这个代表什么意思呢?这是四倍频的设置,四倍频可以大大提高测量精度,灵敏性;然后我们设置计数的最大值是65535即0xFFFF。
编码器是一种将角位移或者角速度转换成一连串的电数字信号脉冲的旋转式传感器,我们可以通过编码器测量到角位移或者角速度信息。编码器从类型上可以划分增量式编码器和绝对式编码器。而从编码器检测原理上划分,可以分为光学式、磁式、感应式等等。一般常用的是光学式和电磁式编码器。
如下图所示。
四倍频的技术使用,可以将编码器的精度提高4倍,如下图所示,编码器的输出波形图。
重要的一点是设置计数值初始化为0,这个就涉及到正反转的配置了。
void Encoder_start(void)
{
__HAL_TIM_SET_COUNTER(&htim2,0);
__HAL_TIM_SET_COUNTER(&htim4,0);
HAL_TIM_Encoder_Start_IT(&htim2,TIM_CHANNEL_ALL);
HAL_TIM_Encoder_Start_IT(&htim4,TIM_CHANNEL_ALL);
HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_ALL);
HAL_TIM_Encoder_Start(&htim4,TIM_CHANNEL_ALL);
}
每次在软件上格式都没问题,复制到这里就不对齐了!
int Read_Encoder(uint8_t TIMX)
{
int Encoder_TIM = 0;
switch(TIMX)
{
case 2:
Encoder_TIM= -(short)__HAL_TIM_GET_COUNTER(&htim2);
__HAL_TIM_SET_COUNTER(&htim2,0);
break;
/*case 3:
Encoder_TIM= __HAL_TIM_GET_COUNTER(&htim2); TIM3 -> CNT=0;break;
*/
case 4:
Encoder_TIM= -(short)__HAL_TIM_GET_COUNTER(&htim4);
__HAL_TIM_SET_COUNTER(&htim4,0);
break;
default:
Encoder_TIM=0;
}
return Encoder_TIM;
}
加short强制转换,不知道大家有没有理解,返回值是16位数据,而short也表示的是16位的整形类型。
我们电机是不是有正反转之分,是如何计数的呢,每次累加1来计数的,这是正转的情况;那反转呢?同理,是每次减1来计数的,那么我们设置初始化为0,反转一次,就是0xfffe,换成整形类型就是-1,然后是-2,-3这样大家就理解了吧。
short前面加负号,是根据我个人认为的正反转方向定的,这个可以去掉。
Encoder_TIM= -(short)__HAL_TIM_GET_COUNTER(&htim2);
__HAL_TIM_SET_COUNTER(&htim2,0);
Encoder_TIM= -(short)__HAL_TIM_GET_COUNTER(&htim4);
__HAL_TIM_SET_COUNTER(&htim4,0);
short的表示范围(-32768-32767),也就是说当读出来的值为(32767, 32768, 32769,...,65535,65536,65537...)的时候会因为溢出而转换为(32767,-32768,-32767,..., -1, ,0, , 1)就这样不断地循环下去。所以我们的电机反转的时候读出的数就是反方向的速度值。而不必用65535去减去读出的值再加上负号才可以的到方便观察的值。只需要一个强制类型转换就可以了。
https://download.csdn.net/download/Emoeror_Zhang/12280774
有收获?希望老铁们来个三连击,给更多的人看到这篇文章
1、给俺点个赞呗,可以让更多的人看到这篇文章,顺便激励下我,嘻嘻。
<总目录>