编码器是把角位移或直线位移转换成电信号的一种装置。
**绝对式编码器**
绝对式编码器通过对码盘上的各个位置设计特定的编码,可以输出转动轴的绝对位置信息。
绝对式编码器的每一个位置对应一个二进制数,二进制数有每一道线的亮暗表示。例如:10位的绝对式编码器每个位置有10道线,可以表示0-1023共1024个位置。
绝对值编码器为每一个轴的位置提供一个独一无二的编码数字值。绝对编码器由机械位置决定的每个位置是唯一的,它无需记忆和找参考点,也不用一直计数,什么时候需要知道位置,什么时候就去读取它的位置。
**增量式编码器**
增量式编码器也称为正交编码器,是通过两个信号线的脉冲输出来进行数据处理,输出一个脉冲信号就对应于一个增量位移,编码器每转动固定的位移,就会产生一个脉冲信号 。通过读取单位时间脉冲信号的数量,便可以达到测速的效果;通过对脉冲信号的累加,再加上已知编码器的码盘周长(转一圈对应距离) , 便可以达到计算行走距离的效果。
编码器线数:
编码器的线数 ,是说编码器转一圈输出多少个脉冲。如果一个编码器是500线,说明这个编码器转一圈对应的信号线会输出500个脉冲, A B两相转一圈发出的脉冲数一样的,不过存在90°相位差。
(线数越高代表编码器能够反应的位置精度越高)
编码器正反转:**
正转的时候信号线A先输出信号,信号线B后输出 A相超前B相90度 说明是正转
反转的时候信号线B先输出信号,信号线A后输出 B相超前A相90度 说明是反转
(两个信号相位差为90度,称这两个信号为正交)
**
STM32的编码器 模式共有三种:
- 仅在TL1计数(A相)
- 仅在TL2计数(B相)
- 在TL1和TL2都计数(A相和B相都计数)
双相计数: **
1时刻:TI2为低电平,TI1上升沿跳变,计数器向上计数;
2时刻:TI1为高电平,TI2上升沿跳变,计数器仍然向上计数;
3时刻:TI2为高电平,TI1下降沿跳变,计数器仍然向上计数;
4时刻:TI1为低电平,TI2下降沿跳变,计数器仍然向上计数。
一个脉冲信号周期完成4次跳变,精度提高。 (向下计数同理)
注意事项:**
①如果只是测速,不要求方向,那么单片机可随意选择一个信号线,然后定时器边沿触发,检测脉冲计数即可。
②一般是定时器的通道1和2才能作为编码器输入口,对应编码器输出的两相。
③一个定时器做一种工作,如果配置了编码器模式,那么剩下的通道就不能配置其他模式。
④双相计数模式下,读取的计数值需要除4。 (一个脉冲信号对应四次计数)
编程要点:
(1)配置输入的GPIO引脚
(2)配置时基TIM_TimeBaseInitStructure
(3)编码器对应的stm32库函数:
TIM_EncoderInterfaceConfig,它是编码器接口的配置函数。只需要配置该函数,使能TIM,即可实现采集编码器 上面的信息。
void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode, uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity)
①TIMx参数就是使用哪个定时器作为编码器接口的捕捉定时器。
②TIM_EncoderMode参数是模式,是单相计数(仅在TL1计数或仅在TL2计数)还是两相计数(在TL1和TL2都计数)。
③TIM_IC1Polarity和TIM_IC2Polarity参数就是通道1、2的捕捉极性。
(4)TIM_ICStructInit(&TIM_ICInitStructure); //将结构体中的内容缺省输入
TIM_ICInitStructure.TIM_ICFilter = 0;//滤波器值
TIM_ICInit(TIM3, &TIM_ICInitStructure); //将TIM_ICInitStructure中的指定参数初始化TIM
(由于stm32编码器会直接占用整个TIMx定时器通道,而引脚也是固定的TIMx_Ch1和TIM_Ch2,所以不需要配置通道)
各个值的计算:
脉冲数: TIM_GetCounter(TIM3)/4
转速计算:用一秒内输出的脉冲数/编码器线数(转速一圈输出脉冲数)
运动距离计算:输出的总脉冲数 / 编码器线数*编码器齿轮周长
所转角度计算:输出的总脉冲数 / 编码器线数 *360