手把手教你电机FOC控制【一】
文章作者: 范子琦
文章链接: https://www.robotsfan.com/posts/d99d1c1a.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 范子琦的博客!
FOC框架引入
三向电机,分别为UVW三向,角度互差120度。若使用BLDC控制方法,如下图每次换向增加60度,转子只能到达六个位置,所以六步换向时会有振动。使用FOC控制方法可以使转子到达任意角度,所以运行起来会更加平滑。
如果想到达40度的位置,只需要在0度方向通电一段时间,在60度方向通电一段时间,再在空矢量的状态下通电一段时间(全桥000或111的位置为空矢量,空矢量的时长用来调节扭矩。后面会讲到),三段时间组成一个周期,以这个周期循环产生PWM,即可锁定至40度。若想到达其他角度,只需改变0度和60度的通电时长比例。
要想使磁场旋转起来,就需要输入正弦电压,但我们输入的是直流电,我们马上想到可以使用PWM波。通过不断改变PWM脉宽就可以模拟正弦电压,体现在电流上则为正弦电流。
下图为一个完整的FOC流程图:
我们先来看正向通路:输入 I d _ r e f I_{d\_ref} Id_ref 和 I q _ r e f I_{q\_ref} Iq_ref 与下文反馈通路采样得到的电流 I d I_d Id 和 I q I_q Iq 进行PID控制输出 U d U_d Ud 和 U q U_q Uq (输入的 I d _ r e f I_{d\_ref} Id_ref 通常为0, I q _ r e f I_{q\_ref} Iq_ref 前通常还需要接入一个速度PID构成速度环),再通过反Park变换转换成 U α U_\alpha Uα 和 U β U_\beta Uβ ,通过SVPWM模块控制定时器产生六路互补的PWM信号,最后使用PWM信号控制全桥MOS管的通断,产生三向电压使电机转动。
再来看反馈通路:通过采样电阻采集任意两相电流,根据基尔霍夫电流定律可以算出第三相电流,将三向电流通过Clark变换转化成 I α I_\alpha Iα 和 I β I_\beta Iβ ,再通过Park变换转换成 I d I_d Id 和 I q I_q Iq ,作为反馈传入PID控制器构成电流环。
上图中的Park变换和反Park变换需要当前的角度作为输入;速度PID需要速度作为反馈。所以需要获得电机的速度与角度。角度和速度的获取方法分为有感和无感。有感方式使用霍尔元件(Hall Sensor),安装在电机上就可以检测电机磁铁的位置。无感使用观测器(observer)获得角度速度信息,本文将使用扩展卡尔曼滤波观测器(EKF),输入为 U α U_\alpha Uα 、 U β U_\beta Uβ 、 I α I_\alpha Iα 、 I β I_\beta Iβ 。使用无感方式不需要霍尔传感器,可以减少连接线的数量,也可以减小成本。
坐标变换
为什么要使用坐标变换?电机控制大多是在控制速度/转矩,需要用PID闭环控制正弦交流电压的幅值和角度,不是很容易实现,所以通过坐标变化把正弦交流信息分解成角度信息(Q轴控制转矩)和幅值信息(D轴控制磁场)单独控制。
FOC的变换中要满足等幅值变换,即变换前后幅值不变。
坐标变换都分为正向变换和反向变换,正向变换都是对电流进行操作的,反向变换都是对电压进行操作的。
下面的变换均采用联立和矩阵两种形式表示,以方便使用。
Clark变换
Clark变换实现了三向坐标系 ( a , b , c ) (a,b,c) (a,b,c) 与直角坐标系 ( α , β ) (\alpha,\beta) (α,β) 间的转换。
正向Clark变换
Clark反变换则将两相信号转换为三相信号。已知三相坐标系
(
I
a
,
I
b
,
I
c
)
(I_a,I_b,I_c)
(Ia,Ib,Ic) ,这三个基向量不是正交的,所以可以将其正交化为一个直角坐标系,命名为
α
−
β
\alpha-\beta
α−β 坐标系,变换公式为:
{
I
α
=
I
a
−
I
b
cos
60
−
I
c
cos
60
=
I
a
−
1
2
I
b
−
1
2
I
c
I
β
=
I
b
cos
30
−
I
c
cos
30
=
3
2
I
b
−
3
2
I
c
\left\{\begin{array}{l} \begin{aligned} I_\alpha&=I_a-I_b\text{cos}60-I_c\text{cos}60 \\ &=I_a-\frac{1}{2}I_b-\frac{1}{2}I_c \end{aligned} \\ \begin{aligned} I_\beta&=I_b\text{cos}30-I_c\text{cos}30 \\ &=\frac{\sqrt3}{2}I_b-\frac{\sqrt3}{2}I_c \end{aligned} \end{array}\right.
⎩
⎨
⎧Iα=Ia−Ibcos60−Iccos60=Ia−21Ib−21IcIβ=Ibcos30−Iccos30=23Ib−23Ic
表示为矩阵形式:
[
I
α
I
β
]
=
[
1
−
1
2
−
1
2
0
3
2
−
3
2
]
[
I
a
I
b
I
c
]
\left[\begin{array}{c} I_{\alpha} \\ I_{\beta} \end{array}\right]= \left[\begin{array}{ccc} 1 & -\frac{1}{2} & -\frac{1}{2} \\ 0 & \frac{\sqrt{3}}{2} & -\frac{\sqrt{3}}{2} \end{array}\right] \left[\begin{array}{c} I_{a} \\ I_{b} \\ I_{c} \end{array}\right]
[IαIβ]=[10−2123−21−23]⎣
⎡IaIbIc⎦
⎤
我们一般在电路中只采集两相电流,第三相电流可以使用基尔霍夫电流定律得出(
I
a
+
I
b
+
I
c
=
0
I_a+I_b+I_c=0
Ia+Ib+Ic=0 ),故上式也可整理为以下形式:
{
I
α
=
3
2
I
a
I
β
=
3
2
I
a
+
3
I
b
\left\{\begin{array}{l} I_\alpha=\frac{3}{2}I_a \\ I_\beta=\frac{\sqrt3}{2}I_a+\sqrt3I_b \end{array}\right.
{Iα=23IaIβ=23Ia+3Ib
矩阵形式:
[
I
α
I
β
]
=
[
3
2
0
3
2
3
]
[
I
a
I
b
]
\left[\begin{array}{c} I_{\alpha} \\ I_{\beta} \end{array}\right]= \left[\begin{array}{cc} \frac{3}{2} & 0\\ \frac{\sqrt{3}}{2} & \sqrt{3} \end{array}\right] \left[\begin{array}{c} I_{a} \\ I_{b} \end{array}\right]
[IαIβ]=[232303][IaIb]
由于变换前后
I
a
I_a
Ia 和
I
α
I_\alpha
Iα 幅值要相同,所以要进行等幅值变换,变换系数为
2
3
\frac{2}{3}
32 ,即变为
{
I
α
=
I
a
I
β
=
1
3
(
I
a
+
2
I
b
)
\left\{\begin{array}{l} I_\alpha=I_a \\ I_\beta=\frac{1}{\sqrt3}(I_a+2I_b) \end{array}\right.
{Iα=IaIβ=31(Ia+2Ib)
矩阵形式:
[
I
α
I
β
]
=
[
1
0
1
3
2
3
]
[
I
a
I
b
]
\left[\begin{array}{c} I_{\alpha} \\ I_{\beta} \end{array}\right]= \left[\begin{array}{cc} 1 & 0\\ \frac{1}{\sqrt{3}} & \frac{2}{\sqrt{3}} \end{array}\right] \left[\begin{array}{c} I_{a} \\ I_{b} \end{array}\right]
[IαIβ]=[131032][IaIb]
(这里的系数在后文SVPWM里相电压的幅值与电压空间矢量之间有一个
3
2
\frac{3}{2}
23 的系数相抵消)
MATLAB实现为:
反向Clark变换
反Clark变换则将三相信号转换为两相信号。根据图可以写出:
{
U
a
=
U
α
U
b
=
−
1
2
U
α
+
3
2
U
β
U
c
=
−
1
2
U
α
−
3
2
U
β
\left\{\begin{array}{l} U_{a} = U_{\alpha} \\ U_{b} = -\frac{1}{2}U_{\alpha} + \frac{\sqrt3}{2}U_{\beta}\\ U_{c} = -\frac{1}{2}U_{\alpha} - \frac{\sqrt3}{2}U_{\beta} \end{array}\right.
⎩
⎨
⎧Ua=UαUb=−21Uα+23UβUc=−21Uα−23Uβ
矩阵形式:
[
U
a
U
b
U
c
]
=
[
1
0
−
1
2
3
2
−
1
2
−
3
2
]
[
U
α
U
β
]
\left[\begin{array}{c} U_{a} \\ U_{b} \\ U_{c} \end{array}\right]= \left[\begin{array}{ccc} 1 & 0 \\ -\frac{1}{2} & \frac{\sqrt{3}}{2} \\ -\frac{1}{2} & -\frac{\sqrt{3}}{2} \end{array}\right] \left[\begin{array}{c} U_{\alpha} \\ U_{\beta} \end{array}\right]
⎣
⎡UaUbUc⎦
⎤=⎣
⎡1−21−21023−23⎦
⎤[UαUβ]
MATLAB实现为:
Park变换
Park变换实现了两相坐标系 ( α , β ) (\alpha,\beta) (α,β) 与转子坐标系 ( d , q ) (d,q) (d,q) 间的转换,此变换可以将正弦变量线性化。其中 d d d 指向转子中心, q q q 指向切线方向, θ \theta θ 是转子当前的角度,也就是说 d − q d-q d−q 坐标系始终跟着转子同步旋转。
正向Park变换
则根据上图可以写出
{
I
d
=
I
α
cos
θ
+
I
β
sin
θ
I
q
=
−
I
α
sin
θ
+
I
β
cos
θ
\left\{\begin{array}{l} I_{d}=I_{\alpha} \cos\theta+I_{\beta} \sin\theta \\ I_{q}=-I_{\alpha} \sin\theta+I_{\beta} \cos\theta \end{array}\right.
{Id=Iαcosθ+IβsinθIq=−Iαsinθ+Iβcosθ
很明显上述变换可以用旋转矩阵来表示,使用矩阵形式可以很方便地写出:
[
I
d
I
q
]
=
[
cos
θ
sin
θ
−
sin
θ
cos
θ
]
[
I
α
I
β
]
\left[\begin{array}{l} I_{d} \\ I_{q} \end{array}\right]= \left[\begin{array}{cc} \cos \theta & \sin \theta \\ -\sin \theta & \cos \theta \end{array}\right] \left[\begin{array}{l} I_{\alpha} \\ I_{\beta} \end{array}\right]
[IdIq]=[cosθ−sinθsinθcosθ][IαIβ]
(如果
d
d
d 轴为0,则功率全部输出在
q
q
q 轴上。)
MATLAB实现为
反Park变换
根据上面的推导可以求得反Park变换
{
U
α
=
U
d
cos
θ
−
U
q
sin
θ
U
β
=
U
d
sin
θ
+
U
q
cos
θ
\left\{\begin{array}{l} U_{\alpha}=U_{d} \cos\theta-U_{q} \sin\theta \\ U_{\beta}= U_{d} \sin\theta+U_{q} \cos\theta \end{array}\right.
{Uα=Udcosθ−UqsinθUβ=Udsinθ+Uqcosθ
同理,使用旋转矩阵可以求出反变换的系数矩阵:
[
U
α
U
β
]
=
[
cos
θ
−
sin
θ
sin
θ
cos
θ
]
[
U
d
U
q
]
\left[\begin{array}{l} U_{\alpha} \\ U_{\beta} \end{array}\right]= \left[\begin{array}{cc} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{array}\right] \left[\begin{array}{l} U_{d} \\ U_{q} \end{array}\right]
[UαUβ]=[cosθsinθ−sinθcosθ][UdUq]
MATLAB实现为
MATLAB仿真
为了更清楚地仿真,这里不用矩阵形式表示,如需矩阵形式可以看我写的另一篇文章。
请注意,正向变换都是对电流进行操作的,反向变换都是对电压进行操作的。但是在这节的仿真中,把正变换和反变换连在一起,这样做没有实际意义,只是为了验证变化算法。
输入Vd为0,Vq为1,角度为由0到2pi的连续值。
再来看子模块内部,输入经过两个逆变换,再经过两个正变换。
运行查看波形(新版本MATLAB常值输入为一个圆圈)