发布时间:2023-10-25 13:00
电机分为有刷电机和无刷电机,这里主要描述的FOC控制算法主要是针对无刷电机的控制,无刷电机用于飞行器或者四足狗、机械臂等这种高精度的环境当中。玩过四轴的都比较清楚在,四轴飞行器中一般采用电调的驱动方式,那么电调和FOC直接有什么优缺点呢?电调比较适用于电机告诉旋转的场景,而对低速的控制确实乏力,而FOC无论在高速还是低速的场景下都适用
FOC用途之一,比如下面的狗子:
https://www.youtube.com/watch?v=NIjodHA78UE&feature=youtu.be
磁铁的分N和S级,同性相斥异性相吸的原理,那么将两个磁铁放在一起会出现什么现象呢?如下图,若拖动下方的磁铁进行旋转,那么由于磁场的原因,上方的磁铁也会跟着进行旋转
那么两个磁铁在何时力矩(力矩在物理学里是指作用力使物体绕着转动轴或支点转动的趋向)最大呢?如下图,当两个磁铁呈直角时,力矩最大(可以简单的认为相互作用力最大)。
当将上面两个磁铁中下方的磁铁换成电磁铁,电磁铁是物理不旋转而是形成的磁场的进行旋转,那么是不是与上方的效果一样,带动另一个磁铁进行旋转
a.电磁铁的构成
单个通电线圈如下图所示,由右手螺旋定理可以得出该线圈磁场的方向是向上的,
那么这里只有一个方向的磁场,那么如何增加旋转磁场的方向呢?简单的办法就是增加线圈,并且线圈的朝向不同即可,这里我们以三相电机为例子进行描述,三相电机就是采用如下图的方式,采用三个线圈,每个线圈的方向间隔120度
由于减少硬件电路驱动(H桥)的数量,因此一般是将三个线圈的一端进行相连接,组成了三相星型结构,如下图,那么为什么会这样链接呢?每个线圈单独供电是否可以呢,当然是可以的,具体原因下面会描述
b.H桥驱动电路驱动线圈
驱动线圈供电,一般使用H桥驱动电路,那么我们先看一下如何驱动一个线圈的,如下图
H桥由4个MOS管组成,当 A 和 B‘ 打开时,电流由左上方流入线圈经由B’流入负极,也就是图上的红色箭头的方向,同理打开B和A\'同时打开,电流就是蓝色箭头的方向,这样就能控制线圈产生不同方向的磁场了。
那么如何控制上方线圈产生的磁场的大小呢?
转换来看也就是如何控制加在线圈两侧的电压的大小呢?
这里可以使用方波来控制MOS管的导通,如时间周期T,在T/2时间打开A和B\',剩下的T/2关闭A和B\',这样的话就相当于0.5VDC的电压加载到线圈上了(若是T时间均打开 那么线圈上的电压就是VDC),线圈上的电压可能是0~0.5VDC之间不断的跳动,但是线圈的电流是接近连续的,因为这是电感,如下图,若是电压变动很快并且电感足够大,理论上是可以做到电流连续的
由上面的H桥驱动电路可以知道,一个H桥由4个MOS管构成,那么若是三个线圈就需要12个MOS管构成,这样非常的浪费,**这也是为什么要将三个线圈连在一起组成星链结构的原因**。
ps:
在上面的H桥驱动电路上桥臂和下桥臂在同一时间只有一个能打开,这是为什么呢?因为两个同时打开就短路了。所以这种情况是不允许发生的。
正是为了避免上面的情况发生,所以才有了**死区**时间的概念,死区时间是PWM输出时,为了使H桥或半H桥的上下管不会因为开关速度问题发生同时导通而设置的一个保护时段,所以在这个时间,上下管都不会有输出。
那么H桥驱三相星链线圈是怎么样呢?如下图:
定义MOS管开关状态如下:
上桥开通下桥关断定义为状态1
上桥关断下桥开通定义为状态0
这样,三组半桥就一共有8种组合方式,编码分别为:**000**、**001**、**010**、**011**、**100**、**101**、**110**、**111**
c.三相线圈产生的磁场
0电流状态:上面的8种组合中有000和111状态,比较明显看出当在这两个状态时三相线圈是没有电流经过的,这个状态我们称为0电流状态。
上面的8种状态除去两个0电流的状态,其余6种都会产生磁场,并且相应的磁场方向分别为:
其中橘色箭头的方向和电磁铁形成磁场方向一致,但是这里我们把橘黄色箭头称呼为**电压矢量的方向**,因为这里我们加载的是电压方向(1图中A指向B和C)由于是稳态的,所以电流方向也是这个方向,所以磁场方向和橘色箭头一致了<右手螺旋法则>。所以最终产生的磁场方向汇总如下:
d.电磁场牵引转子最优的状态
在上面已经提到当电磁铁的方向和转子(永久磁铁)的方向呈90度的时候,力矩最大,如下图,
此时转子会向着电磁铁的方向旋转,此时若转子受到牵引转动了θ角,与此同时电磁铁也按照同方向转动了θ角,那么电磁铁的方向始终和转子的方向垂直,这样转子就会不断的进行旋转了并且力矩始终是最大的,这就好比下图:**毛驴一直跟着胡萝卜的位置进行转动,但是毛驴和胡萝卜的位置确不会被改变**
现在我们已经知道我们需要的是什么了?**那就是一个旋转任意角度的磁场并且大小可控**,但是由上面描述三相线圈只能生成6个方向的电压矢量(电压矢量的方向和磁场方向相同),那么如何根据这6个电压矢量合成任意角度的电压矢量(磁场方向)呢?这就是SVPWM要干的事情了
SVPWM:空间矢量脉宽调制(Space Vector Pulse Width Modulation)
SVPWM的基本思想就是根据上面6个磁场方向的来合成任意角度的磁场方向
a.矢量的合成
初中数学的知识回顾如下
我们想产生(0,1)的矢量,其实可以看作是 :
1可以看作周期T的时间内有T这么长时间作用在X轴上,Y轴作用时间0
我们想产生(1,0)的矢量,其实可以看作是:
我们想产生(0.5,0.5)的矢量,其实可以看作是:
其中这里0.5可以看作周期T的时间内有0.5T的时间作用在X轴上,也有0.5T的时间作用在Y轴上;
根据上面的例子,我们可以固定这样的表达式
那么若是想产生(0.25,0.25)这个方向的矢量,该如何表达:
这里加入了零向量,这里向量(0.25,0.25)和向量(0.5,0.5)方向相同,但是赋值不一样,但是总时长加起来还是1
**可以得出一句话就是幅度要低,拿0来抵<上面的000和111状态派上了用场>**。
b.SVPWM中的电压矢量合成
在这里我们可以认为电压矢量方向和磁场方向相同(**因此本节也可以理解为磁场方向的合成**)
矢量控制,就是要通过6个方向的空间矢量电压作为基向量来合成任意矢量,基向量的选择是选择当前扇区的两个基向量。
这里我们以第一扇区为例,当前需要合成的角度为θ,对应的基向量分别为U6和U4,如下:
由上图可以看出,通过U4和U6显然是能够合成Uref的,将要生成的Uref向量分别投影到U6和U4上,由正玄定理(**各边和它所对角的正弦值的比相等**)可以得出如下恒等式:
(T6/T)*U6:可以理解为要产生Uref这个电压,U6要产生多少电压
因为|U6|=|U4|=2Udc/3(Udc是供给电压,由欧姆定律计算得出),因此可以得出如下T4和T6的时间:
其中参数m表示为SVPWM的调制系数(调制比):
上面已经描述过,因为我们需要根据需要控制幅值,因此需要零矢量的参与,因此零矢量的时间为
总时间T减去T4和T6的作用时间:
这里为什么是1/2,是因为我们要插入两个零矢量,所以时间要平分给两个零矢量,那么为什么要插入两个零矢量呢?只用一个零矢量可以吗?
理论上是可以的,但是会对MOS管的开断会产生较大的影响,影响MOS管的寿命,所以我们希望尽量减少MOS管的开关次数,因此目前设计出了7段式SVPWM的调制法,如下:
解释一下该图的参数,A、B、C代表的是H桥驱动电路上的控制端信号,
同时我们通过在合理的位置插入两个零矢量,并且对零矢量在时间上进行了平均分配,以使产生的PWM对称,从而有效地降低了PWM的谐波分量。
同理可以得出其他扇区的切换顺序如下,为什么有这样的顺序呢?**对应到MOS管的开关上来看就是每次状态的切换只要一个MOS进行切换,极大的降低了MOS管的损耗**
重新回到上面的T4和T6的公式中,得出的公式如下:
其中
因此到这里,SVPWM的工作完成了,我们得到了每一时刻所需要的空间电压矢量以及它们持续的时间,在处理器中赋值给对应通道的捕获比较寄存器产生相应的三个PWM波形,控制MOS管的开关,**进而产生我们期望的电压、电流、力矩。**
但上面的公式在实际的控制中并不使用,因为其还是太过于复杂,因为牵扯到了角度的变化,该种算法是老式的SVPWM的思路,那么现在是如何得到每个方向的Tx(基向量的作用时间)呢?如下一节:
c.SVPWM和FOC的联系
那么FOC和SVPWM是如何对接的?
首先理解前后关系:FOC的输出是SVPWM的输入,SVPWM输出是三相电压的占空比,也就是最终设置到计时器中的比较寄存器的值。
那么FOC输出的是什么呢?
因为后面会介绍,所以这里直接给出结论是Vα和Vβ,这个也与直轴和交轴方向相同的两个电压矢量
直轴:转子N到S的方向 交轴:与直轴垂直,维持转子转动的方向 ,在电机转动的过程中,交轴方向的力是维持转子转动的,而直轴上的力对转动无效果,因此我们应该尽力让其为0.
那么该处假定已经知道了FOC输出的Vα和Vβ,那么该如何得到T4、T6、T0、T7,从而更新寄存器控制PWM的输出呢?
继续贴出上面讨论的在第一象限的Uref,如下(Ts和上图中的T是一个意思,都是表示PWM输出的完整周期时间):
电压矢量U4(100)和U6(110)的Uout,分别是2/3Udc和2/3Udc*(cos(π/3),sin(π/3)) ->矢量
1.首先上式表示的是U4和U6方向的总电压,这个电压如何计算得出来的呢?
三相线圈的等效电阻如下:
由上面的电路我们可以根据电路原理和矢量合并等原则算出各个方向输出的电压,这里不再进行计算直接给出结论,如下图:
其中红框标出来的就时第一象限所需要的U6和U4的总电压
其中U4(1,0,0)=2/3Udc(α方向),而U6=2/3Udc *e^(j\\* π/3),这是个矢量表达形式,我们将其变一下形:
根据虚数变换公式
可以将e^(j\\* π/3) = cos(π/3) + j*sin(π/3),用坐标表示则就是**
(cos(π/3) ,sin(π/3)),这样就很清晰了,其表示的是α和β轴对应的值, 那么FOC输出的就是α和β轴向的值,这样就能得到了上面的值。
我们将U4和U6分和Uref别投影到α和β轴上,那么就会出现如下恒等式:
那么由左侧和右侧等式可以得出如下公式:
其中比例系数为*K* =√3*Ts*/Udc ,该是个固定的值。因此上面就建立了T4、T6、T0和T7与FOC输出的Uα、Uβ的关系了。
上面仅限于第一区域的计算公式,其他扇区的公式不进行推倒,直接给出结论:
这样我们拿到FOC的输出结果Uα、Uβ,然后执行如下步骤:
1.根据该值判断合成的矢量所在的扇区
2.然后利用对应扇区的公式计算Tx、Ty、Tz等值,然后进行变换后设置到PWM控制器的比较值中,即可产生我们想要的波形,从而产生定向的磁场方向
这样就能完成电机的矢量控制,SVPWM的工作就已经完成了
上面已经得到根据FOC的输出能够很轻易的得到需要设置寄存器的值以来控制电机,那么下面我们来分析这个FOC是如何得到这个Uα、Uβ的
当我们拿到一个三相无刷电机时,当手转动电机然后用示波器观察电机的三根信号线,能够看到输出的是三个相位相差120度的正弦波形,因为电动机反过来就是发电机。
因为控制常用的就是闭环控制,而检测正弦波比较困难,那么FOC主要做的工作就是解耦,就是将复杂的信号拆解成比较容易分析的量
这幅图是以电流闭环控制为例的,也就是让电机始终产生一个恒定的力矩(也就是恒定的电流,因为力矩和电流成正比)。
可以看到控制器的输入是最左边的Iq_ref和 Id_ref,两个变量经过PID控制器进行反馈调节,其中还涉及到几个变换模块,**有Park变换和Clark变换**;最后通过前面提到的SVPWM模块作用到三相逆变器上进而控制电机;而PID控制器的反馈量,是对电机输出电流的采样值。
FOC控制的整个过程是这样的:
1. 对电机三相电流进行采样得到Ia Ib Ic
2. 将Ia、Ib、Ic经过`Clark变换`得到Iα Iβ
3. 将Iα Iβ经过`Park变换`得到Iq和Id
4. 计算Iq和Id和其设定值Iq_ref,Id_ref 的误差
5. 将上述误差输入两个PID(只用到PI)控制器,得到输出的控制电压Uq,Ud
6. 将 进行`反Park变换`得到Uα,Uβ
7. 用Uα,Uβ合成电压空间矢量,输入`SVPWM模块`进行调制,输出该时刻三个半桥的状态编码值
8. 按照前面输出的编码值控制三相逆变器的MOS管开关,驱动电机
9. 循环上述步骤
通过电流的采样,我们得到了三个相位相差120度的正弦波,采集电机前的电流的作用主要是用作PID反馈,以此来调整输入的误差。从上图可以看出,我们只需要采样两个信号线,另一根可以使用基尔霍夫定律得出(在任一时刻,流入节点的电流之和等于流出节点的电流之和,也就是说Ia + Ib +Ic = 0
那么将三相正选波形直接作为PID,那么这个过程非常的复杂,因此我们这里用一些算法对其进行转换,将采集的三相电流表示如下图:
其中横坐标表示为α轴,纵坐标表示为β轴,那么此时将Ia、Ib、Ic分别投影到α和β轴上,就能比较轻易的得到如下恒等式:
经过这样的投影,我们将Ia、Ib、Ic转换成了Iα和Iβ 两个变量了,可能这样还不够直观,我们从波形上看看到底有什么变化:
从上图可以看出经过上面的变换后,需要控制的变量从3个编程了2个了,这样的转换就称为Clack变化,但是这两个还是正弦波形,还是不好做跟踪不好做处理,最理想的跟踪变量是什么呢?肯定是直线了,下面我们沿着Clack变换继续进行处理。
在上面的Clack的输出中得到了**α-β坐标系** ,若是将该坐标系旋转θ角,如下:
经过旋转后Q-D坐标系可以表示成如下:
Q和D可能很熟悉,那就是分别对应电机的Q轴(交轴)和D轴(直轴),θ就是转子转动的角度,也就是d-q坐标系是始终随着转子进行转动的。
这个操作是可行的,因为我们会通过编码器输入转子的实时旋转角度,所以这个角度始终是一个已知数。经过这一步的变换,我们会发现,一个匀速旋转向量在这个坐标系下变成了一个定值!**(因为参考系相对于该向量静止了,Id和Iq相对于D-Q坐标系)**,这个坐标系下两个控制变量都被线性化了!
接下来如果我们以 Iq和Id 这两个值作为反馈控制的对象,那么显然就可以使用一些线性控制器来进行控制了,**比如PID**
PID是在控制领域最常用的算法之一,这里不做过多的介绍,只介绍一下PID在FOC控制系统当中的应用:
在FOC控制中主要用到三个PID环,从内环到外环依次是:**电流环**、**速度环**、**位置环。**
也就是说:我们**通过电流反馈来控制电机电流(扭矩)** -> 然后**通过控制扭矩来控制电机的转速** -> 再**通过控制电机的转速控制电机位置**。
a.电流环
从上图可以看出,我们上面的一系列的操作运算,如clack变换和pack变换最后输出的Iq和Id的值,也就是主要对采样的正弦电流进行解耦,分解成径向和切向这两个方向的变量:
- 其中 Iq是我们需要的,代表了期望的力矩输出
- 而 Id是我们不需要的,我们希望尽可能把它控制为0
**由上图可以知道经过FOC的控制目标就是将Id的电流尽量减小到0,因为其对电机的转向是没有任何帮助的所以我们尽量让其控制到0**
b.速度环
w是电机的转速反馈,可以通过电机编码器或者霍尔传感器等计算得到,依然是使用**PI控制**。
注意这里的w转速并不是瞬时的速率,而是测了一段时间取平均值的速率,因此若是在低速的情况下,速率环就不那么适用了,因为平均测速法会存在非常大的误差(转子不动或者动地很慢,编码器就没有输出或者只输出1、2个脉冲)。
c.位置环
由于去掉了速度环,这里的位置环我们使用**完整的PID**控制,即把微分项加上(因为位置的微分就是速度,这样可以减小位置控制的震荡加快收敛;积分项的作用是为了消除静态误差)。
到目前为止,FOC控制无刷电机的驱动方式已经基本讲解完了,有了以上的内容就能够非常妥善的控制电机运转,但FOC还有一部分内容,那就是能量回收,该部分放到以后进行分享~
https://zhuanlan.zhihu.com/p/147659820
https://zhuanlan.zhihu.com/p/104546205
https://zhuanlan.zhihu.com/p/145551966
https://zhuanlan.zhihu.com/p/152144886
STM32参考程序:
https://blog.csdn.net/qlexcel/article/details/95227991
SVPWM:
https://blog.csdn.net/qlexcel/article/details/74787619#comments_15223680
一些开源的项目:
https://odriverobotics.com/
https://docs.simplefoc.com/
https://stanfordstudentrobotics.org/pupper
MIT的机器狗的参考code
https://os.mbed.com/users/benkatz/code/Hobbyking_Cheetah_Compact_DRV8323//file/6cd89bd6fcaa/FOC/