最近看到了FOC这个东西,感觉很有意思,想着以后用这个算法做个东西,目前的想法是用开源的ODrive方案,自己做一个有感单电机驱动的板子,并且加入一点自己的东西,但是这不是目前工作的重点,所以就先学习了一下,记录下来,方便以后做的时候查阅。
原文来自稚晖君的文章:
【自制FOC驱动器】深入浅出讲解FOC算法与SVPWM技术
FOC算法与SVPWM技术
什么是FOC?
FOC(Field-Oriented Control)
,直译是磁场定向控制,也被称作
矢量控制(VC,Vector Control)
,是目前无刷直流电机(
BLDC
)和永磁同步电机(
PMSM
)高效控制的最优方法之一。
FOC旨在通过精确地控制
磁场大小与方向
,使得电机的运动
转矩平稳
、
噪声小
、
效率高
,并且具有
高速的动态响应
。
简单来说就是,
FOC是一种对无刷电机的驱动控制方法
,它可以让我们对无刷电机进行“
像素级
”控制,实现很多传统电机控制方法所无法达到的效果~
FOC驱动器和无刷电调的区别
航模中对于无刷电机的驱动使用的是电子调速器(ESC)也就是我们常说的电调,那么这个FOC驱动器和普通的电调有什么区别呢?
FOC的优势
-
低转速下控制
由于控制原理的区别,无刷电调只能控制电机工作在高转速下,低速下很难控制;而FOC控制器则完全没有这个限制,不论在什么转速下都可以实现精确控制。 -
电机换向
同上面的理由,由于无感电调无法反馈转子位置,因此很难实现电机正反转的换向;而FOC驱动器的换向性能极其优秀,最高转速下正反转切换可以非常顺畅;此外FOC还可以以能量回收的形式进行刹车控制。 -
力矩控制
普通电调都只能控制电机转速,而FOC可以进行电流(力矩)、速度、位置三个闭环控制。 -
噪音
FOC驱动器的噪音会比电调小很多,原因是普通电调采用方波驱动,而FOC是正弦波。
电调的优势
-
兼容性
电调驱动不同的BLDC不需要进行参数整定,而FOC需要。 -
算法复杂度
电调的算法实现更简单,运算量少,很适合需要提高带宽的超高转速电机。 -
成本
电调的成本比FOC低很多。
无刷直流电机基础知识
基础知识
左手定则
用于判断导线在磁场中
受力的方向
:伸开左手,使拇指与其他四指垂直且在一个平面内,让磁感线从手心流入,四指指向电流方向,大拇指指向的就是安培力方向(即导体受力方向)。
右手定则
伸开右手,使大拇指跟其余四个手指垂直并且都跟手掌在一个平面内,把右手放入磁场中,让磁感线垂直穿入手心,大拇指指向导体运动方向,则其余四指指向
感生电动势的方向
。
也就是切割磁感线的导体会产生
反电动势
,实际上通过反电动势定位转子位置也是普通无感电调工作的基础原理之一。
右手螺旋定则(即安培定则)
用于判断
通电线圈极性
:用右手握螺线管,让四指弯向螺线管中电流方向,大拇指所指的那端就是螺线管的N极。
直线电流的磁场的话
,大拇指指向电流方向,另外四指弯曲指的方向为磁感线的方向。
PWM(脉冲宽度调制)
本质是利用面积等效原理来改变波形的有效值。
举个例子,一个电灯只有
开
和
关
两个状态,那么要怎么让它实现
50%亮度
的效果的呢?只需要让它在一半时间
开
,一半时间
关
,交替执行这两个动作只要频率足够高,在人眼(低通滤波器)看起来就是
50%亮度
的样子了。而其中高电平占一个开关周期的比例,就叫做
占空比
。
利用PWM可以实现使用
离散的开关量来模拟连续的电压值
。
磁回路分析法
考察下图情况中的直流电机基本模型,根据磁极异性相吸同性相斥的原理,中间永磁体在两侧电磁铁的作用下会被施加一个力矩并发生旋转,这就是电机驱动的基本原理:
当两头的线圈通上电流时,根据右手螺旋定则,会产生方向指向右的外加磁感应强度B(如粗箭头方向所示),而
中间的转子会尽量使自己内部的磁力线方向与外磁力线方向保持一致
(同性相斥,异性相吸),以形成一个最短闭合磁力线回路,这样内转子就会按顺时针方向旋转了。
“当转子磁场方向与外部磁场方向垂直时,转子所受的转动力矩最大”。注意这里说的是“力矩”最大,而不是“力”最大。诚然,在转子磁场与外部磁场方向一致时,转子所受磁力最大,但此时转子呈水平状态,力臂为0,当然也就不会转动了。
当转子转到水平位置时
,虽然不再受到转动力矩的作用,但由于惯性原因,还会继续顺时针转动,这时若改变两头螺线管的电流方向,如下图所示,转子就会继续顺时针向前转动。
如此不断改变两头螺线管的电流方向,内转子就会不停转起来了。改变电流方向的这一动作,就叫做
换相(commutation)
。注意:
何时换相只与转子的位置有关,而与转速无关
。
三相二极内转子电机结构
一般来说,定子的三相绕组有
星形联结方式
和
三角联结方式
,而“三相星形联结的二二导通方式”最为常用,故这里只对这种情况作详细分析。
上图显示了
定子绕组
的联结方式(转子未画出),三个绕组通过中心的连接点以“Y”型的方式被联结在一起。整个电机就引出三根线A, B, C。
当它们之间两两通电时,有6种情况,分别是AB, AC, BC, BA, CA, CB,下图分别描述了这6种情况下每个通电线圈产生的磁感应强度的方向(红、蓝色表示)和两个线圈的合成磁感应强度方向(绿色表示)。
在图(a)中,AB相通电,中间的转子(图中未画出)会尽量往绿色箭头方向对齐(逆时针),当转子到达图(a)中绿色箭头位置时,外线圈换相,改成AC相通电,这时转子会继续运动,并尽量往图(b)中的绿色箭头处对齐,当转子到达图(b)中箭头位置时,外线圈再次换相,改成BC相通电,再往后以此类推。当外线圈完成6次换相后,内转子正好旋转一周(即360°)。
再次重申一下:何时换相只与转子位置有关,而与转速无关。
整个过程就好像骑在毛驴上吊一根胡萝卜一样,旋转的磁场牵引着永磁体不断旋转:
三相多绕组多极内转子电机的结构
搞清了最简单的三相三绕组二极电机,我们再来看一个复杂点的,图1-9(a)是一个三相九绕组六极(三对极)内转子电机,它的绕组连线方式见图1-9(b)。从图(b)可见,其三相绕组也是在中间点连接在一起的,也属于星形联结方式。一般而言,
电机的绕组数量都和永磁极的数量是不一致的
(比如用9绕组6极,而不是6绕组6极),这样是为了防止定子的齿与转子的磁钢相吸而对齐,此种情况下转矩会产生很大波动。
其二二导通时的6种通电情况与上述类似,原则是转子的N极与通电绕组的S极有对齐的运动趋势,而转子的S极与通电绕组的N极有对齐的运动趋势。为便于理解,下图给出了一个对齐的运动趋势的图例。
同样,整个运动过程就跟 三相二极内转子电机类似,磁场牵着转子运动:
外转子无刷直流电机的工作原理
看完了内转子无刷直流电机的结构,我们来看外转子的。其区别就在于,外转子电机将原来处于中心位置的磁钢做成一片片,贴到了外壳上,电机运行时,是整个外壳在转,而中间的线圈定子不动。
外转子无刷直流电机较内转子来说,转子的
转动惯量要大很多
(因为转子的主要质量都集中在外壳上),所以转速较内转子电机要慢,
通常KV值在几百到几千之间
,用在航模上可以直接驱动螺旋桨,而省去了机械减速机构。
无刷电机KV值定义为
:转速/V,意思为输入电压每增加1伏特,无刷电机空转转速增加的转速值。比如说,标称值为1000KV的外转子无刷电机,在11伏的电压条件下,最大空载转速即为:11×1000=11000rpm(rpm的含义是:转/分钟)。
同系列同外形尺寸的无刷电机,根据绕线匝数的多少,会表现出不同的KV特性。
绕线匝数多的,KV值低,最高输出电流小,扭力大
;绕线匝数少的,KV值高,最高输出电流大,扭力小。
BLDC和PMSM的区别
无刷电机其实可以分为
无刷直流电机
(
BLDC
,我们航模上都是用这种)和
永磁同步电机
(
PMSM
),结构大同小异,主要区别在于制造方式(
线圈绕组方式
)不同导致的一些特性差异(比如反电动势的波形)。
PMSM采用短距分布绕组,有时也采用分数槽或正弦绕组,以进一步减小纹波转矩
BLDC采用整距集中绕组
从上面分析的无刷电机模型其实可以看到,由于转子在磁场中只有6个稳定的状态,因此旋转过程其实是不平滑的,存在扭矩的抖动(没有通电的时候可以用手转一下无刷电机,会感受到这种“
颗粒感
”)。因此为了解决这个问题,从“硬件”和从“软件”出发有两个解决方案,这就衍生出了
BLDC
和
PMSM
的区别。
简单地说,
BLDC
由于反电动势接近梯形波,所以肯定是会有上面说的抖动问题的,但是转一圈抖6下太明显了,如果我增加电机槽、极对数(也就是磁铁对数),那以前是360度里面抖6下,现在变成120度里面抖6下,甚至更小,这样“颗粒感”不就变得更小了嘛?
实际中买到的
BLDC
电机基本都是多极对的(比如“三相多绕组多极内转子电机”)。BLDC也可以结合抗齿槽算法的FOC进行力矩补偿实现平滑控制。
而另一方面,为什么非得用
方波
这种不平滑的波来驱动电机呢,用正弦波它不香吗?是的,这就是PMSM解决问题的方式,由于
PMSM的反电动势被设计为正弦波的形状
,我们用软件和算法结合PWM技术将方波转变成等效的
SPWM
正弦波或者
SVPWM
马鞍波,再来驱动电机,控制效果很理想。当然为了产生更好的波形、更好的旋转磁场,驱动器、控制算法就变得非常复杂,
这也是FOC的实现原理,后面会进行详细介绍
。
三相逆变电路
无刷电机的驱动电路主要使用三相逆变电路来实现,如下图:
所谓
逆变电路
,即把
直流电
变换为
交流电
.或者简单点说就是一个可以产生不同电流流向的电路,通过前面的电机模型分析我们也可以看出,对于无刷电机的驱动是需要在不同时刻施加不同方向的电压(电流)的,因此需要逆变电路。
而逆变电路具体的实现则一般是采用
半桥MOS电路
来制作的。半桥电路的原型如下,其实很简单,就是两个MOS管组成的
上桥臂
和
下桥臂
,中间引出一条输出线:
用
3个半桥电路
就可以组合成三相逆变电路,每个半桥引出的一根输出线跟无刷电机的一根相线相连,就完成了最基本的无刷驱动电路。
原理方面,MOS管可以看作电压控制的高速电子开关,在MOS管的栅极(上图中的High Drive和Low Drive)施加高电平或者低电平,就可以控制MOS源极和漏极的导通或者关闭。比如在下图中,我们打开第一组半桥的上桥臂、第二组和第三组半桥的下桥臂(其余的关闭),那么就可以让
电流从电源正极流过电机的a相,流经b、c相,然后回到电源负极
:
于是通过控制三个半桥的不同开关状态,我们可以控制电流在电机中的不同流向了。
注意
,在这个电路中,每个状态下电机的三相线圈都会有电流;而在上一节的示例中我们同一时刻只会让两相线圈有电流,另一相不起作用。
那么这么修改的原因是啥呢?当然是:
浪费可耻啊~
浪费一相不用那不就白白损失了一部分扭矩嘛?通过上图中的方式驱动原理也是和之前分析一致的,但是可以产生更大的扭矩,所以当然是更好的选择啦。
接下来我们将半桥电路的状态做一个编码,首先限定一个半桥只有两种状态:
-
上桥开通下桥关断定义为状态
1
-
上桥关断下桥开通定义为状态
0
这样,三组半桥就一共有8种组合方式,编码分别为:
000、001、010、011、100、101、110、111
为什么一个半桥只能上桥臂和下桥臂有一个导通呢?都关闭或者都导通不行??
上下
都导通
显然是不可能的,因为这就相当于把电源短路了
那上下
都断开
呢?也不需要,因为这样就回到前面提到的,这时候电机有一相不起作用,浪费。
实际上半桥驱动电路的实现会比上面的分析要复杂一些,比如需要考虑开关管的开关频率、开启和关断时间不对称、死区问题等等,FOC驱动使用的是专用的半桥MOS栅极驱动IC来实现的。
三相电机波形
按照前面的无刷电机基本模型,假设我们拿到这样一个电机,
手动匀速转动它的转子,然后用示波器观察它的三相输出电压(也就是反电动势产生的电压)
,会看到什么波形呢?
其实很自然可以想到,我们会得到
3根正弦曲线
,而且三根曲线两两相位差为120°:
实际上三相发电机的发电原理就是这样的,输出的就是三相幅值为220V的交流电(线电压为380V,即
2
∗
220
\sqrt{2}*220
2
∗
220
V)。
发电机反过来就是电动机
,所以假如反过来我们在三相无刷电机的三相线圈上输入上述三相正弦电压,那么就可以驱动无刷电机平稳高效地旋转了。
而这也是FOC驱动无刷电机的基本手段,
即通过计算所需电压矢量,使用 SVPWM 技术产生调试信号,驱动三相逆变电路,合成出等效的三相正弦电压驱动电机
。
这个会在后面进行详细介绍。
FOC控制原理
FOC算法的Pipeline
我们先来看一下FOC控制的整个流程图景:
稍微解释一下,这幅图是以
电流闭环控制
为例的,也就是让电机始终产生一个
恒定的力矩
(也就是恒定的电流,因为力矩和电流成正比)。
可以看到控制器的输入是最左边的
I
q
_
r
e
f
I_{q\_ref}
I
q
_
re
f
和
I
d
_
r
e
f
I_{d\_ref}
I
d
_
re
f
,两个变量经过PID控制器进行反馈调节,其中还涉及到几个变换模块,有
Park变换
和
Clark变换
;最后通过前面提到的
SVPWM模块
作用到三相逆变器上进而控制电机;而PID控制器的反馈量,是对电机输出电流的采样值。
先概括一下,FOC控制的整个过程是这样的:
-
对电机三相电流进行采样得到
Ia
,
I
b
,
I
c
I_a, I_b, I_c
I
a
,
I
b
,
I
c
-
将
Ia
,
I
b
,
I
c
I_a, I_b, I_c
I
a
,
I
b
,
I
c
经过
Clark变换
得到
Iα
,
I
β
I_\alpha, I_\beta
I
α
,
I
β
-
将
Iα
,
I
β
I_\alpha, I_\beta
I
α
,
I
β
经过Park变换得到
Iq
,
I
d
I_q, I_d
I
q
,
I
d
-
计算
Iq
,
I
d
I_q, I_d
I
q
,
I
d
和其设定值
Iq
_
r
e
f
,
I
d
_
r
e
f
I_{q\_ref}, I_{d\_ref}
I
q
_
re
f
,
I
d
_
re
f
的误差 -
将上述误差输入两个PID(只用到PI)控制器,得到输出的控制电压
Uq
,
U
d
U_q, U_d
U
q
,
U
d
-
将
Uq
,
U
d
U_q, U_d
U
q
,
U
d
进行
反Park变换
得到
Uα
,
U
β
U_\alpha, U_\beta
U
α
,
U
β
-
用
Uα
,
U
β
U_\alpha, U_\beta
U
α
,
U
β
合成电压空间矢量,输入
SVPWM模块
进行调制,输出该时刻三个半桥的状态编码值(前文有提到) - 按照前面输出的编码值控制三相逆变器的MOS管开关,驱动电机
- 循环上述步骤
下面我们来分别介绍每一步的具体操作以及意义。
Clark变换与Park变换
Clark变换
我们回到上面FOC控制过程9个步骤的第1步,也就是对电机的三个相电流进行采样,这一步会使用串联的采样电阻(Shunt)进行电流采样。
由于电机工作的电流一般很大,所以采样电阻的阻值非常小,甚至和导线的电阻接近了,因而实际的采样电路PCB设计的时候还有一些讲究,比如使用
开尔文接法(Kelvin connections)
。
但是我们实际电路设计时可以不使用三个采样器(实际有单采样电阻、双采样电阻和三采样电阻接法),只需要两个就够了。因为由
基尔霍夫电流定律(KCL)
,在任一时刻,流入节点的电流之和等于流出节点的电流之和,也就是说
I
a
+
I
b
+
I
c
=
0
I_a+I_b+I_c=0
I
a
+
I
b
+
I
c
=
0
只需要知道其中两个就可以计算出第三个了。
这三个电流基本上就是三个相位相差120度的正弦波,在把这些信号输入控制器反馈控制之前,我们先来做点数学游戏:
我们知道三相坐标系
(
I
a
,
I
b
,
I
c
)
(I_a, I_b, I_c)
(
I
a
,
I
b
,
I
c
)
如下:
问题:这明明是一个二维平面内的坐标系,为啥要用3个坐标轴来表示呢?
而且很明显
(
I
a
,
I
b
,
I
c
)
(I_a, I_b, I_c)
(
I
a
,
I
b
,
I
c
)
这三个基向量是
非正交
的,学过线性代数的同学可能会想到,我们可以做一个很简单的
基变换
将其正交化为一个直角坐标系,我们把新的直角坐标系命名为
α
−
β
\alpha-\beta
α
−
β
坐标系
,变换公式如下:
其实就是个很简单的坐标轴投影计算,写成矩阵形式如下:
于是我们就回到直角坐标系,变换前后的波形如下:
可以看到变换后其实还是正弦波…只不过我们少了一个需要控制的变量了,现在只需要控制
I
α
,
I
β
I_\alpha, I_\beta
I
α
,
I
β
这两个变量,让其满足上图的下面的波形变化规律就可以控制电机旋转 了,频率还是不变的。
注意这里的 是我们虚拟出来的变量,所以在计算出一组
Iα
,
I
β
I_\alpha, I_\beta
I
α
,
I
β
后,我们通过上述公式的
反向变换
公式变换回去再应用到电机的三相上。
如果只是为了减小一个控制变量那这个
变换/反变换
操作显然有点多此一举。
有趣的是我们还可以接着变换:虽然
α
−
β
\alpha-\beta
α
−
β
坐标系下少了一维变量,但是新的变量还是非线性的(正弦),有没有办法把它们线性化呢?有的,
Park变换
就是做这个工作的。
Park变换
这一步中我们接着Clark变换将
α
−
β
\alpha-\beta
α
−
β
坐标系
旋转
θ
\theta
θ
度,其中
θ
\theta
θ
是转子当前的角度
,如下图:
变换公式如下:
也很简单,就是作用了一个旋转矩阵,写成矩阵形式:
也就是说,这个
d
−
q
d-q
d
−
q
坐标系
是始终跟着转子旋转的!
dq坐标系是建立在转子上的直角坐标系,其中 d 轴方向与转子磁链方向重合,又叫直轴; q 轴方向与转子磁链方向垂直,又叫交轴; d轴和𝑞轴q轴如下图所示;
这个操作是可行的,因为我们会通过
编码器
输入转子的实时旋转角度,所以这个角度始终是一个已知数。
经过这一步的变换,我们会发现,一个匀速旋转向量在这个坐标系下变成了一个定值!(因为参考系相对于该向量静止了),这个坐标系下两个控制变量都被线性化了!
第三条直线没跑出来,尝试了好几个
θ
\theta
θ
值,都不行,所以我想,第二行的曲线是跟
θ
\theta
θ
值唯一对应的,但是第二行的曲线是随便画的,求不出对应的
θ
\theta
θ
值。
接下来如果我们以
I
q
,
I
d
I_q, I_d
I
q
,
I
d
这两个值作为反馈控制的对象,那么显然就可以使用一些线性控制器来进行控制了,比如
PID
(是的,尽管学术界有很多炫酷的高级控制方法, 但是工业界还是偏爱PID)。
至此我们已经理解完上面FOC控制过程9个步骤的前3步了。
clc;
close all;
clear;
t = 0:0.01:10;
y1 = sin(t*pi);
y2 = sin(t*pi + 2/3*pi);
y3 = sin(t*pi + 4/3*pi);
subplot(311);
hold on
plot(t, y1);
plot(t, y2);
plot(t, y3);
legend("y1", "y2", "y3");
y4 = y1 - 1/2*y2 - 1/2*y3;
y5 = 0 + sqrt(3)/2*y2 - sqrt(3)/2*y3;
subplot(312);
hold on
plot(t, y4);
plot(t, y5);
legend("y1'", "y2'");
y6 = y4*cos(2/5*pi) + y5*sin(2/5*pi);
y7 = -y4*sin(2/5*pi) + y5*cos(2/5*pi);
subplot(313);
hold on
plot(t, y6);
plot(t, y7);
legend("y1''", "y2''");
PID控制
在FOC控制中主要用到三个PID环,从内环到外环依次是:
电流环
、
速度环
、
位置环
。
也就是说:我们
通过电流反馈来控制电机电流(扭矩)
-> 然后
通过控制扭矩来控制电机的转速
-> 再
通过控制电机的转速控制电机位置
。
其中最内环的电流换控制框图如下:
可以看出来,这也就是前面提到的FOC控制9个步骤所描述的过程。实际只用到了PI控制,没有引入微分,因为如果推导一下电压和电流的传递函数会发现这其实就是一个
一阶惯性环节
(而且实际上我们可以通过零极点对消来简化掉PI参数,只需要控制一个参数即电流带宽即可)。
上图中的Speed & Position模块可以是编码器,或者霍尔传感器等能感应转子位置的传感器
特别说明一下其中的
I
q
,
I
d
,
I
q
_
r
e
f
,
I
d
_
r
e
f
I_q, I_d, I_{q\_ref}, I_{d\_ref}
I
q
,
I
d
,
I
q
_
re
f
,
I
d
_
re
f
,前两者大家知道是通过Clark变换和Park变换得到的,而后两者是我们预期希望前两者达到的值,这个值具体代表了什么物理量呢?参考一下下图:
也就是说我们一通操作将转子磁链进行了解耦,分解为了转子旋转的径向和切向这两个方向的变量:
-
其中
Iq
I_q
I
q
是我们需要的,代表了期望的力矩输出 -
而
Id
I_d
I
d
是我们不需要的,我们希望尽可能把它控制为0
通过PID控制器使用上述输入(电流采样值、编码器位置)和输出(MOS管开关状态)完成对电机电流的闭环控制。
然后进入到下一层的速度环:
在上图中,
S
p
e
e
d
r
e
f
Speed_{ref}
Sp
ee
d
re
f
是速度设定值,
ω
\omega
ω
是电机的转速反馈,可以通过电机编码器或者霍尔传感器等计算得到,依然是使用
PI控制
。
将计算得到的电机速度
ω
\omega
ω
与速度设定值
S
p
e
e
d
r
e
f
Speed_{ref}
Sp
ee
d
re
f
进行误差值计算,代入速度PI环,计算的结果作为电流环的输入,就实现了
速度-电流的双闭环控制
。
最外一层是
位置环
,也就是可以控制电机旋转到某个精确的角度并保持,控制框图如下:
同理应该很简单可以理解,上图中位置控制PID只用了P项(也可以使用PI)。
在实际使用中,由于编码器无法直接返回电机转速
ω
\omega
ω
,因此可以通过计算一定时间内的编码值变化量来表示电机的转速(也即用
平均速度
代表
瞬时速度
)。当电机转速比较高的时候,这样的方式是可以的;但是在位置控制模式的时候,电机的转速会很慢(因为是要求转子固定在某个位置嘛),这时候用平均测速法会存在非常大的误差(转子不动或者动地很慢,编码器就没有输出或者只输出1、2个脉冲)。
所以为了避免速度环节带来的误差,在做位置控制的时候可以只使用位置和电流组成的双环进行控制,不过此时需要对位置环做一定的变化,控制框图如下:
由于去掉了速度环,这里的位置环我们使用完整的PID控制,即把微分项加上(因为位置的微分就是速度,这样可以减小位置控制的震荡加快收敛;积分项的作用是为了消除静态误差)。
至此整个控制回路基本上捋清楚了,但是还有一些细节我们没讲到,就是上面框图中的SVPWM模块。
在整个控制流程图里面有
Park变换
和对应的
反Park变换
,但是却没有
Clark变换
对应的
反Clark变换
,取而代之的是一个
SVPWM模块
。
下面会对SVPWM技术进行详细介绍。
空间电压矢量
什么是空间电压矢量?
空间电压矢量是我们在控制电机过程中虚拟出来的一个矢量,既然是矢量,自然是有大小和方向的,那么它的大小和方向是什么呢?
还是以前面
三相逆变驱动电路
那幅图中的状态为例,输入
100
的状态:
此时等效电路如图:
因此电机中三个相电压(相电压是每相相对于电机中间连接点的电压)可以表示为:
其实就是个最简单的分压电路,其中
Ud
c
U_{dc}
U
d
c
是母线电压,也就是电源电压。
如果我们规定指向中心的方向为正,反之为负,那么此时我们可以画出下图中的三个电压矢量
U
a
⃗
、
U
b
⃗
、
U
c
⃗
\vec{U_a}、\vec{U_b}、\vec{U_c}
U
a
、
U
b
、
U
c
(左边),以及它们的合成电压矢量
U
⃗
\vec{U}
U
(右边):
也就是说,这个状态下我们可以认为电机中存在一个矢量
U
⃗
\vec{U}
U
表征的电压(电流);然后根据右手螺旋定则,可以判断出磁场的磁力线方向,也是和矢量
U
⃗
\vec{U}
U
一致的。
再结合前面章节的分析,转子永磁体会努力旋转到内部磁力线和外部磁场方向一致,
所以这个矢量其实就可以表征我们希望转子旋转到的方向,也即所需要生成的磁场方向了
。而这个矢量是会不断在空间中旋转的,它的幅值不变,为相电压峰值
U
d
c
U_{dc}
U
d
c
,且以角速度
ω
=
2
∗
π
∗
f
\omega=2*\pi*f
ω
=
2
∗
π
∗
f
匀速旋转。
我们后面将会看到,SVPWM算法的目的,就是使用三相桥的开关状态把在
空间中旋转的矢量
表示出来,我们把这个矢量称为
空间电压矢量
。
用数学公式来表示的话就是:
为了研究各相上下桥臂不同开关组合时逆变器输出的空间电压矢量,我们定义开关函数
S
x
(
x
∈
a
,
b
,
c
)
S_x(x\in a,b,c)
S
x
(
x
∈
a
,
b
,
c
)
为:
上桥臂导通下桥臂导通
(
S
a
,
S
b
,
S
c
)
(S_a,S_b,S_c)
(
S
a
,
S
b
,
S
c
)
的全部可能组合共有8个,包括 6个非零矢量 :
U
1
(
001
)
、
U
2
(
010
)
、
U
3
(
011
)
、
U
4
(
100
)
、
U
5
(
101
)
、
U
6
(
110
)
U_1(001)、U_2(010)、U_3(011)、U_4(100)、U_5(101)、U_6(110)
U
1
(
001
)
、
U
2
(
010
)
、
U
3
(
011
)
、
U
4
(
100
)
、
U
5
(
101
)
、
U
6
(
110
)
和两个零矢量:
U
0
(
000
)
、
U
7
(
111
)
U_0(000)、U_7(111)
U
0
(
000
)
、
U
7
(
111
)
可以看出零矢量状态下电机三相间电压都为0不产生转矩(不考虑反电动势)。
下面以其中一种开关组合为例分析,假设
S
x
U
4
(
100
)
S_xU_4(100)
S
x
U
4
(
100
)
,也即这张图中的状态:
如前文分析,此时的电压矢量为AO方向,大小为
U
d
c
U_{dc}
U
d
c
,我们把这个矢量画在坐标轴中如图:
注意上图中的(100)矢量方向和AO方向是相反的(变成OA方向),这跟正方向的定义有关,这样的规定更直观一些。
同时可以注意到两个零矢量其实和原点重合了,因为这两个状态下电机中产生力矩的磁场为0(不考虑旋转过程中的反电动势产生的阻力力矩)。
同理,上图中还可以看出其余5个空间电压矢量,它们的端点组成了一个正六边形,同时把平面划分成了
六个扇区
(也就是图中的Ⅰ、Ⅱ、Ⅲ、Ⅳ、Ⅴ、Ⅵ)。
那么这里问题就来了:由这6个空间电压矢量只能产生6个方向的力矩啊,我们怎么产生任意方向的力矩呢?
SVPWM技术
既然是“矢量控制”,当然是有办法的,答案就是:
使用这6个空间电压矢量作为基向量来合成任意矢量
。在每一个扇区,选择相邻两个电压矢量以及零矢量,按照
伏秒平衡原则
来合成每个扇区内的任意电压矢量,即:
离散化后等效为下式:
式子中的
U
r
e
f
U_{ref}
U
re
f
是我们期望得到的电压矢量,T是一个PWM周期。
U
x
U_x
U
x
和
U
y
U_y
U
y
分别是用于合成
U
r
e
f
U_{ref}
U
re
f
的两个空间电压矢量,也就是上面说的6个基向量中的两个,至于是哪两个?这跟
U
r
e
f
U_{ref}
U
re
f
所在的扇区有关,比如 在Ⅰ扇区,那么
U
x
U_x
U
x
和
U
y
U_y
U
y
就是
U
4
U_4
U
4
和
U
6
U_6
U
6
;
T
x
T_x
T
x
和
T
y
T_y
T
y
就是在一个周期T中
U
x
U_x
U
x
和
U
y
U_y
U
y
所占的时间。
U
0
∗
U^*_0
U
0
∗
指的是两个零矢量,可以是
U
0
U_0
U
0
也可以是
U
7
U_7
U
7
,零矢量的选择比较灵活,通过合理地配置零矢量可以让空间电压矢量的切换更平顺,后面会做说明。
所以上面公式的含义就是:
我们可以周期性地在不同空间电压矢量之间切换,只要合理地配置不同基向量在一个周期中的占空比,就可以合成出等效的任意空间电压矢量了
。
是不是跟PWM的思想完全一样呢,这也是为什么这个方法被成为SVPWM(空间电压矢量脉宽调制)。
下面举一个栗子,假设我们要合成图中所示的
U
r
e
f
U_{ref}
U
re
f
,在Ⅰ扇区:
显然我们可以通过
U
4
U_4
U
4
和
U
6
U_6
U
6
来合成
U
r
e
f
U_{ref}
U
re
f
,那么如图将
U
r
e
f
U_{ref}
U
re
f
投影分解到
U
4
U_4
U
4
和
U
6
U_6
U
6
的方向,由正弦定理有:
又因为
∣
U
4
∣
=
∣
U
6
∣
=
2
3
U
d
c
|U_4|=|U_6|=\frac{2}{3}U_{dc}
∣
U
4
∣
=
∣
U
6
∣
=
3
2
U
d
c
,所以可以计算得到
T
4
T_4
T
4
和
T
6
T_6
T
6
:
其中m为SVPWM的调制系数(即调制比):
m
=
3
⋅
∣
U
r
e
f
∣
U
d
c
m=\sqrt{3}\cdot\frac{|U_{ref}|}{U_{dc}}
m
=
3
⋅
U
d
c
∣
U
re
f
∣
显然在电流环控制过程中m设置得越大代表了
期望力矩越大
。
而零矢量分配的时间为:
T
0
=
T
7
=
1
2
(
T
−
T
4
−
T
6
)
T_0=T_7=\frac{1}{2}(T-T_4-T_6)
T
0
=
T
7
=
2
1
(
T
−
T
4
−
T
6
)
为什么
T
0
=
T
7
T_0=T_7
T
0
=
T
7
?这是我们将PWM波形设定为中央对齐模式对称配置零矢量的结果,后面会提到。
现在一个周期内所有状态的持续时间我们都得到了,还差一个顺序,也就是
各个状态切换的顺序
。
问题:难道不是任意顺序都可以嘛?反正是做积分,重要的是持续时间而不是顺序,一个周期内怎么切换都行啊。
是的,理论上任何切换顺序都是ok的,但是实际中我们需要考虑更多限制,比如因为MOS管存在开关损耗,
我们希望能尽量减少MOS管的开关次数
,那么以最大限度减少开关损耗为目的,我们就可以设计出下面的切换顺序:
至此,SVPWM的工作完成了,我们得到了每一时刻所需要的空间电压矢量以及它们持续的时间,在处理器中赋值给对应通道的捕获比较寄存器产生相应的三个PWM波形,控制MOS管的开关,进而产生我们期望的电压、电流、力矩。