1. 为什么要有FOC算法
先看看从有刷电机到无刷电机的简单介绍,如下图1,通电螺线圈会产生磁场,这个磁场会产生N级和S级,然后这个电磁铁就可以吸引永磁体,S级吸引N级,N级吸引S级,通俗的来说,电机的原理就是固定其中一个来让另一个旋转,固定永磁体,让电磁铁旋转或者固定电磁铁,让永磁体旋转,转的那个东西叫转子,不转的那个东西叫定子,不管哪种情况都需要使电磁铁的磁极周期性的翻转,这样就会使产生的磁场方向也翻转,周而复始电机就诞生了,具体的物理图以及更深层次的东西就不在这里说了。
图1 电磁铁驱动永磁体
如果永磁体做定子,电磁铁做转子,因为电磁铁需要连接导线,所以要让电磁铁旋转的话必须得解决导线的问题,同时还能让电流反向,如下图2,这个电刷起到了导线的作用,同时由于转子的结构特点,随着转子的旋转,作为转子的电磁铁产生的磁场方向也在变化,由于这个电刷的存在,所以这中电机叫做直流有刷电机。所以这种电机被称为有刷电机,
图2 直流有刷电机
如果永磁体做转子,电磁铁做定子,如下图3,那就要使得施加在电磁铁上的电压遵循一定的规律,从而产生周期变化的磁场来驱动作为转子的永磁体转动,产生符合条件的电压的算法之一就是FOC算法。
图2 直流无刷电机
具体的转动原理去参考网上的其他资料,我这里写的太粗糙了。
2. FOC基本原理
图3 FOC算法流程图
FOC算法的简要流程就是上图这样的,要想控制电机旋转就需要给电机输入旋转的参数,就是电机的转矩,然后通过两个变换来转换为电机的三相输入信号,可以是输入的电压,也可以是输入的电流,称为相电压和相电流,相电压等于相电流乘以相电阻,所以二者是完全的正比例关系,可以相互转换,后面所有的公式变换对于这个电流和电压都是完全相同的,公式推导时使用电流,考虑物理意义时根据情况选择,所以实际的情况是一个反着来的过程,要想确定输入给电机的信号就需要根据输入的三路信号反推出输入给它的信号,然后由这个信号进一步推出应该输入什么样的转矩,所以核心就是这两个变换,下面开始介绍这两个变换。
2.1 克拉克变换
2.1.1 克拉克变换的推导
根据上面的图2可以知道要想实现无刷电机的转动控制需要确定三路的输入电流,也就是无刷电机的三相电控制,要表达每一路的电压或者电流需要三个方程,而无刷电机定子有三个绕组(即使不是三个也可以简化为三个),每个绕组发出一个相电压。由于这三个绕组在位置上等分了一个圆周,即彼此相差 2 π / 3 2\pi/3 2π/3,导致三相电压的幅度变化不一致,而是存在一个延时,这个延时是旋转1/3圆周的时间,也就是说三相电相互之间的相位差相差 2 π / 3 2\pi/3 2π/3,从物理学的角度来看,整个系统的自由度就是2,所以方程就可以简化为2个,而电机转动的时候均匀的,所以三相电流之间的幅值和频率是相同的,所以假设三相电流的定义如下:
{ i a = i m a x c o s ( w t ) i b = i m a x c o s ( w t + 2 π 3 ) i c = i m a x c o s ( w t − 2 π 3 ) \begin{cases} i_a = i_{max}cos(wt)\\ i_b = i_{max}cos(wt+\frac{2\pi}{3}) \\ i_c = i_{max}cos(wt-\frac{2\pi}{3}) \end{cases} ⎩ ⎨ ⎧ia=imaxcos(wt)ib=imaxcos(wt+32π)ic=imaxcos(wt−32π)
在电机定子上建立实轴平行于 i a i_a ia的复数坐标系, i a , i b , i c i_a,i_b,i_c ia,ib,ic三者夹角为 2 π 3 \frac{2\pi}{3} 32π, i a i_a ia没有变化, i b i_b ib变为 i b e 2 π j 3 i_be^{\frac{2\pi j}{3}} ibe32πj, i c i_c ic变为 i c e − 2 π j 3 i_ce^{\frac{-2\pi j}{3}} ice3−2πj(Tips:对一个复数乘以 e j θ e^{j\theta} ejθ表示将这个复数表示的向量旋转 θ \theta θ度, θ \theta θ为正表示逆时针旋转, θ \theta θ为负表示顺时针旋转),将三者分别投影到实轴( α \alpha α轴)和虚轴( β \beta β轴)以后并相加可以得到下面的结果:
{ i α = i a + i b cos ( 2 π 3 ) + i c cos ( − 2 π 3 ) = i a − 1 2 ( i b + i c ) i β = i b sin ( 2 π 3 ) + i c sin ( − 2 π 3 ) = 3 2 ( i b − i c ) \begin{cases} i_\alpha = i_a + i_b \cos\left(\frac{2\pi}{3}\right) + i_c \cos\left(-\frac{2\pi}{3}\right) = i_a - \frac{1}{2}(i_b + i_c) \\ i_\beta = i_b \sin\left(\frac{2\pi}{3}\right) + i_c \sin\left(-\frac{2\pi}{3}\right) = \frac{\sqrt{3}}{2}(i_b - i_c) \end{cases} {iα=ia+ibcos(32π)+iccos(−32π)=ia−21(ib+ic)iβ=ibsin(32π)+icsin(−32π)=23(ib−ic)
用矩阵的形式写出来就是下面这样:
[ i α i β ] = [ 1 − 1 2 − 1 2 0 3 2 − 3 2 ] [ i a i b i c ] \begin{bmatrix} i_\alpha \\ i_\beta \end{bmatrix} = \begin{bmatrix} 1 & -\frac{1}{2} & -\frac{1}{2} \\ 0 & \frac{\sqrt{3}}{2} & -\frac{\sqrt{3}}{2} \end{bmatrix} \begin{bmatrix} i_a \\ i_b \\ i_c \end{bmatrix} [iαiβ]=[10−2123−21−23] iaibic
这个变换就叫克拉克变换,所以克拉克变换的数学本质就是将三个复数向量合并成为一个,实部和虚部分开运算的转换矩阵就是克拉克变换,物理本质就是将三相的电流或电压降维变成二维,转换前后的结果都是随时间变化的。
2.1.2 等幅值克拉克变换
将前面的三路电流相加并化简可得:
i Σ = i a + i b + i c = 3 2 i m a x e − j w t i_{\Sigma} = i_a+i_b+i_c = \frac{3}{2}i_{max}e^{-jwt} iΣ=ia+ib+ic=23imaxe−jwt
可以看出克拉克变换前后的电流幅值变大了,成了原来的 3 2 \frac32 23倍,为了方便处理,需要让 i a i_a ia和 i α i_\alpha iα在变换前后相同,所以 i m a x i_{max} imax要变为原来的 2 3 \frac23 32, i m a x i_{max} imax变了意味着三路电流都需要变为原来的 2 3 \frac23 32,所以等幅值的克拉克变换形式就是下面这样,多了个系数 2 3 \frac23 32。
[ i α i β ] = 2 3 [ 1 − 1 2 − 1 2 0 3 2 − 3 2 ] [ i a i b i c ] \begin{bmatrix} i_\alpha \\ i_\beta \end{bmatrix} = \frac23\begin{bmatrix} 1 & -\frac{1}{2} & -\frac{1}{2} \\ 0 & \frac{\sqrt{3}}{2} & -\frac{\sqrt{3}}{2} \end{bmatrix} \begin{bmatrix} i_a \\ i_b \\ i_c \end{bmatrix} [iαiβ]=32[10−2123−21−23] iaibic
把基尔霍夫定律代入等式右边就可以进一步化简等幅值克拉克变换:
[ i α i β ] = [ 1 0 1 3 2 3 ] [ i a i b ] \begin{bmatrix} i_\alpha \\ i_\beta \end{bmatrix} = \begin{bmatrix} 1 & 0 \\ \frac{1}{\sqrt{3}} & \frac{2}{\sqrt{3}} \end{bmatrix} \begin{bmatrix} i_a \\ i_b \end{bmatrix} [iαiβ]=[131032][iaib]
这个系数矩阵的行列式值是 2 3 \frac{2}{\sqrt{3}} 32,所以这是一个满秩矩阵,所以这个系数矩阵的逆矩阵就是克拉克逆变换矩阵,完整的克拉克逆变换如下:
[ i a i b ] = [ 1 0 − 1 2 3 2 ] [ i α i β ] \begin{bmatrix} i_a \\ i_b \end{bmatrix} =\begin{bmatrix} 1 & 0 \\ -\frac{1}{2} & \frac{\sqrt{3}}{2} \end{bmatrix} \begin{bmatrix} i_\alpha \\ i_\beta \end{bmatrix} [iaib]=[1−21023][iαiβ]
i c i_c ic的计算可以通过 i a i_a ia, i b i_b ib和基尔霍夫电流定律得到。
2.2 帕克变换
正如前面克拉克变换结束的时候所说,克拉克变换前后的电压和电流都是随着时间变化的,我们要想控制电机必须在合适的时间给合适的电压,对于高频变化的信号很显然是很不方便的,甚至是不现实的,所以我们需要想办法把我们的控制参数中的时间给去掉,这样对于后续处理就会方便很多,在高中物理学过正弦交流电的发电原理,发电机发出的正弦交流电 U = A sin ( w t + φ ) U=A\sin(wt+\varphi) U=Asin(wt+φ)的角频率 w w w和发电机转子的角速度是正比例的,比例系数是极对数除以2,所以在这里我们也可以合理的猜测对于极对数为1的电机转动的角速度与正弦电压的角频率是相同的,同时考虑到角速度的公式 w = d θ d t w=\frac{\mathrm{d}\theta}{\mathrm{d}t} w=dtdθ,可以在转子上建立局地坐标系, d \mathrm{d} d轴方向与转子内磁场方向重合,纵坐标 q \mathrm{q} q轴垂直于 d \mathrm{d} d轴,符合右手螺旋定则,如下图所示,克拉克变换的前后坐标系是绝对坐标系,也就是说固定在转子上的这个坐标系是相对于绝对坐标系旋转的。
当电机转过的角度为 θ \theta θ的时候,克拉克逆变换后得到是一个复数 i α β = i m a x e − j w t i_{\alpha\beta}=i_{max}e^{-jwt} iαβ=imaxe−jwt,这个复数在转子坐标系下的极角应该比原本的定子坐标系的极角小 θ \theta θ,所以转子坐标系的极角应该是定子坐标系的极角减去 θ \theta θ,所以 i d q = i m a x e − j ( w t + θ ) i_{\mathrm{d}\mathrm{q}}=i_{max}e^{-j(wt+\theta)} idq=imaxe−j(wt+θ),将他们分别在实轴和虚轴展开可得:
{ i α = i m a x c o s ( w t ) i β = − i m a x s i n ( w t ) i d = i m a x c o s ( w t + θ ) i q = − i m a x s i n ( w t + θ ) \begin{cases} i_\alpha =i_{max}cos(wt) \\ i_\beta = -i_{max}sin(wt)\\ i_\mathrm{d} =i_{max}cos(wt+\theta) \\ i_\mathrm{q}= -i_{max}sin(wt+\theta) \end{cases} ⎩ ⎨ ⎧iα=imaxcos(wt)iβ=−imaxsin(wt)id=imaxcos(wt+θ)iq=−imaxsin(wt+θ)
然后利用余弦的和角公式将后两个式子展开,将前两个代入就可以得到如下变换(已转换为矩阵形式):
[ i d i q ] = [ c o s θ s i n θ − s i n θ c o s θ ] [ i α i β ] \begin{bmatrix} i_\mathrm{d} \\ i_\mathrm{q} \end{bmatrix} =\begin{bmatrix} \mathrm{cos}\theta & \mathrm{sin}\theta \\ -\mathrm{sin}\theta & \mathrm{cos}\theta \end{bmatrix} \begin{bmatrix} i_\alpha \\ i_\beta \end{bmatrix} [idiq]=[cosθ−sinθsinθcosθ][iαiβ]
这个矩阵的行列式的值等于1,所以这是一个全等变换,(说句题外话,全等变换有对称,平移和旋转,这里就是旋转,这个转换矩阵就叫做帕克变换,实际上这个矩阵在数学,物理和工程领域的应用数不胜数,遍地都是它的例子),可以注意到帕克变换后的电流分量一个平行于转子转动方向 q \mathrm{q} q,一个平行于转子转动方向 d \mathrm{d} d,这样问题就简单很多了。 θ \theta θ可以通过编码器实时测量得到,这样我们通过控制 i q i_{\mathrm{q}} iq和 i d i_{\mathrm{d}} id就可以控制定子产生的磁场。安培力表示通电导线在磁场的受力情况,表达式是 F = B I L s i n θ F=BILsin\theta F=BILsinθ, θ \theta θ是电流和磁场的夹角,所以 θ = π 2 \theta=\frac{\pi}{2} θ=2π的时候导线受力最大,在这里就是转子提供的转矩最大,所以一般设置 i d = 0 i_{\mathrm{d}}=0 id=0,只需要设置 i q i_{\mathrm{q}} iq就可以决定电机三相电流的大小,所以我们实际应用需要的是帕克逆变换,根据 i q i_{\mathrm{q}} iq和 i d i_{\mathrm{d}} id来计算 i α i_{\mathrm{\alpha}} iα和 i β i_{\mathrm{\beta}} iβ,帕克逆变换如下:
[ i α i β ] = [ c o s θ − s i n θ s i n θ c o s θ ] [ i d i q ] \begin{bmatrix} i_\alpha \\ i_\beta \end{bmatrix} =\begin{bmatrix} \mathrm{cos}\theta & -\mathrm{sin}\theta \\ \mathrm{sin}\theta & \mathrm{cos}\theta \end{bmatrix} \begin{bmatrix} i_\mathrm{d} \\ i_\mathrm{q} \end{bmatrix} [iαiβ]=[cosθsinθ−sinθcosθ][idiq]
2.3 FOC算法基本原理总结
所谓FOC的过程,就是输入需求的电机力矩,最后得到对应的真实世界电机输出力矩的过程,如下图所示。而其中最核心的数学过程,就是帕克逆变换和克拉克逆变换,而这两个变换的数学公式就是下图中框图上面的公式,其中帕克变换可以对用户输入的 i q i_{q} iq进行变换,根据电角度算出 i α i_\alpha iα和 i β i_\beta iβ,接着,通过克拉克逆变换,求出三相电流 i a , i b , i c i_a, i_b, i_c ia,ib,ic,最后 i a , i b , i c i_a, i_b, i_c ia,ib,ic能够用作控制指令输入到电机控制器硬件中进行电机的控制。
在通过 i q i_q iq得到 i a , i b , i c i_a, i_b, i_c ia,ib,ic让电机顺利转起来以后还需要进行调节,经过这一系列的过程以后电机的实际工作情况是否和我们预期的一样是不知道的,所以需要对电机的电流,速度和位置数据进行采集,然后通过PID控制将预设值对实际值进行动态调节,让电机的实际运动与预期相同。
3. FOC闭环控制
下式是PID算法的基本表达式,也是FOC闭环控制的理论基础
u ( t ) = k p e ( t ) + k i ∫ 0 t e ( τ ) d τ + k d d e ( t ) d t u(t) = k_pe(t)+k_i\int_{0}^{t}e(\tau)\mathrm{d}\tau+k_d\frac{\mathrm{d}e(t)}{\mathrm{d}t} u(t)=kpe(t)+ki∫0te(τ)dτ+kddtde(t)
对应的离散形式是这样的:
u ( t ) = k p e ( t ) + k i ∑ j = 0 t e ( j ) + k d [ e ( t ) − e ( t − 1 ) ] u(t) = k_pe(t)+k_i\sum_{j=0}^{t}e(j)+k_d[e(t)-e(t-1)] u(t)=kpe(t)+kij=0∑te(j)+kd[e(t)−e(t−1)]
三项的基本含义如下:
- 比例项直接反映当前误差的实时大小,通过比例系数 k p k_p kp对误差进行放大或缩小,快速调整控制量以减少偏差。例如,若当前误差较大,比例项会立即输出较强的控制信号以缩小误差。比例项能迅速减小误差,但对稳态误差(静差)无法完全消除;
- 积分项通过积分常数 T i T_i Ti( k i = k p T T i k_i = \frac{k_pT}{Ti} ki=TikpT,T为采样周期)累积历史误差,消除比例控制无法处理的稳态误差。例如,若误差长期存在,积分项会持续累积误差值并增强控制作用,直至误差归零。积分项的主要作用就是彻底消除系统稳态误差;
- 微分项通过微分常数 T d T_d Td( k d = k p T d T k_d = \frac{k_pT_d}{T} kd=TkpTd,T为采样周期)预测误差的变化趋势(即误差的导数),提前抑制超调并加快系统响应速度。例如,若误差快速增大,微分项会提前输出反向控制量以减缓变化速度。微分项住主要特点有抑制超调:微分作用可提高系统阻尼,减少超调量和调节时间。噪声敏感:微分对高频噪声敏感,可能放大干扰信号,需配合滤波措施。
3.1 FOC位置闭环
3.2 FOC速度闭环
3.3 FOC电流闭环
4. 参考资料
- https://dengfoc.com/
- https://www.bilibili.com/video/BV1cj411M7Xu
- https://blog.csdn.net/lanxiaoke123/article/details/90410560
- https://blog.csdn.net/weixin_42164589/article/details/95330403