光电编码器是一种通过光学或者光电子传感器来检测物体位置、速度或者运动方向的装置。它的测速原理基于光电效应和编码技术,通常包含一个光源、光电传感器和旋转或移动的编码盘。
光源: 光电编码器中通常包含一个光源,比如红外线发光二极管。这个光源会发出光束。
编码盘: 编码盘安装在需要测速的旋转轴或者运动部件上。编码盘上有不同的标记,可以是光栅或者脉冲编码,这些标记能够使光束在光电传感器处产生变化。
光电传感器: 光电传感器位于编码盘旁边,用来接收光源发出的光束。当编码盘旋转或者移动时,光束被不同的标记打断或者通过,产生了光电传感器上的变化。
测速原理: 当编码盘旋转或者移动时,光电传感器会检测到光束的变化,这些变化可以转换成电信号。根据标记的密度和光电传感器检测到的信号频率,可以计算出物体的运动速度。
通过测量标记通过或者被打断的频率,光电编码器能够确定物体的速度或者位置变化。这些信号可以被数字处理器处理,进而被转换成可读的速度或者位置数据。
增量型编码器一般安装在电机或其他旋转机构的轴上,在码盘旋转过程中,输出两个信号称为 QEPA与QEPB,两路信号相差 90这就是所谓的正交信号,当电机正转时,脉冲信号A的相位超前脉冲信号 B的相位90此时逻辑电路处理后可形成高电平的方向信号 Dir。当电机反转时,脉冲信号 A的相位滞后脉冲信号 B的相位90°,此时逻辑电路处理后的方向信号 Dir 为低电平。因此根据超前与滞后的关系可以确定电机的转向。其转速辩相的原理如图下所示。
可以利用定时器/计数器配合光电编码器的输出脉冲信号来测量电机的转速具体的测速方法有 M 法、T法和M/T法3种。
M 法又称之为测频法,其测速原理是在规定的检测时间 T 内,对光电编码器输出的脉冲信号计数的测速方法,例如光电编码器是N线的则每旋转一周可以有4N个脉冲,因为两路脉冲的上升沿与下降沿正好是编码器信号4倍频。现在假设检测时间是T计数器的记录的脉冲数是M1,则电机的每分钟的转速为:
M 法测速适用于测量高转速,因为对于给定的光电编码器线数N,测量时间 T条件下,转速越高,计数脉冲 M1 越大,误差也就越小。
T法也称之为测周法,该测速方法是在一个脉冲周期内对时钟信号脉冲进行计数的方法。例如时钟频率为 fclk,计数器记录的脉冲数为M光电编码器是N线的每周输出4N个脉冲,那么电机的每分钟的转速为:
为了减小误差,希望尽可能地记录较多的脉冲数,因此T法测速适用于低速运行的场合。但转速太低,一个编码器输出脉冲的时间太长,时钟脉冲数会超过计数器最大计数值而产生溢出;另外,时间太长也会影响控制的快速性。与M法测速一样,选用线数较多的光电编码器可以提高对电机转速测量的快速性与精度。
M/T法测速是将M法和T法两种方法结合在一起使用在一定的时间范围内,同时对光电编码器输出的脉冲个数 M和M进行计数则电机每分钟的转速为:
实际工作时,在固定的 T 时间内对光电编码器的脉冲计数在第一个光电编码器上升沿定时器开始定时,同时开始记录光电编码器和时钟脉冲数,定时器定时 T 时间到,对光电编码器的脉冲停止计数,而在下一个光电编码器的上升沿到来时,时钟脉冲才停止记录。采用 M/T 法既具有 M 法测速的高速优点,又具有T法测速的低速的优点,能够覆盖较广的转速范围,测量的精度也较高,在电机的控制中有着十分广泛的应用。
其结构如下图所示:
????????QEP模块还包括了一个32位定时器QUTMR,由SYSCLKOUT提供时钟,可产生用于速度计算的周期性中断,当定时器QUTMR与周期寄存器QUPRD匹配时,单位超时中断QFLG被置位;也就是可以通过这个时钟定期计算转速;
????????在一个单位事件超时时,eQEP可以配置为锁存位置计数器、捕捉定时器和捕捉周期值,从而用这些锁存的值来计算电机的转速,定时器结构图;
????????其模块如下图所示:
它的参数设置界面如下图所示;
(1)Module;选择模块,可供选择的有三个,一个是eQEP1、eQEP2、eQEP3;
(2)Position count Mode :位置计算模式,一般选择Quadrature-count 正交编码模式;
(3)Positive rotation: 正转方向,一般选择时钟累加的方向为正转方向,如果选择顺时针,则执行正交计数操作而不交换馈送到QDU的正交时钟输入。如果选择逆时针,则通过交换馈送到QDU的正交时钟输入来执行反向计数。正交解码器反转计数方向。选择clockwise即可;
(4)invert input QEPXA polarity: 是否翻转输入的电平,选择不翻转即可;(采样时间建议设置为-1)
(1)Output position,选择是否输出位置计数器;
(2)最大计数器值;推荐2^32 -1 或者 2^16 -1
(3)Output latch position counter on index event:当启用此选项时,在选通引脚上发生事件时,位置计数器QPOSCNT锁存到QPOSLAT。
(4)配置eQEP位置计数器以锁定选定的索引事件。选择为上升沿;
(1)是否使能eQEP的捕获功能;eQEP外围设备包括集成的边缘捕获单元,用于测量单元位置事件之间的经过时间。此选项启用边缘捕捉单元。
(2)eQEP时钟频率设置:eQEP捕获计时器从预先标定的SYSCLKOUT运行。捕获计时器时钟频率是SYSCLKOUT的频率除以您为此参数选择的值。Unit position event prescaler :单元位置事件的定时是通过预缩放正交时钟(QCLK)来确定的。QCLK除以您为此参数选择的预报警值。
(3)捕获时钟和位置信息的时间:单元超时时(=unit time period),位置计数器、捕获定时器和捕获周期值被锁存到QPOSLAT、QCTMRLAT和QCPRDLAT寄存器中。
(4)设置单元周期;
其他选项卡的设置默认就行;
硬件接口:
设置硬件环境,查看对应的GPIO管脚号;
EQEP1A : GPIO50
EQEP1B:? GPIO51
EQEP1S: GPIO52
EQEP1I:? GPIO53
设置管脚如下图所示:
????????仿真配置实际上是为了解决几个应用过程中的关键问题:这个模块放在哪里、QEP输出计数信号如何转换为算法所需的真实角度与速度信息、
????????具体是放在ADC中断中,还是放在外部一直执行,这个没有经验,也没有一个具体的参照,这里先尝试放ADC中断里面尝试一下,通过串口输出数据;我们有个问题需要探究,
放置在ADC中断中,是否是按照中断周期调用QEP模块?
? ? ? ? 这个问题有两个可能,第一个是代码生成中QEP模块是按照中断周期调用的,那么一个中断周期QEP输出值只能+1,中断周期影响QEP模块的内部计数;第二个是代码生成中QEP模块是一种外设,放置任何位置都只是提取QEP输出计数器的周期不同,不影响它自己的内部计数;
??????按照一般的开关频率10k来设置,一个中断周期是100us,2500线增量式编码器,旋转一圈计数值增加如果是2500*4 = 10000,则是第二个可能。手动转动电机10圈,观察编码器计数器增加值;CCS观测窗口的结果如下图所示:
? ? ? ? 可以看到这里的增加值基本等于100000等于10圈对应的计数值;即可验证代码生成中QEP模块是一种外设,放置任何位置都只是提取QEP输出计数器的周期不同,不影响它自己的内部计数。
????????按照目前的2500线编码器来进行转换,电机极对数为5,电机机械转一圈产生10000个脉冲,CCS的实验结果如下图所示,转动10圈所产生的脉冲总数位100000个(这个是手动转的所以不太准)。
? ? ? ? 对其信号进行处理,将其转化为电机转速与用于坐标变换的电角度;
????????首先是电角度,将编码器反馈的脉冲转化为坐标变换用的电角度,对于已有的电机,电机极对数为5,电机编码器为2500线,则10000脉冲为1个机械旋转周期,5个电旋转周期;也就是
????????theta_e = (pulse_num / 10000)*2*pi*5 = pulse_num*0.0031415926
? ? ? ? 然后是电机转速,还是10000个脉冲代表一个机械周期,即代表1转,那么转换成转每秒就是:
? ? ? ? speed = (pulse_number_new - pulse_number_old)/10000/delta_Ts
????????转换为转每分就是:
????????speed = 60*(pulse_number_new - pulse_number_old)/10000/delta_Ts
? ? ? ? 假如两次角度采样之间相隔时间为中断执行时间即 100us = 1e-4s
? ? ? ? speed = 60*(pulse_number_new - pulse_number_old)
? ? ? ? 在程序中撰写代码,测试效果;
Encoder_cnt_now = Encoder_cnt;
theta_act = Encoder_cnt_now * 0.0031415926;
speed = (Encoder_cnt_now - Encoder_cnt_old)/4/Encoder_line/Tsc*60;
Encoder_cnt_old = Encoder_cnt_now;
dis_iq_act = speed;
dis_id_act = theta_act;
这样勉强能测量速度,但是测量的效果非常不好,如下图所示,非常多的杂波;角度倒是没有问题;主要需要对速度的计算进行优化
参照simulink官方的例子,这个地方需要对速度进行一个低通滤波;
低通滤波器的写法参照这篇文章;
数字滤波器的实现——低通滤波器再探究_数字低通滤波-CSDN博客
设置一个截止频率为100rad/s的低通滤波器;代码为:
speed_now = (Encoder_cnt_now - Encoder_cnt_old)/4/Encoder_line/Tsc*60;
speed_filter = speed_old*0.99 + speed_now*0.01;
speed_old = speed_filter;
测试结果,滤波滞后的效果;这个速度就很好了;
上速度环控制,速度环控制位600rpm、900rpm、1500、2500、3000rpm,测试波形如下,均可实现功能;加减速都可以实现;
后续更新速度环性能优化章节;
附录:关键寄存器截图