• 手把手教你电机FOC控制【一】


    手把手教你电机FOC控制【一】

    文章作者: 范子琦
    文章链接: https://www.robotsfan.com/posts/d99d1c1a.html
    版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 范子琦的博客

    FOC框架引入

    三向电机,分别为UVW三向,角度互差120度。若使用BLDC控制方法,如下图每次换向增加60度,转子只能到达六个位置,所以六步换向时会有振动。使用FOC控制方法可以使转子到达任意角度,所以运行起来会更加平滑。

    ED2759D27293A18F51A49E35A2A46EB0

    如果想到达40度的位置,只需要在0度方向通电一段时间,在60度方向通电一段时间,再在空矢量的状态下通电一段时间(全桥000或111的位置为空矢量,空矢量的时长用来调节扭矩。后面会讲到),三段时间组成一个周期,以这个周期循环产生PWM,即可锁定至40度。若想到达其他角度,只需改变0度和60度的通电时长比例。

    要想使磁场旋转起来,就需要输入正弦电压,但我们输入的是直流电,我们马上想到可以使用PWM波。通过不断改变PWM脉宽就可以模拟正弦电压,体现在电流上则为正弦电流。

    下图为一个完整的FOC流程图:

    image-20220418110757084

    我们先来看正向通路:输入 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) (α,β) 间的转换。

    7C602099D7A9549EDA9C24D13AB98072
    正向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\{

    Iα=IaIbcos60Iccos60=Ia12Ib12IcIβ=Ibcos30Iccos30=32Ib32Ic" role="presentation" style="position: relative;">Iα=IaIbcos60Iccos60=Ia12Ib12IcIβ=Ibcos30Iccos30=32Ib32Ic
    \right. Iα=IaIbcos60Iccos60=Ia21Ib21IcIβ=Ibcos30Iccos30=23 Ib23 Ic

    表示为矩阵形式:
    [ I α I β ] = [ 1 − 1 2 − 1 2 0 3 2 − 3 2 ] [ I a I b I c ] \left[

    IαIβ" role="presentation" style="position: relative;">IαIβ
    \right]= \left[
    1121203232" role="presentation" style="position: relative;">1121203232
    \right] \left[
    IaIbIc" role="presentation" style="position: relative;">IaIbIc
    \right] [IαIβ]=[102123 2123 ] 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\{
    Iα=32IaIβ=32Ia+3Ib" role="presentation" style="position: relative;">Iα=32IaIβ=32Ia+3Ib
    \right.
    {Iα=23IaIβ=23 Ia+3 Ib

    矩阵形式:
    [ I α I β ] = [ 3 2 0 3 2 3 ] [ I a I b ] \left[

    IαIβ" role="presentation" style="position: relative;">IαIβ
    \right]= \left[
    320323" role="presentation" style="position: relative;">320323
    \right] \left[
    IaIb" role="presentation" style="position: relative;">IaIb
    \right] [IαIβ]=[2323 03 ][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\{
    Iα=IaIβ=13(Ia+2Ib)" role="presentation" style="position: relative;">Iα=IaIβ=13(Ia+2Ib)
    \right.
    {Iα=IaIβ=3 1(Ia+2Ib)

    矩阵形式:
    [ I α I β ] = [ 1 0 1 3 2 3 ] [ I a I b ] \left[
    IαIβ" role="presentation" style="position: relative;">IαIβ
    \right]= \left[
    101323" role="presentation" style="position: relative;">101323
    \right] \left[
    IaIb" role="presentation" style="position: relative;">IaIb
    \right]
    [IαIβ]=[13 103 2][IaIb]

    (这里的系数在后文SVPWM里相电压的幅值与电压空间矢量之间有一个 3 2 \frac{3}{2} 23 的系数相抵消)

    MATLAB实现为:

    image-20220330103933845
    反向Clark变换

    反Clark变换则将三相信号转换为两相信号。根据图可以写出:
    { U a = U α U b = − 1 2 U α + 3 2 U β U c = − 1 2 U α − 3 2 U β \left\{

    Ua=UαUb=12Uα+32UβUc=12Uα32Uβ" role="presentation" style="position: relative;">Ua=UαUb=12Uα+32UβUc=12Uα32Uβ
    \right. Ua=UαUb=21Uα+23 UβUc=21Uα23 Uβ
    矩阵形式:
    [ U a U b U c ] = [ 1 0 − 1 2 3 2 − 1 2 − 3 2 ] [ U α U β ] \left[
    UaUbUc" role="presentation" style="position: relative;">UaUbUc
    \right]= \left[
    1012321232" role="presentation" style="position: relative;">1012321232
    \right] \left[
    UαUβ" role="presentation" style="position: relative;">UαUβ
    \right]
    UaUbUc = 12121023 23 [UαUβ]

    MATLAB实现为:

    image-20220330103915885

    Park变换

    Park变换实现了两相坐标系 ( α , β ) (\alpha,\beta) (α,β) 与转子坐标系 ( d , q ) (d,q) (d,q) 间的转换,此变换可以将正弦变量线性化。其中 d d d 指向转子中心, q q q 指向切线方向, θ \theta θ 是转子当前的角度,也就是说 d − q d-q dq 坐标系始终跟着转子同步旋转。

    A20BC4DCAD2986A86187F746C2EDE88A
    正向Park变换

    则根据上图可以写出
    { I d = I α cos ⁡ θ + I β sin ⁡ θ I q = − I α sin ⁡ θ + I β cos ⁡ θ \left\{

    Id=Iαcosθ+IβsinθIq=Iαsinθ+Iβcosθ" role="presentation" style="position: relative;">Id=Iαcosθ+IβsinθIq=Iαsinθ+Iβcosθ
    \right. {Id=Iαcosθ+IβsinθIq=Iαsinθ+Iβcosθ
    很明显上述变换可以用旋转矩阵来表示,使用矩阵形式可以很方便地写出:
    [ I d I q ] = [ cos ⁡ θ sin ⁡ θ − sin ⁡ θ cos ⁡ θ ] [ I α I β ] \left[
    IdIq" role="presentation" style="position: relative;">IdIq
    \right]= \left[
    cosθsinθsinθcosθ" role="presentation" style="position: relative;">cosθsinθsinθcosθ
    \right] \left[
    IαIβ" role="presentation" style="position: relative;">IαIβ
    \right]
    [IdIq]=[cosθsinθsinθcosθ][IαIβ]

    (如果 d d d 轴为0,则功率全部输出在 q q q 轴上。)

    MATLAB实现为

    image-20220330104003922
    反Park变换

    根据上面的推导可以求得反Park变换
    { U α = U d cos ⁡ θ − U q sin ⁡ θ U β = U d sin ⁡ θ + U q cos ⁡ θ \left\{

    Uα=UdcosθUqsinθUβ=Udsinθ+Uqcosθ" role="presentation" style="position: relative;">Uα=UdcosθUqsinθUβ=Udsinθ+Uqcosθ
    \right. {Uα=UdcosθUqsinθUβ=Udsinθ+Uqcosθ
    同理,使用旋转矩阵可以求出反变换的系数矩阵:
    [ U α U β ] = [ cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ] [ U d U q ] \left[
    UαUβ" role="presentation" style="position: relative;">UαUβ
    \right]= \left[
    cosθsinθsinθcosθ" role="presentation" style="position: relative;">cosθsinθsinθcosθ
    \right] \left[
    UdUq" role="presentation" style="position: relative;">UdUq
    \right]
    [UαUβ]=[cosθsinθsinθcosθ][UdUq]

    MATLAB实现为

    image-20220330103857619

    MATLAB仿真

    为了更清楚地仿真,这里不用矩阵形式表示,如需矩阵形式可以看我写的另一篇文章。

    请注意,正向变换都是对电流进行操作的,反向变换都是对电压进行操作的。但是在这节的仿真中,把正变换和反变换连在一起,这样做没有实际意义,只是为了验证变化算法。

    输入Vd为0,Vq为1,角度为由0到2pi的连续值。

    image-20220330103716603

    再来看子模块内部,输入经过两个逆变换,再经过两个正变换。

    image-20220330103816443

    运行查看波形(新版本MATLAB常值输入为一个圆圈)

    image-20220330104412589
  • 相关阅读:
    base64编码是啥?
    uniapp 工具类方法封装 v1.0.0
    SQL Server 防病毒软件配置
    Day 45 | 70. 进阶爬楼梯 & 322. 零钱兑换 & 279.完全平方数
    leetcode: 529. 扫雷游戏
    秒级使网站变灰,不改代码不上线,如何做到?
    SpringBoot SpringBoot 运维实用篇 2 配置高级 2.4 自定义配置文件
    Git进阶命令-reset
    ssm+vue基本微信小程序的新冠疫苗预约小程序#毕业设计
    校招笔试一直跪?那你会骗分吗?
  • 原文地址:https://blog.csdn.net/oXiaoLingTong/article/details/123867530