之前在开发过程中遇到一个情况,就是电机的控制控制效率特别低,而且电机的实际功率也达不到额定功率。之所以会出现上面的这些情况是因为这几个因素在做怪:
1、电角度滞后了
2、电机控制生效的延后了
(1)电机控制效率问题:
到底是如何发现电机的控制效率低下的呢?其实是通过Vd、Vq的反馈值来查看电机的控制效率的。
我们只讨论电机的系统处于稳态下,不讨论电流环的动态调节过程,电机的反电动势基本上由转速和磁链绝对。也就是电机通过PID控制出来的Ud、Uq和电压前馈计算出来的值越接近效果就越好。
在电机的控制效率低下的情况下,一般表示为Vd都比较大,所以正常情况下Vq越大,Vd越小的情况下控制效果越好。
(2)电角度为什么会滞后
首先就是FOC的电流环的运算是需要获取到电机的电角度的,但是在FOC运算之前,获取电角度的时候是无法立即得到电角度的,芯片与磁编码器直接的通讯需要花费时间,磁编码器保存的电角度数据肯定也是有一定的延时的。因为这两个原因导致实际使用的过程中,电角度一般是获取的是上个周期(或者半个周期)的电角度。
但是在电机高速转动的过程中 ,电角度的滞后也会跟随着转速越高,滞后的电角度越大。
如果FOC运算的电角度不做补偿而直接使用的话,那么FOC运算的电角度都不知道滞后了多少!那么电机的控制效率自然就会很低。
所以正常情况下,我们需要根据转速去补偿这个电角度。这个方式比较简单和实现,根据电角度的获取情况不同去补偿电角度。一般情况是需要至少补偿一个Ts(电周期),补偿这个因为转速而导致的角度滞后。
(3)电机的额定功率问题
为什么电机达不到额定功率呢?如果上面的电角度补偿已经做了,电机的控制效率的确提高了,但是发现电机只能从原来的72%的功率提升到接近85%~90%的额定功率。
到底是那里FOC的控制,其实根本原因是电机的控制生效延后了,很多的做FOC控制的新手都会犯的一个错误就是,都喜欢在三角载波的波谷进行FOC运算(波谷是下MOS导通的时刻)。在下一个波谷的时候生效上一个FOC的运算。
如果电角度的获取在波峰这里获取,在波谷进行运算,那么电角度的滞后值延时0.5Ts。参与了FOC运算后再下一个Ts生效,那么延时又有了1个Ts。总的延时大概在1.5Ts,这个1.5个Ts延时生效是怎么来的。
如果想要让电机的控制达到电机的额定功率,这个1.5Ts延时必须得解决,不然即使补偿了因为电机的转速而带来的延时,也无法提升电机的功率。
一般情况下有人会想到使用影子寄存器来解决,这个电机不是因为影子寄存器的存在才会在下一个周期的更新中断里面去更新吗?如果我让他立即更新是不是就可以消除了1.5Ts带来的影响的。恭喜你找到新手最容易踩坑的解决办法。
其实这个1延时是无法解决了,我们最多就是降低这个延时到0.75Ts。减低这个延时的办法其实就是让FOC的更新中断变成三角载波的波峰和波谷都进行更新中断,让这个FOC运算只延时0.5Ts生效。然后提高FOC的运算频率,FOC电流环的运算在波谷中进行,电压环的运算在波峰波谷都进行。如果电流环的频率是20Khz,那么电压环的频率就是40Khz。
其次就是使用DMA循环模式去不断的触发芯片与编码器的获取频率,提高这个电角度的获取频率让其小于0.25Ts。
下面将演示STM32H7的高级定时器配置:
高级定时器的模式使用中心对齐模式3,因为会在波峰和波谷都触发更新中断,在波谷进行电流环运算、在波峰的时候进行电压环运算。
关于SPI/I2C使用DMA循环模式通讯获取电角度配置我这里就不更新了,请自行查资料解决。中间可能想要屏蔽DMA相关的中断,不然DMA的中断会影响定时器相关中断。