foc进阶篇3——对比PLL测速为M法加低通正名相信大部分人在刚开始接触编码器时对电机的转速获取基本都是使用M法测速加低通滤波的方式。但随着工作学习的不断深入会逐渐听到有人说PLL测速更好诸如什么“pll是观测器”、“pll的积分环节会让数据更平滑”等理由。于是自己也开始使用pll测速似乎是比M法低通更好但具体好在哪里又说不清楚。不过今天我就直接告诉大家有些结构的PLL测速是可以和M法加IIR低通完全等效的而有些还不如M法加低通。破除迷信为M法测速加低通滤波正名。注本文所述的PLL仅针对有感的编码器测速并不涉及电角度滤波更不涉及无感的电角度获取。1.经典结构的PLL测速结论由于这种结构的pll传递函数并不是标准的二阶弹簧阻尼的形式因此即使阻尼比设置为1也仍然会过冲。不建议将它用到速度环的反馈中。2. 纯P环节的PLL测速结论不难发现纯P环节的PLL测速其实就相当于一阶低通滤波时间常数为1/kp。3. 仅引出积分项的PLL测速结论这种结构的PLL测速就相当于二阶低通滤波可以通过设置kp、ki来修改ωn和ζ。而对于ζ1的特例也可以将两个一阶低通串联达到相同的效果。4.纯p环节PLL和引出积分项PLL对比1阶跃响应对比2噪声抑制对比结论不难发现在ωn一样的情况下引出积分项的pll更加平滑但也更加滞后其实就是二阶低通对比一阶低通。注以上全部实验都是基于连续模型只是为了给大家一个感性认识。实际跑在单片机上是离散的对于ωn等参数不可以直接等效而是需要换算。5.代码实测1三种PLL的对比首先定义三种pll及函数注意这些pll测的速度是电角速度单位rad/s。实际使用将其转化为机械转速单位RPM#defineDT0.00005f#definePI_F3.14159265359f#defineWN1000.0f#defineZETA1.0fstructPLL_TYPE{float32_tkp,ki;float32_tI;float32_tangle,speed;};/*经典结构PLL*/structPLL_TYPEpll{.kp2.0f*WN*ZETA,.kiWN*WN};/*纯P环节PLL*/structPLL_TYPEpll_p{.kp2.0f*WN*ZETA,};/*引出积分项PLL*/structPLL_TYPEpll_i{.kp2.0f*WN*ZETA,.kiWN*WN};/*经典结构PLL*/voidPLL_Get(structPLL_TYPE*pll,float32_tangleIn){float32_terrorangleIn-pll-angle;if(errorPI_F)error-PI_F*2.0f;elseif(error-PI_F)errorPI_F*2.0f;pll-Ipll-ki*error*DT;pll-speedpll-kp*errorI;pll-anglepll-speed*DT;if(pll-anglePI_F*2.0f)pll-angle-PI_F*2.0f;elseif(pll-angle0.0f)pll-anglePI_F*2.0f;}/*纯P环节PLL*/voidPLL_P_Get(structPLL_TYPE*pll,float32_tangleIn){float32_terrorangleIn-pll-angle;if(errorPI_F)error-PI_F*2.0f;elseif(error-PI_F)errorPI_F*2.0f;pll-speedpll-kp*error;pll-anglepll-speed*DT;if(pll-anglePI_F*2.0f)pll-angle-PI_F*2.0f;elseif(pll-angle0.0f)pll-anglePI_F*2.0f;}/*引出积分项PLL*/voidPLL_I_Get(structPLL_TYPE*pll,float32_tangleIn){float32_terrorangleIn-pll-angle;if(errorPI_F)error-PI_F*2.0f;elseif(error-PI_F)errorPI_F*2.0f;pll-speedpll-ki*error*DT;pll-angle(pll-speedpll-kp*error)*DT;if(pll-anglePI_F*2.0f)pll-angle-PI_F*2.0f;elseif(pll-angle0.0f)pll-anglePI_F*2.0f;}可以看到经典pll虽然相位上比较超前但出现了过冲由前面仿真得知这个过冲很可能比真实速度更高纯P环节pll在相位滞后以及毛刺抑制上属于中间水平引出积分项的pll测速最平滑但也最滞后。这里我使用电流环给iq指令让电机加速。三种pll的执行频率都为20kHz上位机的打印频率为10kHz。2纯P环节PLL和M法加一阶低通对比纯P环节pll和M法加低通测速完全重合了第二张图加了一点Y轴偏置才得以看出。这里pll的kp2000执行频率为20kHzM法的采样频率和滤波频率也为20kHz滤波系数为0.1。不知道有没有人发现了什么。看到这里可能会有人疑惑。为什么我的M法测速加低通滤波不是这个效果其实是采样频率的问题。6.M法加低通不如PLL的原因相信大家在学习速度环的时候大概都听过这样一句话“由于电机的机械时间常数远大于电气时间常数所以速度环的执行频率一般是电流环的十分之一”。这里先不评价这句话但相信大概率会因为听了这句话选择把M法测速的采样频率也拉到电流环执行频率的十分之一。这里将M法测速及滤波的频率降低到2kHz对比20kHz执行频率的纯P环节pll。这里为了保证低通滤波的截止频率与之前接近因此滤波系数改为0.526pll的参数不变。发现没有M法加低通测速的波形变成了阶梯状并且整体相对pll更滞后一些。大家也可以尝试使用2kHz采样的M法配合20kHz的滤波滤波系数为0.1去对比pll测速。我这里已经试过了虽然阶梯状没有了但相比pll还是滞后了。还有这里2kHz采样的M法相比前面20kHz采样的噪声低了很多并且最左边的点连起来的相位相比pll超前可不可以用它来做速度反馈如果你的速度环执行频率也是2k的话那么确实可以。但请注意它的数据更新频率也只有2k如果你后面打算将速度环的执行频率提高到4k、5k甚至10k那么当中有几次的反馈值都是之前的、不变的。这里我更加建议使用20kHz采样的M法测速加十次滑动平均滤波来代替2kHz采样的M法测速这样既可以达到相同的噪声水平又能保证数据的更新频率而且滞后程度也是一样的对比2k采样M法最左边的点连起来的线。结论为什么你感觉M法加低通效果不如pll好就是因为采样频率的问题。你的M法采样频率只有电流环执行频率的十分之一而pll一般和电流环同频正是因为这一点导致M法丢失了一些信息。7.总结1.经典结构的pll测速在面对阶跃信号或斜率较高的信号会产生虚假过冲如果将它作为速度环的反馈可能会引起更大的过冲以及振荡不建议使用。2.纯p结构的pll测速基本可以等效为M法测速加一阶IIR低通滤波。但是要注意这种方法不可以用于角度跟踪滤波因为存在稳态误差角度滞后。还有使用的时候kp要比较大或者说ωn不能太低否则电机加速度大会出现失锁的可能这点与低通滤波不同。3.仅引出积分项的pll测速基本可以等效为M法测速加二阶IIR低通滤波。4.M法的采样频率要尽可能的高不用担心低速时两次采样采不到脉冲增量只要配合低通滤波即可。但要注意编码器分辨率越低低速时的毛刺就越大如果加大滤波则会引入更多延迟和滞后这一点PLL也是一样的。既想要毛刺小又想要延迟滞后少那就要使用更高分辨率的编码器配合较小的滤波或者速度观测器不过这玩意也有局限性。5.虽然pll测速可以等效为M法加低通的形式并且相比M法加低通pll更容易出现失锁的情况如果ωn设置过低但有几个地方是M法加低通不可比拟的。首先它可以在测速的同时给电角度滤波。其次它可以稍加改造变成速度观测器和扰动观测器这一点后面有机会再说。参考资料https://zhuanlan.zhihu.com/p/665627084https://zhuanlan.zhihu.com/p/366750470https://github.com/odriverobotics/ODrive