FOC
FOC (Field-Oriented Control) . 磁场定向控制 . 也被称为矢量控制(Vector Control)
是目前无刷直流电机(BLDC)和永磁同步电机(PMSM)高效控制的最优方法之一。
FOC旨在通过精确地控制磁场大小与方向 , 使得电机的运动转矩平稳 , 噪音小 , 效率高 , 并且具有高速的动态响应从而对无刷电机进行像素级控制。
FOC驱动器和无刷电调的区别
航模中的无刷电调就是电子调速器(ESC)
FOC | 电调 | |
---|---|---|
低速控制 | 精确控制 | 很难控制 |
电机换向 | 性能优秀 | 很难实现 |
力矩控制 | 电流(力矩).速度.位置三环控制 | 转速控制 |
噪音 | 正弦波控制,噪音小 | 方波驱动,噪音大 |
兼容性 | 需要参数调整 | 不需要参数调整 |
算法复杂度 | 高 | 低 |
成本 | 高 | 低 |
电机原理
基础知识
左手定则
用左手确定电流(四指)\磁场(掌心)\安培力(拇指)的方向
右手定则
用右手确定导体运动(拇指)\磁场(掌心)\感应电动势(四指)的方向
即: 切割磁场的导线产生感应电动势
又: 根据感应电动势定位转子的位置 . 即无感无刷电机的闭环
右手螺旋定则(安培定则)
- 右手握住螺旋线圈, 四指为电流方向, 那么大拇指方向为N磁极方向
- 右手握住直线导线, 大拇指方向为电流方向, 那么四指弯曲的方向为磁感线方向
电机转动
PWM(脉冲宽度调制)
本质是面积等效原理 : 冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。
冲量即指窄脉冲的面积。这里所说的效果基本相同,是指环节的输出响应波形基本相同。
例如
一个灯泡只有开关两种状态,那么要实现50%的亮度 , 可以让其一半时间开 , 一半时间关 , 交替开关 , 只要频率足够高 , 在人眼(低通滤波器)中看起来就是50%亮度的样子 . 而”开的时间占整个开关周期的比例” 就叫 占空比
利用PWM可以实现离散的开关量来模拟连续的电压值
无刷电机原理
一般电机由定子与转子组成 . 定子一般为线圈 , 而转子为永磁体
定子线圈通电后产生磁场变成了电磁铁 , 从而吸引(排斥)转子永磁体 , 进而达到转动电机的目的
三相二极内转子电机为例:
定子的三相绕组有星形联结和三角联结两种方式 , 而星形联结的二二导通方式最为常用
如图 , 每一相引出一个导线的一头 , 而另一头和其他的导线两两相连
此时对A \ B 极分别施加正电压和负电压 , 那么根据右手螺旋定则可以判断出线圈磁极的方向(红蓝箭头) , 此时绿色箭头为AB线圈的合力方向 . 当转子会受到该合力直至转动到与之平行的状态 (图右边) . 另 : 当转子与OC连线平行时 , 受到的力矩最大 .
以此类推 , 三相线有6中排列组合的电流方向 , 转子便有了六中状态
依次交替变换通电 , 转子便被定子产生的变换磁场牵引不断转动.
而这个换向操作 , 就是由驱动器完成
BLDC 与 PMSM
无刷电机可分为无刷直流电机(BLDC) 与 永磁同步电机(PMSM)
结构大同小异 , 主要区别在于制造方式(线圈绕组方式)不同导致的特性差异(比如反电动势的波形)
由于转子在磁场中只有6个稳定的状态 , 因此旋转过程其实是不平滑的 . 存在扭矩的抖动 (转动未通电的电机 , 会明显感觉到这种”颗粒感”) . 为了解决这个问题 , 从”硬件”和从”软件”出发有两种解决方案 , 这就衍生了BLDC 与 PMSM 的区别
BLDC的反电动势的波形接近梯形波
我们增加电机槽 , 极对数(磁铁对数),从而减少抖动
BLDC也可以结合抗齿槽算法的FOC进行力矩补偿实现平滑控制
PMSM的反电动势的波形接近正弦波
我们用软件和算法结合PWM技术将方波转变成等效的SPWM正弦波或者SVPWM马鞍波 , 这就是FCO的实现原理
动图对比


- 青色为转子磁场 , 洋红色为定子磁场
- 图1右上表为速度-时间表,右下下表为扭矩-时间表
- 定子磁场与转子磁场之间的夹角在60度值120度之间波动(这是速度和扭矩波动背后的原因)
- 两个磁场夹角为90度时扭矩最大 , 但无法一直保持在90度
- 磁场定向控制大大降低了系统响应的纹波 , 还可以使用弱磁技术使得电机以高于额定速度的速度运行
驱动电路实现
无刷电机的驱动电路主要使用三相逆变电路来实现
所谓逆变电路就是将直流电变为交流电 . 或者说产生不同电流流向的电路
逆变电路的实现一般是采用半桥MOS电路来制作的 . 原型如下 .其实就是两个MOS管组成的上桥臂和下桥臂 , 中间引出一条输出线
用3个半桥臂就可以组成三相逆变电路 , 每个半桥引出的一根输出线 跟 无刷电机的一相线相连 , 就完成了基本的无刷驱动电路
MOS管可以看做电压控制的高速电子开关 . 在MOS管的栅极施加高电平或低电平 , 就可以控制MOS源极和漏极的导通或者关闭 .
如图 , 当导通U+ , V- , W- ,其余关闭时 , 那么就可以让电流从电源正极流过电机U相 , 流经V , W 相 ,然后回到电源负极
注意 , 此示例三相线圈都会有电流 . 相比两相线圈通电 , 这会提供更多的扭矩
状态编码
- 上桥开通下桥断开定义为1
- 下桥开通上桥断开定义为0
这样三组半桥就一共有8中状态 , 分别为000 , 001 , 010 , 011 , 100 , 101 , 110 , 111
不可上下同时导通,否则短路
实际上半桥驱动电路的实现会比上面的分析要复杂一些,比如需要考虑开关管的开关频率、开启和关断时间不对称、死区问题等等 . 最好使用专用的半桥MOS栅极驱动IC来实现
旋转的三相电机波形
当我们匀速旋转转子 , 然后示波器观察到的三相输出电压(反电动势产生的电压)如下三根正弦曲线 , 而三根曲线两两相位差为120度
tip: 实际三相发电机的发电原理是这样的 , 输出的就是三相幅值为220v的交流电(线电压为380v , 即 $\sqrt{3} \times 220V$)
反过来在三相无刷电机的三相线圈上输入上述三相正弦电压 , 那么就可以驱动无刷电机平稳高效的旋转了 .
这就是FOC驱动无刷电机的基本手段 . 即通过计算所需电压矢量 , 使用SVPWM技术产生调试信号 , 驱动三相逆变电路 , 合成出等效的三相正弦电压驱动电机
FOC控制原理
- 力矩和电流成正比
- 转速和电压成正比
本质是电机旋转运动的数学模型
使定子磁场与转子磁场相互垂直 , 从而获得最大扭矩
FOC控制有效减少纹波
利用Clarke\Park变换将三相交流信号转换为直流信号$I_d$与$I_q$
PID控制器控制$I_d$与$I_q$
交轴$I_q$电流有助于产生扭矩 , 而直轴$I_d$不产生任何扭矩
—->$I_d$归零 , $I_q$最大化
小结
电机驱动流程如下
$$
I_q\text{需求的电机力矩} \xrightarrow{Park逆变换}
\left[
\begin{matrix}
I_α \\
I_β \\
\end{matrix}
\right] =
\left[
\begin{matrix}
cosθ & sinθ \\
-sinθ & cosθ \\
\end{matrix}
\right]^{-1}
\left[
\begin{matrix}
I_d\\
I_q \\
\end{matrix}
\right]
\xrightarrow{Clark逆变换}
\left\{
\begin{array}{ll}
i_a = I_α \\
i_b = \frac{\sqrt{3}I_β - I_α}{2} \\
i_c = \frac{-I_α - \sqrt{3}I_β}{2} \\
\end{array}
\right.
\xrightarrow{}驱动器
$$
同理反之 , 从右往左形成闭环
FOC算法Pipeline

此图以电流闭环控制为例 , 让电机始终产生一个恒定的力矩
控制器的输入是最左边的$I_{q\underline{}ref}$ 和 $I_{d\underline{}ref}$ , 两个变量经过PID控制器进行反馈调节 , 其中还涉及到Park 变换和 Clarke(克拉克) 变换 , 最后通过SVPWM(正弦波相位控制)作用到三相逆变器上进而控制电机 ; 而PID控制器的反馈量 , 是对电机输出电流的采样值 .
过程:
- 1.对电机的三相电流进行采样得到$I_a$ , $I_b$ , $I_c$
- 2.将$I_a$ , $I_b$ , $I_c$ 进行Clarke 变换得到$I_α$ , $I_β$
- 3.将$I_α$ , $I_β$ 进行Park 变换得到$I_q$ , $I_d$
- 4.计算$I_q$ , $I_d$ 和其设定值 $I_{q\underline{}ref}$ 和 $I_{d\underline{}ref}$ 的误差
- 5.将上述误差输入两个PID(此处只用到PI)控制器 , 得到输出的控制电压$U_q$ , $U_d$
- 6.将$U_q$ , $U_d$ 进行反Park 变换得到$U_α$ , $U_β$
- 7.用$U_α$ , $U_β$ 合成电压空间矢量 , 输入SVPWM 模块进行调制 , 输出该时刻三个半桥的状态编码值
- 8.按照编码控制三相逆变器的MOS管开关 , 驱动电机
- 9.循环此过程
Clark变换与Park变换
要平稳地驱动三相电机转动 , 我们需要生成三个三相位相差120度的正弦波 . 但MOS管只有通断两种状态 , 要生成连续变化的正弦波 , 就要用到PWM技术 . 所谓的SPWM

如上图 , 利用坐标系中的正弦波和三角波的交点投影到下面的坐标轴 , 以此确定PWM的真空比变化规律 , 这样合成的PWM波 , 经过低通滤波器后就等效为了一个正弦波
- SPWM就是在PWM的基础上用正弦波来调制合成的具有正弦波规律的方波
- 即SPWM是”动态”的占空比
- 但SPWM调制方式在FOC中并不常用 , 因为SPWM相较于SVPWM的**母线电压利用率要低15%
- 从控制角度来说,要处理\跟踪三个正弦波太过麻烦::对于非线性信号进行准确控制就要使用复杂的高阶控制器 , 这对于建模成本\处理器算力\控制实时性等都是不利的
Clark变换
降维解耦的过程

- 由于三相电流为相位差为120度的$sin$曲线 , 所以可以将$i_a , i_b , i_c$ 表示为互成120度夹角的矢量 .
- 将其中$i_a$作为α轴 , $i_b , i_c$分别投影至β轴,即可对三个变量进行降维
- 即把三相$sin$状波形问题转换为了二维平面的双变量$I_α , I_β$问题.
- 等功率变换: 矩阵等式右侧乘上$\sqrt{\frac23}$
- 等幅值变换: 矩阵等式右侧乘上$\frac23$ ; $\xrightarrow{}$建立一个$I_α = i_a$的简化运算环境 .
- $$\left\{
\begin{array}{ll}
I_α = I_a \\
I_β = \frac{1}{\sqrt{3}}\times(2i_b + i_a) \\
\end{array}
\right.
$$ - 由于基尔霍夫电流定律的存在 , 上式中不需要用到$i_c$
- 反映在硬件上 , 我们可以省去一路的电流传感器
- 克拉克逆变换即知道$I_α ; I_β$ 求 $i_a ; i_b ; i_c$
- $$\left\{
回到控制流程第一步 ,我们使用串联的采样电阻(Shunt)进行电流采样
由于电机工作的电流一般很大,所以采样电阻的阻值非常小,甚至和导线的电阻接近了,因而实际的采样电路PCB设计的时候还有一些讲究,比如使用开尔文接法(Kelvin connections)。
但我们实际电路设计时可以不使用三个采样器 ( 实际有单采样电阻 \ 双采样电阻 和 三采样电阻接法) . 只需要两个就够了 . 因为基于基尔霍夫电流定律(KCL) , 在任一时刻, 流入节点的电流之和等于流出节点的电流之和 , 即
$$ I_a + I_b + I_c = 0 $$
知道其中两个就知道第三个了
然而 , $ I_a I_b I_c $三个基向量是非正交的
可以使用线性代数做一个简单的基变换将其正交化为一个直角坐标系 , 新的 坐标系命名为$α-β$坐标系
$$
\left\{
\begin{array}{ll}
I_α = I_a + cos(\frac{2π}{3})I_b + cos(\frac{2π}{3})I_c \\
I_β = sin(\frac{2π}{3})I_b - sin(\frac{2π}{3})I_c \\
\end{array}
\right.
$$
其实就是简单的坐标系投影计算 , 矩阵形式:
$$\left[
\begin{matrix}
I_α \\
I_β \\
\end{matrix}
\right] =
\left[
\begin{matrix}
1 & -\frac{1}{2} & -\frac{1}{2} \\
0 & \frac{\sqrt{3}}{2} & -\frac{\sqrt{3}}{2} \\
\end{matrix}
\right]
\left[
\begin{matrix}
I_a \\
I_b \\
I_c \\
\end{matrix}
\right] $$
于是变换后的波形还是正弦波 , 只是由三个变量变为了两个变量 , 其频率不变
_注意这里的$I_α$ , $I_β$ 是虚拟出来的变量 , 最后还要返回去在应用到三相逆变器上
Park变换
Clark变换的 $α-β$ 坐标系是相对于定子静止的 . Park变换的 $q-d$坐标系是相对于转子静止的
- θ 称为电角度 . 即Q-D坐标系因转动而造成的与$α-β$的差角 , 由编码器提供数值
- Park的逆变换: 知道$i_d , i_q$去求 $I_α$ , $I_β$
- 通常,我们只要设置$i_q$ , 它代表了我们希望输出的力矩 , 而希望$i_d = 0$ , 它没有提供力矩 .
- 此时一个$i_q$就可以通过Park逆变换生成$I_α$ , $I_β$ , 进而通过Clark逆变换(SVPWM)生成三相电流通断情况 , 最终作用到电机上
- 一生二 , 二生三 …
上一步由三维变量变为了二维变量 , 但新的变量还是非线性的(正弦)
我们将Clark变换后得到的$α-β$坐标系旋转$θ$度 , 其中$θ$是转子当前的角度

变换公式如下
$$
\left\{
\begin{array}{ll}
I_d = I_αcos(θ) + I_βsin(θ) \\
I_q = -I_αsin(θ) + I_βcon(θ) \\
\end{array}
\right.
$$
其实就是简单的坐标系投影计算 , 矩阵形式:
$$\left[
\begin{matrix}
I_d \\
I_q \\
\end{matrix}
\right] =
\left[
\begin{matrix}
cos(θ) & sin(θ) \\
-sin(θ) & cos(θ) \\
\end{matrix}
\right]
\left[
\begin{matrix}
I_α \\
I_β \\
\end{matrix}
\right] $$
- 也就是说 , d-q 坐标始终是跟着转子旋转的
- 我们通过编码器输入转子的实时旋转角度
- 此时一个匀速旋转向量在这个坐标系下变成了一个定值(参考系相对该向量静止了)
- 此时两个控制变量都被线性化了
PID控制
PID(比例 \ 积分 \ 微分)是一个工业界偏爱的线性控制器
在FOC控制中主要用到三个PID环 , 有内到外依次是电流环 \ 速度环 \ 位置环
也就是说 , 我们通过电流反馈来控制电机电流(扭矩) –> 然后通过控制扭矩来控制电机的转速 –> 最后通过控制转速来控制电机的位置
电流环

前文提到FOC控制9步骤 , 只用到了PI控制 , 没有引入微分 , 因为如果推导一下电流和电压的传递函数会发现这其实是一个一阶惯性环节(而实际上我们可以通过零极点对消来简化掉PI参数 , 只需要控制一个参数 即 电流带宽 即可)
我们将转子磁链进行了解耦 , 分解为了转子旋转的径向和切向两个方向的变量:
- 其中$I_q$是我们需要的 , 代表了期望的力矩输出
- $I_d$是我们不需要的 , 我们希望尽可能把它控制为0

通过PID控制器使用上述输入( 电流采样值 \ 编码器位置) 和输出( MOS管开关状态) 完成对电机电流的闭环控制
加入速度环
速度-电流双环控制
上图$Speed_{ref}$是速度设定值 , $w$是电机的转速反馈 , 可以通过电机编码器或霍尔传感器计算得到 , 依然使用PI控制
最外一层位置环 , 也就是可以控制电机旋转到某个精确的角度并保持
tip:: 在实际使用中 , 由于编码器无法直接返回电机转速$w$ , 因此可以通过计算一定时间内的平均速度得到 . 当电机转速比较高时 , 这样的方式是可以的 , 但在位置控制模式时 , 电机转速会很慢 , 这时候平均测速法会存在非常大的误差 ( 转子不动或很慢,编码器就没有输出或只有一两个脉冲)
为了避免速度环带来的误差 , 在位置控制的时候可以只使用位置和电流组成的双环进行控制 , 不过此时需要对位置环做一定的变化::
去掉了速度环 , 这里的位置环使用完整的PID控制 , 即把微分加入( 因为位置的微分就是速度 , 这样可以减少位置控制的震荡加快收敛 ; 积分项的作用是为了消除静态误差”稳态误差”)
空间电压矢量
Park对应有反Park , 但Clark没有反Clark , 取而代之的是SVPWM
空间电压矢量是我们在控制电机过程中虚拟出来的一个矢量$\overset{\rightarrow}{U}$
转子永磁体会努力旋转到内部磁力线和外部磁场方向一致 , 所以这个矢量其实就可以表征我们希望转子旋转到的方向 , 也即所需要生成的磁场方向
相电压峰值为$U_{dc}$ , 角速度$w = 2πf$
SVPWM算法的目的 , 就是使用三相桥的开关状态把空间中旋转的矢量表示出来 , 我们把这个矢量称为空间电压矢量
$$
\left\{
\begin{array}{ll}
U_A(t) = U_{dc}cos(2πft) \\
U_B(t) = U_{dc}cos(2πft - \frac{2}{3}π)\\
U_C(t) = U_{dc}cos(2πft + \frac{2}{3}π)\\
\end{array}
\right.
$$
为了研究相上下桥臂不同开关组合时逆变器输出的空间电压矢量 , 我们定义开关函数$S_x(x \in a,b,c)$
$$
S_x =
\left\{
\begin{array}{ll}
1 , 上桥臂导通 \\
0 , 下桥臂导通 \\
\end{array}
\right.
$$
$(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_0(000) ; U_7(111)$
六个空间电压矢量把空间划分为了六个扇区( 即正六边形 )
SVPWM 技术
六个空间电压矢量智能产生6个方向的力矩 , 但可以使用这6个空间电压矢量作为基向量来合成任意矢量
在每一个扇区 , 选择相邻两个电压矢量以及零矢量 , 按照伏秒平衡原则开合成每个扇区内的任意电压矢量 , 即:
$$
\int_0^TU_{ref}dt = \int_0^{T_x}U_xdt + \int_{T_x}^{T_x + T_y}U_ydt + \int_{T_x + T_y}^{T}U_0^*dt
$$
离散化后等效
$$
U_{ref}T = U_xT_x + U_yT_y + U_0T_0
$$
式子中的 $U_{ref}$ 是我们期望得到的电压矢量,T是一个PWM周期
$U_x$ 与 $U_y$ 用于合成$U_{ref}$ , 具体是哪两个基向量取决于$U_{ref}$所在的扇区
$U_0$指的是两个零矢量 , 通过合理地配置零矢量 , 可以让空间电压矢量的切换更加平顺
所以上面的公式解释为: 周期性地在不同空间电压矢量之间切换 , 只要合理地配置不同基向量在一个周期中的占空比 , 既可以合成出等效的任意空间电压矢量
零矢量的选择 , 理论上可以任意 , 但实际中要考虑MOS管存在开关损耗
我们希望尽可能地减少MOS管的开关次数 .
每个状态切换的时候,都只有一个相发生了转变:000->100->110->111->110->100->000,这也是所谓的七段式SVPWM调制法
同时 , 我们通过在合理的位置插入两个零矢量 , 并且对零矢量在时间上进行了平均分配 , 以使产生的PWM对称 , 从而有效的降低了PWM的谐波分量
力矩计算公式
通过给定$I_{q}(A)$电流和$KV$值 可以计算出当前电机的力矩
$$Torque(N.M) = 8.27 * \frac{I_{q}(A)}{KV}$$
电流采样
目的
控制电机力矩 & 保护电机
检测方法
电阻采样检测
通过串入一个采样电阻 , 通过测量该电阻的电压从而得到电流值
- 优点: 原理简单 , 成本低 , 设计方便
- 缺点: 有一定的功率损耗 , 高精度电阻温度漂移严重 , 在某些温度变化较大的情况下检测效果较差
霍尔电流传感器检测法
利用霍尔效应 , 电流流经霍尔电流传感器即可转换为霍尔电压 , 从而计算得到相电流大小
- 优点: 检测电流范围大 , 功耗小
- 缺点: 成本高 , 占用空间 , 测量小电流时需要较大的电压偏置 , 容易引起误差
检测方式
在线电流采样

- 优点: 简易 , 精确 . ADC可以在任何时候进行采样以获得电流
- 缺点: 需要高精度双向放大器具有比低侧或高侧放大器更好的PWM抑制
- PWM抑制:滤波…(INA240 芯片手册明确说明此芯片不需要滤波..P17)
低侧电流采样


- 优点: 最常见的电流检测技术 . 因为其不需要高性能PWM抑制的电流检测放大器(在线检测放大器) , 也不需要支持高压的放大器(如高侧放大器) .
- 缺点: 只有相应低侧mosfet开启时 , 通过采样电阻的电流才是相电流 , 这意味着ADC采样频率要与PWM驱动频率同步
高侧电流采样

最不常见的一种 .
- 需要支持高压的放大器
- 采样电阻位于高侧MOSFET和电源之间 , 会令放大器始终会有高压差
- ADC采样频率需与PWM驱动频率同步