定时器编码器模式: Timer -mode
Cubemx配置项:
定时器编码模式选择:
Encode:
-
mode:
-
TI1: 通道1上升沿使计数器+1
-
TI2: 通道2上升沿使计数器+1
-
TI1 and TI2: 1 和 2 都会+1
-
EX:
获取 编码器正反转数值 数值demo:
int Read_Speed(TIM_HandleTypeDef *htim)
{
int temp;
/*获取计数值*/
temp=(short)__HAL_TIM_GetCounter(htim);
/*清0计数寄存器*/
__HAL_TIM_SetCounter(htim,0);
return temp;
}
使用 short 做强制类型转换:正反转问题
STM32的正交解码使用的是一个**16bit寄存器**储存解码值,当正转时数字上升,反转时下降,当低于0时会向下溢出变为0xFFFF。
0x0000-1=0xFFFF,同样是0xFFFF,对于32位来说,最高位为0,表示为正数,对于16位来说最高位为1,表示为负数,且刚好为-1
idea :
16 的无符号寄存器转换为 *short* 类型的16位有符号类型
EX:
把寄存器的值读出来了之后,转换成了short型(2字节,32位系统下),范围为(-32768-32767),此时当我们把计数器的初始值设置为0之后,如果出现反转,它就会从0开始向下计数(0,65535,65534,…)但是经过强制类型转换之后就变成了(0,-1,-2,…)。
short的表示范围(-32768-32767),也就是说当读出来的值为(32767, 32768, 32769,…,65535,65536,65537…)的时候会因为溢出而转换为(32767,-32768,-32767,…, -1, ,0, , 1)就这样不断地循环下去。所以我们的电机反转的时候读出的数就是反方向的速度值。而不必用65535去减去读出的值再加上负号才可以的到方便观察的值。只需要一个强制类型转换就可以了。