第一讲:FOC基础回顾——什么是FOC?数学模型与坐标变换
各位同学,咱们今天正式开课。
先聊点实在的。FOC,全称叫Field-Oriented Control,中文叫磁场定向控制。说白了,就是让电机转得又稳又顺,像丝绸一样滑。我刚开始接触这玩意儿的时候,也觉得它挺玄乎的。什么磁场定向、什么解耦控制,听着就头大。但后来做项目做多了,发现它其实就是一套“把交流电机当直流电机玩”的数学魔术。
1.1 什么是FOC?
FOC的核心思想,我总结成一句话:把三相交流电机的控制,简化成两个直流分量的控制。
你想想看,直流电机多好控制啊。给个电压,它就转。给个电流,它就出力。但交流电机呢?三相电流来回变,磁场也跟着转,你根本没法直接控制它的转矩。FOC就是干这个的——它通过坐标变换,把三相旋转的物理量,映射到一个跟转子同步旋转的坐标系里。在这个坐标系里,电流变成了两个直流分量:一个管转矩(q轴),一个管磁通(d轴)。
嗯,这里要注意:FOC不是万能的。我在一个风机项目里就吃过亏,当时负载变化特别剧烈,FOC的电流环响应跟不上,电机直接抖起来了。后来加了前馈补偿才搞定。所以,理解FOC的数学模型,是后面所有优化的基础。
FOC的三大优势:
- 转矩响应快,比六步换相快一个数量级
- 低速运行平稳,没有换相噪声
- 效率高,电流波形接近正弦
1.2 FOC的数学模型
要玩FOC,得先搞懂电机的数学模型。我习惯从电压方程入手。
三相永磁同步电机(PMSM)的电压方程,在自然坐标系(ABC坐标系)下长这样:
u_a = R_s * i_a + d(ψ_a)/dt
u_b = R_s * i_b + d(ψ_b)/dt
u_c = R_s * i_c + d(ψ_c)/dt
看着是不是有点乱?三个方程,还互相耦合。磁链ψ_a不仅跟i_a有关,还跟i_b、i_c以及转子位置θ有关。这要是直接控制,得把人逼疯。
所以,我们需要坐标变换。把这三个耦合的方程,解耦成两个独立的方程。
1.3 Clark变换(3相→2相)
Clark变换,也叫3/2变换。它的任务很简单:把三相静止坐标系(ABC),变成两相静止坐标系(αβ)。
为什么是αβ?因为三相绕组在空间上相差120度,但我们可以用两个正交的绕组(α和β)来等效它。说白了,就是降维。
变换公式如下(等幅值变换):
i_α = i_a
i_β = (i_a + 2*i_b) / √3
注意,这里我用了等幅值变换。还有一种等功率变换,系数会不一样。我个人习惯用等幅值,因为后续算电流环PI参数时,物理意义更直观。
Clark变换的代码实现,我一般这么写:
void clark_transform(float i_a, float i_b, float *i_alpha, float *i_beta) {
*i_alpha = i_a;
*i_beta = (i_a + 2.0f * i_b) * 0.577350269f; // 1/√3
}
嗯,这里有个坑。我曾经在一个项目里直接用浮点除法算1/√3,结果发现CPU开销太大,电流环跑不到20kHz。后来改成查表或者用常量乘法,问题就解决了。所以,嵌入式里能省则省。
1.4 Park变换(静止→旋转)
Clark变换之后,我们得到了αβ坐标系下的电流。但αβ坐标系还是静止的,电流依然是交流量。要把它变成直流量,就得用Park变换。
Park变换的任务:把两相静止坐标系(αβ),变成两相旋转坐标系(dq)。这个旋转坐标系,跟转子磁极同步旋转,旋转角度就是转子位置θ。
变换公式:
i_d = i_α * cos(θ) + i_β * sin(θ)
i_q = -i_α * sin(θ) + i_β * cos(θ)
你看,经过Park变换之后,i_d和i_q就是直流分量了。i_d控制磁通,i_q控制转矩。这就是FOC的精髓——解耦控制。
代码实现:
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变换里的角度θ,一定要用编码器或者观测器估算出来的转子位置。千万别用开环给的假角度,否则电流环会直接崩掉。我见过有人用固定角度做Park变换,结果电机根本转不起来。
1.5 逆变换(Park逆 + Clark逆)
控制完i_d和i_q之后,我们得到的是dq坐标系下的电压指令。但最终要给电机的是三相电压。所以,还得变回去。
Park逆变换(dq→αβ):
u_α = u_d * cos(θ) - u_q * sin(θ)
u_β = u_d * sin(θ) + u_q * cos(θ)
Clark逆变换(αβ→ABC):
u_a = u_α
u_b = -0.5 * u_α + (√3/2) * u_β
u_c = -0.5 * u_α - (√3/2) * u_β
这两步合起来,就是SVPWM的输入。SVPWM再根据u_a、u_b、u_c生成六路PWM波,驱动逆变器。
1.6 整个FOC的流程
我把FOC的完整流程捋一遍,你感受一下:
- 采样:采集两相电流(i_a, i_b)和转子位置θ
- Clark变换:i_a, i_b → i_α, i_β
- Park变换:i_α, i_β → i_d, i_q(用θ)
- 电流环PI控制:i_d_ref - i_d → u_d;i_q_ref - i_q → u_q
- Park逆变换:u_d, u_q → u_α, u_β(用θ)
- SVPWM:u_α, u_β → 六路PWM占空比
- 输出:更新PWM寄存器,驱动电机
你看,整个流程里,坐标变换占了半壁江山。所以,搞懂Clark和Park,FOC就学会了一半。
注意事项:
- 电流采样一定要跟PWM同步,否则采到的噪声会让你怀疑人生
- 角度θ的精度直接影响dq轴解耦效果,建议用16位以上的编码器
- Clark变换的系数,等幅值和等功率别混用,否则PI参数全得重调
1.7 小结
这一讲,我们回顾了FOC的基本概念和核心数学工具。Clark变换把三相变两相,Park变换把静止变旋转。这两步变换,让交流电机的控制变得跟直流电机一样简单。
下一讲,我们会深入电流环的PI参数整定。到时候我会分享一些实际项目里的调参技巧,比如怎么用示波器看电流波形来判断PI参数是否合适。嗯,那才是真正见功夫的地方。
今天就到这儿。有问题随时交流。