3、坐标变换:Clarke变换、Park变换及其逆变换的推导、物理意义与实现方法
无感FOC(Field-Oriented Control,磁场定向控制)的核心思想是:将定子三相电流这一组交流时变量,通过两次数学变换,等效为旋转坐标系下的两个直流量(励磁分量与转矩分量),从而将交流电机的控制问题转化为类似直流电机的控制问题。这两次变换正是Clarke变换(三相静止→两相静止)与Park变换(两相静止→两相旋转)。本章将从数学推导、物理意义、工程实现三个维度,彻底讲透这两组变换及其逆变换,并给出在MCU中落地时的数值处理要点。
上图展示了FOC中坐标变换的完整链路。可以看到,Clarke变换将三相电流映射到α-β轴,Park变换再将α-β轴映射到d-q轴。而逆变换则用于将PI控制器输出的电压指令还原为三相占空比。下面我们逐一推导。
3.1 Clarke变换:从三相静止到两相静止
3.1.1 数学推导
设三相电流为 ia、ib、ic,且满足基尔霍夫电流定律:ia + ib + ic = 0(星形连接无中线)。Clarke变换的目标是找到一组正交坐标系(α-β),使得合成磁动势等效。采用等幅值变换(幅值不变,便于PI参数整定),变换矩阵为:
[ iα ] [ 1 -1/2 -1/2 ] [ ia ]
[ iβ ] = [ 0 √3/2 -√3/2 ] [ ib ]
[ ic ]
若三相平衡,则 ic = -ia - ib,代入后简化为:
iα = ia
iβ = (ia + 2*ib) / √3
这个简化形式在工程中极为常用,只需采样两相电流即可。注意:等幅值变换下,iα 的幅值与相电流峰值相等;而等功率变换(系数√(2/3))则用于功率计算场景。FOC电流环通常采用等幅值变换,因为PI调节器的输出限幅可以直接与SVPWM最大相电压对应。
3.1.2 物理意义
Clarke变换的物理本质是投影。它将三相绕组在空间上互差120°的磁动势,投影到两个正交轴上。α轴与A相绕组轴线重合,β轴超前α轴90°。变换后,iα、iβ仍然是交流量(随转子位置变化),但已经变成正交的两相,为后续Park变换提供了旋转坐标系的基础。
3.1.3 实现方法(C语言伪代码)
typedef struct {
int16_t alpha; // Q15格式
int16_t beta;
} Clarke_Out;
Clarke_Out Clarke_Transform(int16_t ia, int16_t ib) {
Clarke_Out out;
int32_t temp;
// iα = ia
out.alpha = ia;
// iβ = (ia + 2*ib) * 0.57735
temp = (int32_t)ia + ((int32_t)ib << 1); // ia + 2*ib
temp = (temp * 18725) >> 15; // 乘以1/√3
out.beta = (int16_t)temp;
return out;
}
注意:如果使用单电阻采样或双电阻采样,需要根据PWM占空比重构三相电流,此时Clarke变换的输入可能是重构后的电流值。另外,当电机处于高速弱磁区时,电流谐波增大,建议在Clarke变换前增加低通滤波器(截止频率设为开关频率的1/10~1/5)。
3.2 Park变换:从两相静止到两相旋转
3.2.1 数学推导
Park变换将α-β轴系旋转θe角度(θe为转子电角度),得到d-q轴系。d轴与转子磁极轴线重合,q轴超前d轴90°。变换矩阵为:
[ id ] [ cosθe sinθe ] [ iα ]
[ iq ] = [ -sinθe cosθe ] [ iβ ]
逆Park变换(用于电压输出)为:
[ vα ] [ cosθe -sinθe ] [ vd ]
[ vβ ] = [ sinθe cosθe ] [ vq ]
注意正负号:Park正变换中,id = iα·cosθ + iβ·sinθ;逆变换中,vα = vd·cosθ - vq·sinθ。符号错误会导致电流环发散,这是初学者最常见的错误之一。
3.2.2 物理意义
Park变换的物理本质是解耦。经过Park变换后,基波分量变为直流量:id 对应励磁分量(产生磁通),iq 对应转矩分量(产生转矩)。对于表贴式PMSM(Ld=Lq),电磁转矩 Te = 1.5·p·λf·iq,与id无关;对于内置式PMSM(Ld≠Lq),还存在磁阻转矩项 1.5·p·(Ld-Lq)·id·iq。因此,FOC的核心就是独立控制id和iq。
3.2.3 实现方法(查表法优化)
// 预计算正弦表,例如1024点,覆盖0~2π
#define SIN_TABLE_SIZE 1024
int16_t sin_table[SIN_TABLE_SIZE];
void Park_Transform(int16_t alpha, int16_t beta, int16_t theta_idx,
int16_t *id, int16_t *iq) {
int16_t sin_t = sin_table[theta_idx];
int16_t cos_t = sin_table[(theta_idx + SIN_TABLE_SIZE/4) % SIN_TABLE_SIZE];
// id = α*cos + β*sin
*id = (int16_t)(((int32_t)alpha * cos_t + (int32_t)beta * sin_t) >> 15);
// iq = -α*sin + β*cos
*iq = (int16_t)(((int32_t)beta * cos_t - (int32_t)alpha * sin_t) >> 15);
}
查表法将三角函数计算转换为内存访问,在Cortex-M4或RISC-V内核上可节省约200个时钟周期。若使用硬件CORDIC外设(如STM32G4系列),则可以直接调用硬件加速。
3.3 逆变换与SVPWM的衔接
电流环PI调节器输出 vd*、vq* 后,需要经过逆Park变换得到 vα*、vβ*,再经过逆Clarke变换得到三相电压指令 va*、vb*、vc*。但实际工程中,通常不显式计算逆Clarke,而是直接将 vα*、vβ* 送入SVPWM模块,由SVPWM直接计算三相占空比。这是因为SVPWM本身就是在α-β轴系下工作的,避免了不必要的往返变换。
| 变换名称 | 输入 | 输出 | 关键系数 | 典型应用 |
|---|---|---|---|---|
| Clarke正变换 | ia, ib, ic | iα, iβ | 1, 1/√3 | 电流采样后 |
| Park正变换 | iα, iβ, θe | id, iq | cosθ, sinθ | 电流环反馈 |
| 逆Park变换 | vd, vq, θe | vα, vβ | cosθ, -sinθ | 电压指令输出 |
| 逆Clarke变换 | vα, vβ | va, vb, vc | 1, -1/2, √3/2 | 直接PWM生成(较少用) |
3.4 案例拆解:一个因坐标变换符号错误导致的电流环发散故障
背景:某量产项目(200W无刷直流电机,霍尔传感器启动,无感FOC高速运行)在低速(500rpm)调试时,电流环PI参数无论怎么调,iq反馈始终存在大幅振荡,且id偏置约0.5A。
初始现象:使用示波器观察相电流,发现电流波形存在明显的直流偏置和低频振荡(约20Hz)。读取MCU内部变量,发现id在-0.3A~0.8A之间波动,iq在±1.5A之间剧烈摆动。
分析过程:首先怀疑电流采样偏置,但校准后无效。随后检查角度反馈,使用编码器对比,发现观测器角度与实际角度偏差约15°电角度。进一步检查Park变换代码,发现逆Park变换中使用了正变换的符号:
// 错误代码:正变换符号用于逆变换
v_alpha = vd * cos_t - vq * sin_t; // 应为 vd*cos - vq*sin
v_beta = vd * sin_t + vq * cos_t; // 应为 vd*sin + vq*cos
实际上,错误代码与正确代码在数学上等价于将vq的符号取反,导致q轴电压方向错误,电流环无法收敛。
解决步骤:1)修正逆Park变换符号;2)重新标定电流采样偏置;3)将PI参数恢复为初始值(Kp=0.5,Ki=0.01),逐步增大。修正后,id稳定在0A附近,iq响应平滑,电流环带宽达到800Hz。
复盘经验:坐标变换的符号错误在代码评审中极难发现,建议使用离线仿真数据验证:将一组已知的id、iq、θ输入逆变换,再输入正变换,检查输出是否等于原始值。在MATLAB/Simulink中搭建模型,或使用Python脚本生成测试向量,在PC上验证后再移植到MCU。
3.5 常见误区与工程建议
- 误区1:等幅值与等功率变换混用。如果电流环用等幅值,而功率计算用等功率,会导致效率计算错误。建议全链路统一使用等幅值变换。
- 误区2:忽略数字控制延迟。从采样到PWM更新存在一拍延迟(通常为PWM周期)。在高速电机(>10000rpm)中,这一拍延迟会导致角度滞后,需要做角度补偿:θcomp = θe + ωe·Ts。
- 误区3:角度观测器带宽不足。无感FOC中,观测器角度滞后会直接映射为d-q轴耦合。建议观测器带宽设为电流环带宽的5~10倍。
- 误区4:定点数溢出。在Q15格式下,两个Q15数相乘结果为Q30,需要右移15位。如果中间变量使用int16,极易溢出。务必使用int32中间变量。