/notes/foc/foc-control-main-loop

Motor Control//16 分钟

FOC 控制主循环:从电流采样到 SVPWM 发波

按一次 10kHz~20kHz 高速中断的数据流,梳理 FOC 如何从电流与角度采样,一路经过 Clarke/Park、电流 PI、反 Park 和 SVPWM,最终变成三相逆变桥的 PWM 开关动作。

FOCParkClarkeSVPWM电流环

背景:FOC 主循环到底在控制什么

FOC(Field Oriented Control,磁场定向控制)表面上看是在给三相电机输出三路 PWM,但它真正控制的不是“某一相电压应该是多少”,而是电机内部的磁场方向转矩分量

三相电机里的电流天然是交流量:随着转子转动,IaIbIc 会不断变化。如果直接在三相坐标下做 PID,控制器面对的是三个持续旋转的正弦量,调试和稳定性都会变得很困难。

FOC 的思路是先把三相电流变换到随转子同步旋转的 d-q 坐标系里。这样,原本旋转的交流量会被“解旋”成近似直流量:

  • Id:直轴电流,主要对应磁链 / 励磁方向;
  • Iq:交轴电流,主要对应转矩方向。

把交流电机“看成”两个直流通道来控制,这是 FOC 最核心的理解入口。

一次高速中断里的总流程

在实际 MCU 程序中,FOC 主循环通常放在 PWM 或 ADC 触发的高速中断里执行,频率常见为 10kHz~20kHz。一次中断周期内,控制器要完成从采样、坐标变换、闭环调节到 PWM 更新的完整流水线。

FOC 高速主循环

一次 10kHz~20kHz 中断里的数据流水线

采样θ / Ia Ib IcClarkeabc → αβParkαβ + θ → dq电流 PIId/Iq → Vd/Vq反 Parkdq + θ → αβSVPWMVα/Vβ → Ta/Tb/Tc下一次 PWM/ADC 中断继续刷新,形成连续闭环

这条链路里,前半段是在“理解当前电机状态”,中间的 PI 是“决定此刻应该施加什么电压矢量”,后半段则是“把电压矢量翻译成 MOS 管的开关动作”。

第一步:采样与推导

一次控制周期首先要知道两件事:

  1. 转子当前转到哪里;
  2. 三相绕组里当前流过多大的电流。

转子位置一般来自编码器、霍尔传感器或无感估算器。程序先得到机械角度,再乘以电机极对数,换算成电角度 θ

θe = p × θm

其中 θm 是机械角度,p 是极对数,θe 是电角度。电角度 θ 是后面 Park 变换和反 Park 变换的关键。没有它,控制器就不知道当前转子磁场的方向,也就无法把电流正确投影到 d-q 坐标系。

与此同时,ADC 通常采样两相电流,例如 IaIb。在三相三线制电机中,三相电流满足:

Ia + Ib + Ic = 0
Ic = -(Ia + Ib)

到这里,FOC 已经拿到了本轮控制所需的原始反馈量:θIaIbIc

第二步:Clarke 变换

Clarke 变换把三相静止坐标系中的 IaIbIc,转换成两相静止坐标系中的

这一步并没有让电流变成直流量。 仍然处在定子静止坐标系中,它们依然会随着电机旋转呈现交流变化。

Clarke 变换的意义是降维:三相电流在平衡条件下本来就只有两个自由度,因此可以用 α-β 平面上的一个电流矢量来表示。

第三步:Park 变换

Park 变换引入转子电角度 θ,把静止的 α-β 坐标系旋转到随转子同步转动的 d-q 坐标系。

Clarke 与 Park:把三相交流量变成 dq 直流量

abc 静止轴 → αβ 静止轴 → dq 旋转轴

三相静止坐标 abc两相静止坐标 αβ转子旋转坐标 dqabcIa + Ib + Ic = 0ClarkeαβIαβθPark + θdqIdIq

从控制角度看,Park 变换是 FOC 的关键一步。它把原本在定子坐标系中旋转的电流矢量,转换成转子视角下的两个近似直流反馈量:

  • Id:沿着转子磁链方向的电流;
  • Iq:垂直于磁链方向的电流,也就是主要产生转矩的分量。

对于常见表贴式 PMSM / BLDC,很多控制策略会令 Id_ref = 0,让电流尽量全部用于产生转矩;Iq_ref 则代表希望电机输出多大的转矩。

第四步:电流 PI 闭环

得到真实反馈 IdIq 后,FOC 就可以像控制直流量一样做闭环。

电流 PI:目标电流变成目标电压

两个独立 PI 分别控制 d 轴和 q 轴

Id_ref通常为 0Iq_ref转矩目标Σ++d 轴 PIId 误差 → Vdq 轴 PIIq 误差 → Vq电压指令Vd / Vq反馈 Id反馈 Iq

这里有两个独立的 PI 控制器:

  • d 轴 PI:根据 Id_ref - Id 计算 Vd
  • q 轴 PI:根据 Iq_ref - Iq 计算 Vq

电流环的输出不是电流,而是电压。因为控制器能直接施加到电机绕组上的物理量是逆变桥合成出来的电压矢量;电流会在电机电感、电阻和反电动势共同作用下响应这个电压。

如果系统运行在转矩模式,Iq_ref 可以直接来自上位机或控制程序;如果系统运行在速度模式,速度 PID 的输出通常就是 Iq_ref。但无论 Iq_ref 从哪里来,高速 FOC 主循环里的核心闭环仍然是电流 PI。

第五步:反 Park 变换

PI 控制器算出的 VdVq 还在随转子旋转的坐标系中,不能直接送给三相逆变桥。逆变桥固定在定子侧,它需要的是静止坐标系下的电压矢量。

因此下一步要做反 Park 变换:使用同一个电角度 θ,把 VdVq 重新旋转回 α-β 坐标系,得到

可以把这一步理解为:控制器先在转子视角下想清楚“应该推哪个方向、推多大力”,然后再把这个指令翻译回定子绕组实际能执行的电压方向。

第六步:SVPWM 生成

描述的是定子平面中的目标电压矢量。SVPWM(Space Vector PWM,空间矢量 PWM)的任务,就是把这个目标矢量转换成三相桥臂的占空比。

反 Park 与 SVPWM:电压矢量变成占空比

Vd/Vq → Vα/Vβ → 扇区与作用时间

dqVd/Vq反 Park + θαβVrefV1V2V3V4V5V6VrefT1 T2 T0→ Ta Tb Tc

在一个 PWM 周期内,SVPWM 通常会计算:

  • T1:第一个相邻有效矢量的作用时间;
  • T2:第二个相邻有效矢量的作用时间;
  • T0:零矢量的作用时间。

随后这些时间会被换算成三相占空比 TaTbTc,再写入定时器比较寄存器。

第七步:驱动 MOS 管

SVPWM 得到的 TaTbTc 最终会变成定时器的 CCR 值。定时器硬件根据这些比较值输出三路上桥臂 PWM,同时配合互补输出生成三路下桥臂 PWM。

定时器与三相逆变桥

占空比最终变成六路带死区的 MOS 管开关

Ta / Tb / TcSVPWM 占空比TIM CCR比较寄存器互补 PWM6 路 + 死区UVWDC+DC−三相绕组中形成旋转电流矢量

死区时间用于避免同一桥臂上下管同时导通。逆变桥通过高速开关,把直流母线电压斩波成等效的三相交流电压,使三相绕组中形成接近正弦的电流。

当这个过程以 10kHz~20kHz 的频率不断重复时,电机看到的就是一个连续旋转的电压 / 电流矢量,转子也就能平滑跟随目标磁场旋转。

速度环在流程中的位置

双环控制并不是 FOC 主循环的全部,它更像是在电流环外面套了一层较慢的目标生成器。

速度外环的位置

速度环只是低频生成 Iq_ref,主循环仍是高速电流环

低频速度外环,例如 1kHzω_ref目标速度速度 PID输出扭矩需求实际速度反馈 ωIq_ref高频 FOC 电流内环,例如 20kHzId/Iq PI电流闭环SVPWMPWM 发波速度环慢慢给目标,电流环快速兑现成电压矢量

机械系统惯性大,速度变化慢,所以速度环不需要每个 PWM 周期都运行。它只需要周期性地根据速度误差算出新的 Iq_ref

电流环则必须高速运行,因为电磁响应快,PWM 占空比也需要及时更新。因此,在速度模式下可以这样理解:

  • 速度环决定“需要多大转矩”;
  • 这个转矩需求表现为 Iq_ref
  • FOC 主循环负责把 Iq_ref 快速兑现成电压矢量和 PWM 开关动作。

结论

FOC 的完整主流程可以压缩成一句话:

采到三相电流和转子角度后,先通过 Clarke/Park 把电流变成转子坐标系下的 Id/Iq,再用电流 PI 算出 Vd/Vq,经反 Park 变回 Vα/Vβ,最后由 SVPWM 生成 PWM 占空比,驱动三相逆变桥产生旋转磁场。

再进一步简化,就是下面这条流水线:

Ia/Ib/Ic + θ → Iα/Iβ → Id/Iq → Vd/Vq → Vα/Vβ → Ta/Tb/Tc → 六路 PWM → 三相电流与旋转磁场

这就是 MCU 中一次 FOC 高速控制周期最核心的执行骨架。