使用 NXP RT1170 的 QDC 外设与增量编码器测量电机转速

1.概述

2.正交编码器信号与测速方法介绍

3.RT1170 QDC 解码器用于测速的寄存器介绍

4.软件中的测速处理流程

5.测速处理代码

6.测试方法

7.测试结果

8.参考资料



  1. 概述

   在电机控制中,大部分都有速度环控制,电机转子速度的获取可以从绝对值编码器直接读取、测量霍尔编码器每隔 60 °的脉冲信号时间进行计算、测量增量编码器多个脉冲(M 法)或单个脉冲之间(T 法)的时间来计算, 本文主要讲述如何使用 NXP  RT1170 的增强型 QDC 外设和增量编码器测量电机转子速度的方法。

  2. 正交编码器信号与测速方法介绍

      正交编码器输出 A、B、Z 信号,3 个信号都为方波信号,当电机正向旋转时,A 信号超前 B 信号 90 度,反转时 B 信号超前 A 信号 90度,Z 信号为归零信号,转子转一圈产生一瞬间的脉冲信号,主要用于圈数计数或 A、B 信号的脉冲数归零,下图为编码器 A、B 信号示意图,图片来自 RT1170 参考手册。

      速度的测量的可以通过读取编码器的脉冲计数(两次速度环控制周期之间的脉冲数)计算出间隔角度,RT1170 的 QDC 自动捕获两次速度环之间脉冲数的定时器计数,从而知道时间:T = 定时器计数 * (1/定时器频率)。

      当两次速度环之间有多个脉冲时,相当于 M 法测速;当电机速度很快,中间只有一个脉冲计数时,相当于 T 法。



   3. RT1170 QDC 解码器用于测速的寄存器介绍

       RT1170 的 QDC 外设检测  A、B 信号边沿(可开启滤波和反向),判断相位关系,对位置寄存器 UPOS、LPOS 进行加或者减操作,当反向时,寄存器 CTRL2 的 DIR 位给出方向信息。

       在速度环中每次读取 POSD 寄存器时,QDC 自动将保存两次速度环之间的脉冲差值的 POSD 保存到 POSDH,同时清零 POSD,同时将这些脉冲之间所经过脉冲计数由 POSDPER 保存到 POSDPERH 供软件读取。

  LASTEDGE( Last Edge Time Hold Register )对两次脉冲数之间进行计数,主要用于 T 法测速和 0 速检测(当  LASTEDGE  计满溢出时判断为速度为 0 速,因为长时间没有脉冲边沿产生)。

  1.         下图为 QDC 外设信号流程和寄存器框图。
   4. 软件中的测速处理流程

       如图所示,当两次速度环之间有脉冲数时,即 POSDH 不为 0 时,使用脉冲数除以时间的方式进行速度计算,按下图左方处理,如果两次速度环之间有方向变化判定为 0 速(刚好反向的情况)。

       如果两次速度环周期之间没有脉冲,则使用 LASTEDGEH 来进行速度估算,因为电机速度太低,长时间没有脉冲产生,如果电机是匀速的,估算的速度就比较准确的,根据方向使用 Speed = C/M 计算,当 LASTEDGEH 太大时,判定电机停止为 0 速。


   5. 测速处理代码

       QDC 测速代码,其处理和上图中的处理流程一致,软件只需要较少的操作即可计算出速度。 代码如下所示:

       其他初始化代码详见工程文件。

bool_t MCDRV_EncSpeedCalUpdate(enc_block_t *this)
{
int64_t i64Numerator;

s_statusPass = FALSE;

// Read POSDH, POSDPERH and LASTEDGEH
this->ui16Dummy = this->pENC_base->POSD;
this->sSpeed.i16POSDH = this->pENC_base->POSDH;
this->sSpeed.ui16POSDPERH = this->pENC_base->POSDPERH;
this->sSpeed.ui16LASTEDGEH = this->pENC_base->LASTEDGEH;

// POSDH == 0
if(this->sSpeed.i16POSDH != 0)
{
// Shaft is moving during speed measurement interval
this->sSpeed.i16PosDiff = this->sSpeed.i16POSDH;
this->sSpeed.ui16Period = this->sSpeed.ui16POSDPERH;
this->sSpeed.ui16Period_1 = this->sSpeed.ui16Period;

if(this->sSpeed.i16PosDiff > 0)
{
this->sSpeed.i8SpeedSign = 1;
}
else
{
this->sSpeed.i8SpeedSign = -1;
}

if(this->sSpeed.i8SpeedSign == this->sSpeed.i8SpeedSign_1)

{
// Calculate speed
i64Numerator = ((int64_t)(this->sSpeed.i16PosDiff) * this->sSpeed.f32SpeedCalConst); // Q16.0 * Q5.27 = Q21.27
this->sSpeed.f32Speed = (i64Numerator / (uint32_t)(this->sSpeed.ui16Period))<<4; // Q5.27 -> Q1.31
}
else
{
this->sSpeed.f32Speed = 0;
}
this->sSpeed.i8SpeedSign_1 = this->sSpeed.i8SpeedSign;
}
else
{
// Shaft is NOT moving during speed measurement interval
this->sSpeed.ui16Period = this->sSpeed.ui16LASTEDGEH;

if((uint32_t)(this->sSpeed.ui16Period) > 0xF000UL)
{
// Shaft hasn't been moving for a long time
this->sSpeed.f32Speed = 0;
this->sSpeed.i8SpeedSign_1 = this->sSpeed.i8SpeedSign;
}
else
{
// Speed estimation in low speed region
if(this->sSpeed.ui16Period > this->sSpeed.ui16Period_1)
{
if(this->sSpeed.i8SpeedSign > 0)
{
i64Numerator = ((int64_t)(1.0) * this->sSpeed.f32SpeedCalConst);
this->sSpeed.f32Speed = (i64Numerator / (uint32_t)(this->sSpeed.ui16Period))<<4;
}
else
{
i64Numerator = ((int64_t)(-1.0) * this->sSpeed.f32SpeedCalConst);
this->sSpeed.f32Speed = (i64Numerator / (uint32_t)(this->sSpeed.ui16Period))<<4;
}
}
}
}
this->sSpeed.f16SpeedFilt = GDFLIB_FilterIIR1_F16(MLIB_Conv_F16l(this->sSpeed.f32Speed), &this->sSpeed.sENCSpeedFilter);
this->sSpeed.fltSpeed = MLIB_ConvSc_FLTsf(this->sSpeed.f16SpeedFilt, this->sSpeed.fltSpeedFrac16ToAngularCoeff);

return s_statusPass;
}

 

    6.测试方法

       使用其他电机拖动带增量编码器的伺服电机稳定转至 1500 RPM,使用激光测速仪进行测速,伺服电机的增量编码器信号是差分信号,经过功率板将差分信号转换到单端信号,最后连接到 RT1170 开发板 ENC1 对应的 GPIO 口中,如果电机增量编码器 AB 输出信号端信号可直接连接至 RT1170 开发板。

        最后可以在 IAR 中通过 LiveWatch 窗口查看速度变量,检查与用激光测速器测的速度是否一致。


拖动伺服电机转至 1500RPM




信号连接实物图



AB 信号连接原理图

       7. 测试结果
           IAR DEBUG 后,在 IAR live Watch 窗口中查看 Encoder_Measure_SpeedRPM 变量,其值为 1500RPM 左右,说明测速还是比较准确的。



  1. 参考资料
          参考手册: IMXRT1170RM.pdf

      i.MX RT1170 Processor Reference Manual 

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论