foc进阶篇------可能比强拖更好的磁编非线性校准
1.磁编码器校准对电流环的影响
由于磁铁安装误差和芯片本身的非线性,会导致磁编求得的电角度出现误差。误差呈周期性波动,这会导致电机电流环全速运行时idiq也出现周期性波动,产生噪音和震动。

我们对磁编进行强拖校准,校准后idq波动变小。如下图:

但是偶然间发现使用无感能让idq的波动更小。如下图:

那么能不能在电机高速转起来的时候使用无感去校准磁编?
2.使用无感校准磁编码器
大致的原理是:去掉所有负载,电机使用电流环全速跑起来后切换无感。稳定后开启校准使能,在编码器转到某个指定原始读数时,将此时的角度误差(无感电角度减去编码器得到的电角度)保存到该读数对应下标的数组,等待数组装满。校准期间千万不要触碰电机,可能有些编码器读数不容易达到,耐心等待多转一会即可,或者适当降低校准表的大小。
下面给一个最基础的伪代码:
c
/*这里假设编码器芯片分辨率为16384*/
uint8_t calEn;
float lutMap[256];
void Calibrate(void)
{
float temp;
if(calEn)
{
/*在编码器原始值为0 64 128...时记录角度误差*/
if(encVal % 64 == 0)
{
if(lutMap[encVal >> 6] == 0)
{
/*计算角度误差*/
temp = sensorlessEAngle - encEAngle;
/*保存角度误差到数组*/
lutMap[encVal >> 6] = temp;
}
}
}
}
实际使用还可以多取几组求平均。校准表制作完成后,将它保存到flash里。用的时候将校准值加到编码器角度上即可,对于中间值可以使用插值法补全。
下面是使用无感校准后的磁编,idq波动几乎和无感一致。

3.磁编码器校准对速度环的影响
这个方法最大的用处不在电流环,而是速度环。速度是由角度微分得到的,如果角度本身存在高频的误差,那么得到的速度会有很多虚假的毛刺波动。虽然可以使用低通滤波滤除,但较大的滤波会让速度反馈严重滞后,导致速度环调不硬。如果强行调硬,速度环会出现严重的过冲和振荡。
而较小的滤波并不能完全滤除速度反馈的虚假波动。如果用它闭环,同样会导致速度环调不硬。如果强行调硬,低速还好,高速电机发出剧烈的噪音和震动。因为在虚假波动出现的瞬间,速度环会给一个反向的力矩尝试"抹平"那个波动,导致电机震动更剧烈。
因此最佳的方法是通过前馈或者说补偿去解决掉速度反馈的虚假波动。
下图是电流环空载全速运行下(约3000转),使用无感补偿前后的编码器速度反馈波形。

下图是速度环中高速运行下(1000转),使用无感补偿前后的速度反馈波形。

在开启补偿后能明显感受到电机的震动和噪音变小。
4.总结
强拖校准只能解决低频(周期为编码器转一圈)的编码器误差,因为它为了过滤掉齿槽转矩的影响,把校准结果通过了平均值滤波,但同时也把高频(周期接近或超过电机电周期)的误差过滤掉了。而无感校准则可以保留高频误差并补偿掉,最终呈现比较好的效果。
当然了,如果有条件肯定还是使用光编校准最好。
5.注意事项
最后也说明一下,这个方法并不适用于所有情况。首先它需要电机不带任何负载,其次它需要一个很平滑的无感作为支持(普通滑模或高频注入可能天生就不适合,需要磁链、龙伯格等)。如果电机无感效果不佳,不比磁编更好,那就不要用了。而且我发现正转校准完,切换反转效果又会变差,可能需要正反转分别校准然后根据转向各自查表。
还有高频的角度误差并不是普遍存在的,我手里有些电机就没有,明明用的是一个型号的磁编芯片,难道是磁铁的问题或者机械问题?如果不存在高频角度误差,那么强拖校准就已经足够。