使用编码器可以节约软件资源,编码器常见的用法:使用PWM驱动电机,再使用编码器测量电机速度
编码器简介
encoder interface 编码器接口
编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置,旋转方向和旋转速度
简单来说就是,接收正交信号,自动执行CNT的自增或自减
每个高级定时器和通用定时器都拥有一个编码器接口,比如STM32F103C8T6这个型号,有TIM1,TIM2,TIM3,TIM4这四个定时器,所以只有四个编码器
编码器引脚借用了输入捕获的通道CH1和通道CH2
那么什么是正交信号?
正交编码器一般可以测量位置,或者带有方向的速度值,一般有两个信号输出引脚,一个是A相,另一个是B向,通过接收AB相的相位差来判断方向,每来一个上升沿信号,CNT记次,达到方向计数的效果
编码器在定时器里的结构图
通过输入捕获的通道CH1和CH2,到滤波器极性选择,再分别从TI1FP1和TI2FP2接入编码器的A相和B相,通过分频器,再到CNT,执行计数
为了方便写程序,再看一个方便理解的结构图
输入捕获的前两个通道,通过GPIO口接入编码器的A,B相,通过滤波器和边沿检测极性选择产生TI1FP1和TI2FP2,桐通向编码器接口,编码器接口通过预分频器控制CNT计数器的时钟,同时,编码器接口还根据编码器的旋转方向,控制CNT的计数方向,当然ARR也有效,一般设置为65535,最大量程,利用补码的特性更容易得到负数
再来了解一下工作模式
一般我们都用TI1和TI2都计数,因为这个计数模式精度高一些,能滤去毛刺信号,前面两个模式就不行,所以我们默认用第三个模式来写代码,当然特殊情况除外
比如我画圈的位置,遇到毛刺信号后,电平按照表里的规则,计数器就来回跳变,达到中和计数器的作用
最后来写程序,按照刚才的结构图,把那些结构打通就行
第一步:RCC开启时钟,开启GPIO和定时器的时钟,假设时钟选择TIM3
第二:配置GPIO口,参考引脚定义表,TIM3的CH1和CH2为PA6和PA7
第三:配置时基单元
第四:配置输入捕获单元,只有滤波器和极性
有两个通道,第二个通道直接在结构体下赋值就行
第五:配置编码器接口模式
TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);
最后,启动定时器
编码器配置好了,想测试有没有配置成功,可以外接一个OLED显示屏来显示计数,初始化OLED
在显示函数里添加Encoder_Get函数就OK了