1. FOC基础回顾:什么是FOC?FOC的核心思想与坐标变换(Clark/Park)
好,咱们正式开始这门课。第一讲,我打算带大家快速回顾一下FOC的基础。
你可能会问:「都2025年了,谁还不知道FOC?」
嗯,说实话,很多做电机控制的工程师,对FOC的理解还停留在「调PI参数」的层面。坐标变换的原理?可能早就还给老师了。但我要告诉你——不懂坐标变换,你永远成不了电机控制高手。
我自己带团队时,发现一个规律:凡是能把Clark/Park变换讲清楚的人,写MTPA、弱磁控制基本不会出大问题。反过来,那些一上来就调参的,遇到非线性负载就懵了。
所以,咱们今天把地基打牢。
1.1 什么是FOC?
FOC,全称Field-Oriented Control,磁场定向控制。说白了,就是把交流电机当成直流电机来控制。
你想想看,直流电机多好控制啊——调电压就能调速,调电流就能调转矩,简单粗暴。但交流电机呢?三相电流互相耦合,转子磁场还在转,你直接调电压根本调不准。
FOC的核心思路就是:通过坐标变换,把三相交流量解耦成两个直流量。一个控制磁通(d轴),一个控制转矩(q轴)。这样,交流电机就变得跟直流电机一样听话了。
核心思想一句话: 将三相静止坐标系(ABC)下的交流量,变换到两相旋转坐标系(dq)下的直流量,实现磁链和转矩的解耦控制。
我在2018年做过一个项目,客户要求伺服驱动器在0.1Hz下输出额定转矩。当时很多人说不可能,说交流电机低频转矩就是不行。我用了FOC加高频注入,最后做到了。说白了,FOC就是让交流电机在低速下也能「使上劲」。
1.2 坐标变换:从ABC到αβ再到dq
坐标变换是FOC的数学基础。我习惯把它分成两步:
- Clark变换: 三相静止ABC → 两相静止αβ
- Park变换: 两相静止αβ → 两相旋转dq
为什么要分两步?
嗯,其实也可以一步到位,但分两步更直观。Clark变换把三相变成两相,减少一个维度;Park变换把静止的变成旋转的,让变量变成直流。
1.2.1 Clark变换
假设三相电流为 ia、ib、ic,且满足 ia + ib + ic = 0(星形连接无中线)。
Clark变换公式:
i_α = i_a
i_β = (i_a + 2*i_b) / √3
或者用矩阵形式:
[ i_α ] [ 1 -1/2 -1/2 ] [ i_a ]
[ i_β ] = [ 0 √3/2 -√3/2 ] [ i_b ]
[ i_0 ] [ 1/2 1/2 1/2 ] [ i_c ]
注意,这里用的是等幅值变换。还有一种叫等功率变换,系数不同。我个人习惯用等幅值,因为调试时看电流波形更直观。
我的小技巧: 实际代码中,我一般只采集两相电流(比如i_a和i_b),第三相用 i_c = -i_a - i_b 算出来。省一个ADC通道,还少一个采样误差源。
1.2.2 Park变换
Park变换把αβ坐标系旋转θ角度,得到dq坐标系。θ就是转子磁极的位置角。
公式:
i_d = i_α * cos(θ) + i_β * sin(θ)
i_q = -i_α * sin(θ) + i_β * cos(θ)
反过来,逆Park变换(从dq到αβ)也很常用:
i_α = i_d * cos(θ) - i_q * sin(θ)
i_β = i_d * sin(θ) + i_q * cos(θ)
这里θ怎么来?
对于永磁同步电机(PMSM),θ来自编码器或霍尔传感器。对于无传感器方案,θ需要通过观测器估算。我后面会专门讲无传感器FOC,这里先不展开。
1.3 为什么坐标变换能解耦?
这个问题我当年想了很久。后来在实验室里画矢量图画到凌晨三点,突然就明白了。
你看,三相交流电机的定子电流会产生一个旋转磁场。这个磁场和转子磁场相互作用,产生转矩。但三相电流是耦合的——你调A相,B相和C相也会受影响。
坐标变换的本质是:换一个坐标系来看问题。
- 在ABC坐标系下,三个变量互相耦合,还是交流量。
- 在αβ坐标系下,两个变量正交,但仍然是交流量。
- 在dq坐标系下,两个变量正交且为直流量,完全解耦。
解耦之后,你就可以独立控制i_d和i_q了。i_d控制磁通,i_q控制转矩。这不就跟直流电机一模一样了吗?
避坑指南: 我曾经犯过一个低级错误——Park变换里的角度θ用的是电角度,但我代码里传进去的是机械角度。结果电机转起来电流波形全是乱的,我还以为是PI参数没调好。查了三天才发现是角度单位搞错了。嗯,这种错误犯一次就够了。
1.4 FOC的整体控制框图
一个标准的FOC系统包含以下环节:
- 电流采样: 采集两相或三相电流
- Clark变换: ABC → αβ
- Park变换: αβ → dq
- PI控制器: 分别控制i_d和i_q
- 逆Park变换: dq → αβ
- SVPWM调制: 生成三相PWM波
整个流程在中断里执行,一般10kHz~20kHz的开关频率。我习惯把控制周期设在100μs,也就是10kHz。太快了CPU扛不住,太慢了电流纹波大。
1.5 代码示例:Clark + Park 变换
下面是我常用的C代码片段,你直接拿去用就行:
// Clark变换:ABC -> αβ
void clark_transform(float i_a, float i_b, float i_c,
float *i_alpha, float *i_beta) {
*i_alpha = i_a;
*i_beta = (i_a + 2.0f * i_b) * 0.577350269f; // 1/√3
}
// Park变换:αβ -> dq
void park_transform(float i_alpha, float i_beta, float theta,
float *i_d, float *i_q) {
float sin_theta = sinf(theta);
float cos_theta = cosf(theta);
*i_d = i_alpha * cos_theta + i_beta * sin_theta;
*i_q = -i_alpha * sin_theta + i_beta * cos_theta;
}
// 逆Park变换:dq -> αβ
void inv_park_transform(float i_d, float i_q, float theta,
float *i_alpha, float *i_beta) {
float sin_theta = sinf(theta);
float cos_theta = cosf(theta);
*i_alpha = i_d * cos_theta - i_q * sin_theta;
*i_beta = i_d * sin_theta + i_q * cos_theta;
}
性能优化建议: 实际工程中,sin和cos计算很费时间。我一般用查表法或者Cordic算法。如果MCU有硬件三角函数单元,记得使能。别问我怎么知道的——有一次我忘了开硬件加速,中断执行时间直接翻倍。
1.6 小结
好了,FOC基础就回顾到这里。总结一下:
| 变换 | 从 | 到 | 作用 |
|---|---|---|---|
| Clark | ABC(三相静止) | αβ(两相静止) | 减少维度,3→2 |
| Park | αβ(两相静止) | dq(两相旋转) | 交流变直流,解耦 |
| 逆Park | dq(两相旋转) | αβ(两相静止) | 从控制量回到调制波 |
下一讲,我们会深入MTPA(最大转矩电流比控制)。说白了,就是怎么用最小的电流产生最大的转矩。这可是电机效率优化的核心。
到时候我会分享一个真实案例——某款电动汽车的驱动电机,通过MTPA把效率从92%提到了96%。别走开。