传统型编码器测速方案
编码器,经常被用来测量速度或者显示电机位置,大致分为绝对值式编码器和增量式编码器,顾名思义,相对应的是产生增量或者绝对信号。增量信号不表示特定位置,只表示位置已经更改;绝对信号是绝对值式编码器对应每个位置使用不同的“字”,所以绝对值编码器即可以显示所处的位置,也可以计算相对应的速度。增量编码器,一般用于测量速度居多。价格方面,一般来说增量编码器也低于绝对值式编码器。
此处,我们以增量编码器为例进行相关说明。
原理:每转过单位的角度就发出一个脉冲信号(或者是正弦信号),通常为对外输出为A相、B相、Z相(有些特殊编码器会输出6相信号:A+、A-、B+、B-、Z+、Z-,正负信号为互补相反输出)。A相和B相其相位相差一个相位,一般为1/4周期(或者90度)。A相和B相的先后顺序决定编码器是正转或者反转。
A相信号在前,表示右旋转(从轴侧看)
B相信号在前,表示左旋转(从轴侧看)
有的编码器还有一个Z相,它表示的是0位,即检测到0刻线即输出高电平,也就是给增量式编码器一个寻零的功能。
编码器内部电路输出分集电极开路输出、互补输出、电压输出、驱动器输出
编码器的输入电压范围一般都比较大,从5V到24V不等,此处假设输入电压为12V,stm32单片机的IO口一般为3V,5 V tolerant。编码器选择集电极开路输出,上拉电阻到3V(或者可以配置GPIO管脚为上拉模式,省去外部上拉),或者使用互补输出,调整输入电压为5V或调整输出电压幅值。本试验以集电极开路输出为例。
1.2.2软件实现方式(本实验以野火指南者开发板stm32f103VET6为例)
STM32的定时器TIM1,2,3,5,8中有专门的编码器模式,省去了我们读脉冲和计数的操作。而且配置全面。
可以配置:
- 计数方式(counter mode):即向上计数还是向下计数,不过使用编码器都是记录转的角度,读取计数器从0开始的计数,所以一般来说都是向上计数。
- 编码器(encoder mode):Tl1是只检测上升沿,Tl2只检测下降沿。Tl1 and Tl2是上下沿都检测,那么脉冲数将是只检测一个沿的两倍。
本例以编码器模式为例来测试。
具体配置如下:
下载调试为SW模式。
时钟选择外部高速晶体震荡时钟。
使能TIM8为Encoder Mode,显示通道1和通道2为灰色,表示这两个通道已经被使用为编码器模式了。
具体配置如下,重载值16bits,即计数器数到多少就清零,设置为0xffff ,Encoder Mode选择Encoder Mode TI1 and TI2,表示在A相和B相的上升和下降沿都会计数,故最终计算的数据应该是计数值除以4。输入滤波选择15,为最大值,滤除干扰信号。
GPIO口模式选择为输入模式,Pull-up上拉,此处主要是为了兼容开漏模式的编码器输出(或者此处不配置为上拉模式,硬件上做上拉处理)配置如下
增开TIM6,配置如下,系统主频为72M的配置,并使能中断。
配置串口1用于打印输出数据。配置如下:
系统72M时钟配置如下。
此处以TS=1秒定时为例,每隔1秒清除编码器所计数的数据。
CaptureNumber为4倍的编码器的PWM数值。主程序串口输出方向和上1秒计数值。
Stm32f103的Counter Period为16bits数据,最大为0xffff。在不清除CNT情况下,
左转和右转编码器,计数方式不同。
左转 从0x0000~0xffff,
右转 从0xffff~0x0000
编码器一圈划分600格。
故:编码器最快速度为TS情况下把计数器填满。其速度为大:2^152PI /(6004TS)
最小速度为,当编码器在TS时间内,最小要跑1个格:2PI/(600TS)
当TS为1S,速度范围为:0.0104rad/S~81.64rad/S
按照目前拉丝速度换算成角速度为15.33 rad/S,满足要求
如要测试更快速度,则把TS,即取样时间缩小。
硬件连接:
A相:接PC6
B相:接PC7
串口使用串口PA9、PA10
备注:笔者是做硬件设计的,由于工作需求才研究编码器的使用。文中难免有不合理的地方,还请见谅,且示例代码也仅仅跑了这一个任务,实际的应用比这个复杂的多,笔者也不懂更深入的编码。