FOC 参考手册 01 基础

Clarke 与 Park 变换

三相电机会产生三个不断变化的电流。在中等转速下,每个电流每秒都会经过零点一百次,而单独观察任何一个电流都无法提供可供控制的信息。你不能直接对施加 PI 控制——等到控制器纠正完误差时,目标早已发生了变化。

磁场定向控制的第一步是不再从定子视角测量电机,而是从转子视角进行测量。随着转子一起旋转,电流便不再振荡,而变为两个恒定值:一个用于产生转矩,另一个不产生转矩。此时,PI控制器便可正常工作,因为终于有了一个需要调节的常量。

实现这一目标需要对坐标系做两次变换:Clarke 变换将三相坐标归并为两轴正交坐标,Park 变换则将这两个坐标轴旋转至与转子同步。

采样电流经 Clarke 变换与 Park 变换输入控制器,电压指令经 Park 逆变换输出。 测量反馈路径 指令前向路径 i a , i b , i c 三相正弦量 Clarke 3 → 2, 等幅值变换 i α , i β 两相,仍为正弦量 Park 旋转 +θ i d , i q 两路恒定直流量 转子电角度 θ 编码器或无感观测器 v d , v q 来自电流 PI 环 Park 逆变换 旋转 −θ v α , v β 送往 SVPWM 调制器
测量信号沿上方路径输入,控制指令沿下方路径输出。正反变换共用同一个角度,因此角度误差会造成双重损失——读取电流时偏差一次,施加电压时又偏差一次。

一个矢量,三种描述

在展开代数推导之前,先看一张图。下图展示了一个单一的电流空间矢量。在圆内任意拖动即可旋转转子;拖动箭头端点则可改变电流相对于转子的位置。

左图:静止坐标系,其中的d–q旋转轴与转子保持固定。右图:同一空间矢量在三种坐标系下的表示。请注意,当转子旋转时,d和q的轨迹保持不变——它们并不随转子一起转动。

转动转子并观察右侧三个面板:abc 波形沿正弦曲线变化;αβ 波形同样呈正弦变化——Clarke 变换只消去了冗余轴,并未改变信号随时间变化的特性;而 dq 波形则是平坦的直线。

这就是全部思路。以下内容只是确保这一原理成立的必要步骤。

为什么三相反而多余了一相

三相定子绕组在空间上彼此相差120°。每一相都流过电流,并在其各自轴线上产生磁动势。电机并不分别响应这三相电流——它响应的是它们的矢量和,即气隙中某个方向上的单一磁动势。

因此,三个数值却用来描述一个二维对象。多出了一个自由度,而在中性点隔离的星形连接电机中,这个自由度已被固定:

共模电流无处可去。只需两次测量即可确定第三次测量的结果,这也是为何许多驱动器仅配置两个分流电阻的原因。

在试验台上 该约束是接线属性,而非数学属性。断开中性点时该约束成立;将中性点接到电源上则不再成立。三角形接法的电机在线电流上满足该约束,但三角形回路内部会环流三次谐波电流,任何线电流测量都无法观测到它。

Clarke 变换

将三相坐标轴投影到一对正交轴上。令 α 轴与 相轴线重合,β 轴超前 α 轴 90°:

前两行体现了几何投影关系:α 行为 ,β 行为对应的正弦值。第三行为零序分量,即三相的平均值。对于三相对称系统,该分量为零;而在双分流电阻采样的驱动器中,则直接假设它为零。

矩阵前的 2/3 系数

选择 是一种约定,在这一点上,阅读不同教材的工程师们就会产生分歧。

采用 ——即幅值不变(等幅值)约定——时,10 A 的相电流峰值对应 A。幅值直接保持不变,当调试器里的数值需要直接代表安培数时,这正是你想要的特性。代价是功率方程会多出一个系数:。

采用 ——即功率不变(等功率)约定——时,变换矩阵是正交归一化的, 不带额外系数,逆矩阵直接取转置即可。电机理论文献更偏爱这种约定。此时变换后的峰值幅值会比实际相电流大 。

两种约定本身都没有错;不加说明地混用才是常见错误。这样会使转矩常数偏差 22%,而系统仍看起来工作正常。

在试验台上 本站全程采用幅值不变(等幅值)约定,因为实际量产的驱动器固件几乎都采用这种方式。除非另有说明,文中的所有公式、图表与代码示例均以此为前提。

双输入形式

代入 后,得到实际出现在中断处理程序中的版本:

一次乘法和一次加法。α 行化简为 1,这是因为 ——这是幅值不变归一化的一个幸运结果,也是固件偏爱它的又一个理由。

请注意你放弃了什么:由于仅有两路测量,系统没有零序输出,因此电流检测中的共模偏移将变得不可见。它并未消失——而是以直流误差的形式叠加到α和β轴上,并在下游表现为电频率下的转矩脉动。

Park 变换

Clarke 变换把我们留在了静止的定子坐标系中,而转子仍在旋转;Park 变换则让坐标系跟着转子一起旋转,从而追上转子。

令 为转子 d 轴相对于 α 轴的电角度。d 轴沿永磁体磁链方向,q 轴超前 d 轴 90°。

这相当于绕着 旋转:我们并不是在移动矢量,而是在移动观察者。在旋转坐标系中,原本以同步速度旋转的矢量现在静止不动了。

结合 Clarke 变换,对于幅值为 、空间矢量超前 d 轴夹角为 的三相对称电流:

两个常数。输入正弦波,输出直流——前提是 是对的。

一切都取决于 θ

Park 变换的效果完全取决于输入的角度。这正是实际驱动系统容易出问题的地方,有必要直截了当地指出:一个错误的 并不会产生明显错误的结果,而是会产生一个看似合理的结果。

一个恒定的角度误差 会使转子坐标系下的给定电流发生旋转。如果你请求纯 q 轴电流,你得到的是

在 时,你会损失 1.5% 的 q 轴电流——这往往是不易察觉的——同时有 17% 的电流被挤入 d 轴,在那里它会加热电机并削弱磁场。驱动器仍在运转,只是默默地运行在错误的工作点上。

保留的 q 轴电流分流至 d 轴的电流
5°99.6%8.7%
10°98.5%17.4%
20°94.0%34.2%
45°70.7%70.7%
90°0%100%

上表纯粹是几何关系,而且完全精确。若要将其换算为转矩,还需要额外引入一项假设——转矩仅由 产生——这对表贴式电机成立,但对凸极电机不成立。在凸极电机中,分流到 d 轴的电流为负值,会产生磁阻转矩并部分抵消损失;在偏角为 10° 时甚至可能超额补偿。电流环一页对此进行了定量分析。

实际系统中最常见的是由采样延迟和计算耗时引起的滞后角度误差,其大小为 ,因而随转速升高而线性增大。如果一台驱动器在 500 rpm 时调校得非常完美,到了 4000 rpm 效率却莫名下降,十有八九就是在交这笔“相位滞后税”。解决办法是做角度预测补偿,而不是盲目调整环路增益。

逆变换路径

控制器在 dq 坐标系下运算,而逆变器在 abc 坐标系下开关动作,因此在输出侧需要按相反方向依次执行这两次旋转变换。

Park 逆变换就是 Park 变换的转置——旋转矩阵是正交矩阵,因此求逆无需额外计算。但在幅值不变(等幅值)约定下,Clarke 逆变换不是 Clarke 变换的转置,因为必须消去正变换中的 系数;而在功率不变(等功率)约定下,它的逆就是转置。这也再次提醒我们:在复制代码示例之前,务必确认它采用的是哪种约定。

在试验台上 在同一个控制周期内,正、逆 Park 变换应基于同一的基准角 ,但输出侧的 Park 逆变换需要将角度向前预测约 1.5 个 PWM 周期——因为当前计算出的电压要到下一个更新周期才会真正作用于电机,而届时转子已经转过了一定角度。忽略这一预测是导致理论上完好的电流环在高速下失稳的最常见原因。

在代码中

固件实现版本。请注意, 和 只计算一次,并在四次中重复使用——在没有浮点运算单元的设备上,占用中断服务程序(ISR)预算的主要不是变换本身,而是三角函数计算。

/* Amplitude-invariant, two-shunt, star-connected machine. */
static void foc_forward(float ia, float ib, float sin_t, float cos_t,
                        float *id, float *iq)
{
    const float i_alpha = ia;
    const float i_beta  = (ia + 2.0f * ib) * ONE_OVER_SQRT3;

    *id =  i_alpha * cos_t + i_beta * sin_t;
    *iq = -i_alpha * sin_t + i_beta * cos_t;
}

static void foc_inverse(float vd, float vq, float sin_t, float cos_t,
                        float *va, float *vb, float *vc)
{
    const float v_alpha = vd * cos_t - vq * sin_t;
    const float v_beta  = vd * sin_t + vq * cos_t;

    *va = v_alpha;
    *vb = -0.5f * v_alpha + SQRT3_2 * v_beta;
    *vc = -0.5f * v_alpha - SQRT3_2 * v_beta;
}

驱动本网站所有图表的 TypeScript 代码位于 src/core/transforms.ts 中,并与 python/transforms.py 中的 Python 参考实现进行验证——采用相同的约定和数值,精度达到 1e-12。

要点回顾

  • 三相电流可描述为一个二维矢量。Clarke 变换消除了冗余,但并不改变系统的动态特性。
  • Park 变换改变的是观察视角,而非物理信号本身。正弦量之所以变为直流量,只是因为你选择了站在转子坐标系上观察。
  • 和 现在可以通过普通的 PI 控制环路进行控制。这就是其价值所在, 而 FOC 的其余部分正是建立在此基础上的。
  • 这些变换的计算开销极低,几乎从不会成为问题。真正导致驱动系统出错的是输入的角度信息。

接下来讨论 和 在电机中究竟带来什么变化:转矩如何产生、凸极性有什么作用,以及为什么 通常是合适的默认值,又在何时不再适用。