3. FOC核心原理
FOC(Field-Oriented Control,磁场定向控制)之所以能成为永磁同步电机(PMSM)高性能控制的主流算法,其核心在于通过一系列坐标变换,将原本在静止三相坐标系下强耦合、非线性的交流电机数学模型,等效为旋转坐标系下解耦的直流电机模型。这一过程依赖三个关键数学工具:Clark变换(三相静止→两相静止)、Park变换(两相静止→两相旋转)以及反Park变换(两相旋转→两相静止)。理解这三个变换的数学推导与物理意义,是进行FOC算法移植与部署的基石。若变换矩阵系数错误或角度对齐偏差,将直接导致电流环失控、转矩脉动甚至系统过流。本章将逐一拆解其推导过程、工程实现要点及常见陷阱。
3.1 Clark变换:从三相到两相静止坐标系的数学推导
核心原理
Clark变换(又称3s/2s变换)的目标是将三相静止坐标系(a-b-c)下的物理量(电流、电压或磁链)映射到两相静止坐标系(α-β)下。三相绕组在空间上互差120°电角度,而α-β坐标系中α轴与a轴重合,β轴超前α轴90°。其物理本质是:三相绕组产生的合成磁动势(MMF)与两相正交绕组产生的合成磁动势完全等效。由于三相电流满足基尔霍夫电流定律(KCL),即 ia + ib + ic = 0(无中线星形连接),因此三相系统实际上只有两个独立变量,Clark变换正是利用这一约束条件实现降维。
数学推导基于磁动势等效原则。设三相绕组每相有效匝数为N3,两相绕组每相有效匝数为N2,根据变换前后总磁动势不变,可得矩阵关系:
[iα] [ 1 -1/2 -1/2 ] [ia]
[iβ] = N3/N2 * [ 0 √3/2 -√3/2 ] [ib]
[i0] [ 1/2 1/2 1/2 ] [ic]
其中i0为零序分量。若采用等幅值变换,取N3/N2 = 2/3,则变换矩阵为:
T_clark = (2/3) * [ 1 -1/2 -1/2 ]
[ 0 √3/2 -√3/2 ]
若采用等功率变换,取N3/N2 = √(2/3),则矩阵系数变为√(2/3)。工程中,FOC电流环通常采用等幅值变换,因为这样便于与SVPWM的电压限制(直流母线电压利用率)直接对应。
判断方法或操作流程
在实际工程部署中,Clark变换的代码实现需注意以下流程:
- 确认采样方式:通常采样两相电流(如ia、ib),第三相通过KCL计算得到 ic = -ia - ib。
- 选择变换系数:根据系统需求确定等幅值(2/3)或等功率(√(2/3))系数,并在代码中统一宏定义。
- 执行矩阵运算:在MCU/DSP中,为避免浮点运算开销,常采用Q格式定点数或直接使用浮点单元(FPU)。
- 验证零序分量:若电机为三角形连接或存在中线,需额外处理零序分量;常规星形无中线连接时,i0恒为0,可省略。
// 等幅值Clark变换,输入ia, ib,输出alpha, beta
#define CLARK_IA (2.0f/3.0f)
void clark_transform(float ia, float ib, float *ialpha, float *ibeta) {
*ialpha = CLARK_IA * (ia - 0.5f * ib - 0.5f * (-ia - ib));
*ibeta = CLARK_IA * (0.8660254f * ib - 0.8660254f * (-ia - ib));
// 简化后:
// *ialpha = ia;
// *ibeta = 0.57735027f * ia + 1.15470054f * ib;
}
案例拆解或实战场景
假设某PMSM额定电流5A,采用等幅值Clark变换。当电机运行在某一时刻,ADC采样得到 ia = 3.0A,ib = -1.5A,则 ic = -1.5A。代入变换矩阵:
iα = (2/3) * (3.0 - 0.5*(-1.5) - 0.5*(-1.5)) = (2/3) * (3.0 + 0.75 + 0.75) = (2/3) * 4.5 = 3.0A
iβ = (2/3) * (0 + 0.866*(-1.5) - 0.866*(-1.5)) = (2/3) * 0 = 0A
此时电流矢量完全落在α轴上,对应转子位置角为0°(电角度)。若在电机台架上用示波器同时观察iα和iβ,会看到两者均为正弦波,且iβ滞后iα 90°电角度。若发现iβ波形幅值异常或相位偏差,应首先检查电流采样通道的增益一致性。
常见误区或总结复盘
- 误区1:系数混淆。等幅值与等功率变换的系数不同,若混用会导致电流环PI参数计算错误。建议在代码注释中明确标注。
- 误区2:忽略零序分量。对于无中线系统,零序电流为0,但若因采样噪声或硬件不对称导致三相电流之和不等于0,直接使用KCL计算第三相会引入误差。
- 误区3:角度对齐错误。Clark变换本身不涉及角度,但α轴与a轴的对齐方式(是否与A相绕组轴线重合)会影响后续Park变换的角度补偿。
3.2 Park变换:从静止到旋转坐标系的解耦核心
核心原理
Park变换(又称2s/2r变换)将α-β静止坐标系下的交流量变换到随转子磁极同步旋转的d-q坐标系下。d轴(直轴)与转子永磁体磁链方向对齐,q轴(交轴)超前d轴90°电角度。变换的核心是引入转子位置角θ(电角度),通过旋转变换将正弦量变为直流量。其数学表达式为:
[id] [ cosθ sinθ ] [iα]
[iq] = [ -sinθ cosθ ] [iβ]
物理意义在于:经过Park变换后,id为励磁电流分量,控制电机磁场强度;iq为转矩电流分量,控制电磁转矩。对于表贴式PMSM(SPMSM),通常控制id=0,此时电磁转矩与iq成正比,实现类似直流电机的控制特性。对于内置式PMSM(IPMSM),则需要利用磁阻转矩,通过id负向偏置实现最大转矩电流比(MTPA)控制。
判断方法或操作流程
Park变换的工程实现要点如下:
- 获取转子位置角θ:来自编码器(增量式/式)或无位置传感器观测器(滑模观测器、龙伯格观测器等)。θ必须是电角度,机械角度需乘以极对数。
- 计算三角函数:在MCU中可使用硬件CORDIC加速器(如STM32G4系列)或查表法。查表法需注意角度分辨率与内存占用平衡。
- 执行矩阵乘法:注意角度θ的零点校准。增量式编码器上电时需执行一次对齐(如给d轴注入直流电流使转子定位)。
- 滤波处理:若电流采样噪声较大,可在Park变换前对iα/iβ进行低通滤波,但需注意相位延迟补偿。
案例拆解或实战场景
考虑一个极对数为4的PMSM,机械转速为750rpm,则电频率为 f = (750/60)*4 = 50Hz。假设在某时刻,转子电角度θ = 30°(π/6 rad),经Clark变换后得到 iα = 4.0A,iβ = 2.0A。则Park变换计算:
id = 4.0*cos30° + 2.0*sin30° = 4.0*0.866 + 2.0*0.5 = 3.464 + 1.0 = 4.464A
iq = -4.0*sin30° + 2.0*cos30° = -4.0*0.5 + 2.0*0.866 = -2.0 + 1.732 = -0.268A
若此时id=0控制策略生效,则说明角度或电流采样存在偏差。实际调试中,可通过旋变/编码器零位偏置补偿来消除该误差。具体做法:在电机空载且速度为零时,注入一个固定的q轴电压,观察电机是否转动;若不转,则微调编码器零位偏置,直至电机不转且id≈0。
常见误区或总结复盘
- 误区1:角度单位混淆。三角函数计算需使用弧度制,而编码器计数通常为整数,需先转换为弧度。
- 误区2:极对数遗漏。电角度 = 机械角度 × 极对数,若遗漏极对数,Park变换将完全失效。
- 误区3:d-q轴方向定义。不同文献对d轴正方向定义可能不同(如指向磁极N极或S极),需与电机模型及SVPWM输出保持一致。
3.3 反Park变换:从旋转坐标回到静止坐标的电压重构
核心原理
反Park变换(又称2r/2s变换)是Park变换的逆运算,用于将电流环PI控制器输出的d-q轴电压指令(ud*、uq*)变换回α-β静止坐标系下的电压指令(uα*、uβ*),为后续SVPWM调制提供输入。其数学表达式为:
[uα*] [ cosθ -sinθ ] [ud*]
[uβ*] = [ sinθ cosθ ] [uq*]
物理意义在于:将旋转坐标系中的电压矢量还原为静止坐标系中的等效电压矢量。由于SVPWM的扇区判断和矢量作用时间计算均在α-β坐标系下进行,因此反Park变换是连接电流环与调制环节的桥梁。值得注意的是,反Park变换的矩阵是Park变换矩阵的转置(也是其逆矩阵,因为旋转矩阵是正交矩阵),因此计算量相同。
判断方法或操作流程
反Park变换的工程实现与Park变换对称,但需注意以下差异:
- 输入来源:输入为电流环PI调节器的输出,通常经过限幅处理(如限制在直流母线电压的可用范围内)。
- 输出去向:输出uα*、uβ*直接送入SVPWM模块。若采用空间矢量调制,还需进行扇区判断和矢量作用时间计算。
- 过调制处理:当电压指令幅值超过逆变器最大输出电压(即六边形内切圆半径)时,需进行过调制处理,否则会产生波形畸变。
案例拆解或实战场景
假设某FOC系统直流母线电压Udc = 300V,电流环输出 ud* = 10V,uq* = 100V,当前转子电角度θ = 60°(π/3 rad)。反Park变换计算:
uα* = 10*cos60° - 100*sin60° = 10*0.5 - 100*0.866 = 5 - 86.6 = -81.6V
uβ* = 10*sin60° + 100*cos60° = 10*0.866 + 100*0.5 = 8.66 + 50 = 58.66V
电压矢量幅值 = √(81.6² + 58.66²) ≈ 100.5V,未超过SVPWM线性调制区上限(Udc/√3 ≈ 173V),因此无需过调制。若uq*增大至200V,则电压矢量幅值约为200V,超过173V,此时需进行过调制处理,否则实际输出电压将低于指令值,导致电流环失控。
常见误区或总结复盘
- 误区1:矩阵符号错误。反Park变换中sinθ的符号与Park变换相反,若写错会导致电压矢量旋转方向错误。
- 误区2:限幅位置不当。限幅应在反Park变换之前(对ud*、uq*限幅)还是之后(对uα*、uβ*限幅)?工程上建议在d-q轴限幅,因为d-q轴限幅更直观地反映电压裕量。
- 误区3:忽略死区补偿。反Park变换输出的电压指令是理想值,实际逆变器存在死区时间,会导致输出电压畸变,需在低速时进行死区补偿。
3.4 三种变换的协同工作与工程部署要点
核心原理
在完整的FOC控制链路中,三种变换按顺序协同工作:电流采样→Clark变换→Park变换→PI调节→反Park变换→SVPWM→逆变器→电机。其中Clark和Park构成电流反馈通路,反Park构成电压前向通路。整个链路的时序在PWM中断中同步执行,典型的中断频率为10kHz-20kHz。
判断方法或操作流程
在代码架构层面,建议将三种变换封装为独立的函数模块,便于移植和复用。以下是一个典型的FOC中断服务函数执行顺序:
void FOC_ISR(void) {
// 1. 读取编码器角度θ(电角度)
theta = get_electrical_angle();
// 2. ADC采样相电流
ia = adc_read(CH_A);
ib = adc_read(CH_B);
// 3. Clark变换
clark_transform(ia, ib, &ialpha, &ibeta);
// 4. Park变换
park_transform(ialpha, ibeta, theta, &id, &iq);
// 5. 电流PI调节(id_ref通常为0或MTPA给定)
ud = pi_controller(id_ref, id, &pi_id);
uq = pi_controller(iq_ref, iq, &pi_iq);
// 6. 反Park变换
inv_park_transform(ud, uq, theta, &ualpha, &ubeta);
// 7. SVPWM调制
svpwm(ualpha, ubeta, &ta, &tb, &tc);
// 8. 更新PWM比较寄存器
update_pwm_duty(ta, tb, tc);
}
案例拆解或实战场景
在某工业伺服驱动器项目中,客户反馈电机在低速(<100rpm)运行时有明显的转矩脉动。通过分析,发现以下问题:
- 现象:id和iq波形在低速时存在明显的6次谐波脉动。
- 根因分析:编码器为2500线增量式,经4倍频后为10000脉冲/转。在低速时,位置采样分辨率不足,导致θ角量化误差增大,进而引起Park变换角度抖动。
- 解决方案:采用角度插值算法,在两次编码器脉冲之间通过速度估算进行线性插值,提高角度分辨率。同时,在Park变换前对θ进行低通滤波(截止频率为电流环带宽的1/10)。
- 结果对比:优化后,id脉动从±0.3A降至±0.05A,转矩脉动明显改善,电机噪音降低3dB以上。
常见误区或总结复盘
| 变换类型 | 输入 | 输出 | 关键参数 | 常见错误 |
|---|---|---|---|---|
| Clark | ia, ib, ic | iα, iβ | 系数2/3或√(2/3) | 系数混淆、未处理零序 |
| Park | iα, iβ, θ | id, iq | θ为电角度 | 极对数遗漏、角度单位错误 |
| 反Park | ud*, uq*, θ | uα*, uβ* | θ与Park一致 | sin符号错误、限幅位置不当 |
总结复盘:三种变换本质上是线性代数中的坐标旋转与投影,其工程实现的关键在于角度精度、系数一致性和时序同步。在移植FOC算法到新平台时,建议先用开环电压注入(不使能电流环)验证反Park变换和SVPWM的正确性,再逐步闭环调试。此外,利用MCU的硬件三角函数加速器(如STM32G4的CORDIC)可显著降低CPU负载,为更高开关频率留出余量。