2、FOC控制基础:Clark变换、Park变换、SVPWM调制、电流环与速度环架构

好,咱们正式开始啃FOC这块硬骨头。很多初学者一上来就被Clark、Park这些名字唬住了,觉得是玄学。其实说白了,FOC就是一套让电机“听话”的数学魔术。我当年第一次调通FOC的时候,看着示波器上那三条平滑的正弦电流,心里那个激动啊——嗯,从那以后我就知道,这玩意儿是电机控制的终极答案。

核心思想:FOC的本质是把三相交流电机的控制,等效成直流电机的控制。通过坐标变换,把静止的三相坐标系(ABC)先变到两相静止坐标系(αβ),再旋转到与转子磁场同步的旋转坐标系(dq)。在dq坐标系下,电流被分解成“励磁分量”和“转矩分量”,可以独立控制,互不干扰。

2.1 Clark变换:从三相到两相

Clark变换,也叫3s/2s变换。它的任务是把三相静止坐标系(A、B、C)下的电流,投影到两相静止坐标系(α、β)上。你想想看,三相绕组在空间上相差120°,我们完全可以用两个正交的轴(α和β)来等效它们产生的合成磁动势。

数学上很简单,就是矩阵乘法。我习惯用等幅值变换,因为这样变换前后的电流幅值不变,调试起来更直观。

// Clark变换(等幅值)
// 输入:三相电流 ia, ib, ic
// 输出:两相静止电流 i_alpha, i_beta

i_alpha = ia;
i_beta  = (ia + 2 * ib) / sqrt(3);

我的经验:实际项目中,三相电流之和不一定为零(因为采样误差或硬件偏置)。我建议在Clark变换之前,先做一次“零序电流补偿”:i_zero = (ia + ib + ic) / 3,然后用 ia -= i_zero, ib -= i_zero, ic -= i_zero。这一步能有效抑制电流环的1倍频波动。

2.2 Park变换:从静止到旋转

Clark变换之后,我们有了αβ坐标系下的电流。但这两个分量还是交流量,没法直接做PI控制(PI对交流量的跟踪有静差)。这时候Park变换就登场了——它把αβ坐标系旋转一个角度θ(转子电角度),得到dq坐标系下的直流量。

θ从哪里来?从编码器或者霍尔传感器来。这就是为什么我说“编码器与FOC采样同步”是核心中的核心。θ不准,Park变换就白搭,电流环直接崩掉。

// Park变换
// 输入:i_alpha, i_beta, theta(转子电角度)
// 输出:i_d, i_q

i_d =  i_alpha * cos(theta) + i_beta * sin(theta);
i_q = -i_alpha * sin(theta) + i_beta * cos(theta);

避坑指南:我曾经在一个项目里,因为θ的零点没对齐,导致电机一启动就“嗡嗡”响,电流直接过流保护。后来发现是编码器的零位和电机反电动势的零位差了30°电角度。记住:θ的零点必须和电机反电动势的过零点对齐,否则你的FOC就是“失控”的。

2.3 SVPWM调制:让逆变器输出正弦波

有了dq轴的目标电压(Ud_ref和Uq_ref),经过反Park变换得到Uα和Uβ,接下来就要让逆变器输出对应的三相电压。SVPWM(空间矢量脉宽调制)就是干这个的。

相比传统的SPWM,SVPWM的母线电压利用率更高(能到1.0,SPWM只有0.866),谐波也更小。说白了,同样的母线电压,SVPWM能让电机跑得更快。

SVPWM的核心是判断参考电压矢量落在哪个扇区,然后计算两个相邻基本矢量的作用时间。我直接给个常用的扇区判断逻辑:

// 扇区判断(基于U_alpha, U_beta)
// 返回 1~6 对应六个扇区

U1 = U_beta;
U2 = (sqrt(3)/2) * U_alpha - 0.5 * U_beta;
U3 = (-sqrt(3)/2) * U_alpha - 0.5 * U_beta;

sector = 0;
if (U1 > 0) sector |= 1;
if (U2 > 0) sector |= 2;
if (U3 > 0) sector |= 4;

我的习惯:在计算SVPWM占空比时,我会把死区补偿也考虑进去。死区时间会导致电压误差,尤其在低速时影响很大。我一般用“电流极性判断法”做死区补偿——根据三相电流的方向,在占空比上叠加一个修正量。效果立竿见影。

2.4 电流环与速度环架构

FOC的控制架构是典型的串级控制:内环是电流环,外环是速度环(再外面还可以加位置环)。电流环的带宽通常比速度环高5~10倍,这样才能保证速度环的指令能被电流环快速跟踪。

我画了一张架构图,你看一眼就明白了:

FOC串级控制架构图 速度环 PI d轴电流 PI q轴电流 PI 反Park + SVPWM 逆变器 + PMSM 编码器 电流采样 说明:速度环输出作为q轴电流环的给定(转矩指令),d轴电流环的给定通常设为0(最大转矩电流比控制)。

从图上你能看到:速度环的输出作为q轴电流环的给定(转矩指令),d轴电流环的给定通常设为0(除非你要用弱磁控制)。两个电流环的输出经过反Park变换和SVPWM,驱动逆变器输出三相电压。

反馈路径上,编码器提供转子位置θ和速度,电流采样提供三相电流。这两个反馈的同步性,直接决定了FOC的性能。我后面会专门用一章来讲采样同步的问题——这里先埋个伏笔。

2.5 关键参数对比

我把几个核心模块的输入输出和注意事项整理成了一张表,方便你对照:

模块 输入 输出 注意事项
Clark变换 ia, ib, ic iα, iβ 先做零序补偿,再变换
Park变换 iα, iβ, θ id, iq θ必须与反电动势零点对齐
电流环PI id_ref, iq_ref, id_fb, iq_fb Ud_ref, Uq_ref 带宽通常设为1~2kHz
SVPWM Uα, Uβ 三相占空比 记得做死区补偿
速度环PI ωref, ωfb iq_ref 带宽通常为电流环的1/5~1/10

再强调一次:电流环的PI参数整定,我建议用“带宽法”而不是“试凑法”。先根据电机的电气时间常数和开关频率,计算出理论带宽,再微调。我曾经见过有人用试凑法调了三天没调出来,换成带宽法半小时搞定。别走弯路。