Part Number:TMS320F28379DOther Parts Discussed in Thread:LAUNCHXL-F28379D
CPU板:LAUNCHXL-F28379D 功率驱动板:自制 无刷电机自带1000线光编,线缆带屏蔽层 28379D的EQep初始化配置的分辨率为4000线,实际配置值为3999
编码器信息采集在AD转换中完成,AD采样和转换周期为20KHZ,即50us一次,速度采集3ms一次
现象
1 电机恒定一个旋转方向旋转,无论怎样改变速度,测量得到的速度值均正常,开启速度闭环PID控制,效果良好
2 开环或闭环模式下,电机做正反转连续切换运行,得到的速度值有异常,且方向切换越快,速度异常越频繁,闭环PID模式下,在速度测量异常点,会出现电机原地剧烈抖动不旋转,电流异常。具体如下截图:
图1
图2
图1中,为了查明错误来源,在第61行处,实时获取寄存器 EQep1Regs.QEPSTS的值,以便判断当前是正转还是反转;代码第62行SpeedLoop.MeasureBuf5用来记录上一次得到的位置计数器值;代码第63行记录当前位置计数器值;64行SpeedLoop.MeasureBuf2获取前后两次位置计数器值的差,用于后续速度计算;65行SpeedLoop.MeasureBuf3也是记录差值,但后续计算不改变其内容;后续68行—–82行,用于计算电机速度;第83行,如果发生速度异常,程序进死循环。
图2中根据SpeedLoop.QEPST记录的结果,可知EQep1Regs.QEPSTS.bit.QDF = 1,是正向旋转,寄存器EQep1Regs.QPOSCNT在正向旋转条件下,其值变化规律就应该是0—1—2—3………3999—-0—–1—–2—–3………….,SpeedLoop.MeasureBuf2的采集值为-4,也就意味着前后两次采样值的差是3995,转换为当前速度,就是19975转/分,但这显然是错误的速度值,因为我的电机供电是给的额定24V,最大占空比下,速度最大也才4000多点。出现该错误速度值的时候,已验证过,该错误并未发生在正向和反向切换的中间点,也就是速度靠近0的附近。
SpeedLoop.MeasureBuf2的采集值为-4,表明SpeedLoop.MeasureBuf1 – SpeedLoop.MeasureBuf5 = -4,也就是当前值小于过去的值。要想出现当前值小于过去值,只能是在位置计数器EQep1Regs.QPOSCNT的值靠近3999附近才可能出现。即便手头的电机在24V条件下,最大占空比下能跑到5000转/分,按我的系统配置,3ms的采集周期,前后两次采集值之差,最大也不过1000左右。
以上是我的分析过程,对应采用过一些方法,均告失败,感觉还是得从源头解决,不知道是我读取寄存器EQep1Regs.QPOSCNT的值,和后续计算速度方法就有问题,还是哪里没对,折腾两天了。另外,也基本可以排除干扰之类的情况,因为固定一个方向旋转,比如正向旋转,然后速度按0—-最大—–0……….这个方式来做闭环或者开环,速度值均未出现异常;同样当正反连续切换速率非常低的时候,大概一秒一次到一秒两次,都正常的。
Yale Li:
user18914063 说:编码器信息采集在AD转换中完成,AD采样和转换周期为20KHZ,即50us一次,速度采集3ms一次
这个意思是说在ADC的中断中、完成对eQEP采集到的光编的数据的处理?ADC是用来采集什么?3ms是怎么来的?
user18914063 说:SpeedLoop.MeasureBuf2的采集值为-4,表明SpeedLoop.MeasureBuf1 – SpeedLoop.MeasureBuf5 = -4,也就是当前值小于过去的值。要想出现当前值小于过去值,只能是在位置计数器EQep1Regs.QPOSCNT的值靠近3999附近才可能出现。
这个未必吧,差值差了-4,或者说有3995这么多,是可能出现在光编的任意位置的。
user18914063 说:即便手头的电机在24V条件下,最大占空比下能跑到5000转/分,按我的系统配置,3ms的采集周期,前后两次采集值之差,最大也不过1000左右。
是的;所以单方向运行是没有问题的。
现在推断下来问题大概率可能就是出在由于要切换运行方向,导致通过eQEP计数值计算的速度不准。建议还是从这个角度再看一下