1. FOC基础回顾:磁场定向控制原理、Clark变换与Park变换、SVPWM调制策略
各位同学好,我是老周。做电机控制这行十几年了,踩过的坑比吃过的盐还多。今天咱们开始《FOC速度震荡与负载扰动抑制》的第一章——先把FOC的基础骨架搭起来。
说实话,很多工程师做FOC调了很久,震荡还是压不下去。为什么?因为基础没打牢。你想想看,磁场定向都没搞明白,Clark/Park变换算出来的是错的,SVPWM扇区判断都出问题——那后面谈什么抑制震荡?
所以这一章,咱们把这三个核心模块彻底捋一遍。我保证,不绕弯子,直接上干货。
1.1 磁场定向控制(FOC)到底在干什么?
FOC,全称Field-Oriented Control,中文叫磁场定向控制。说白了,就是让电机像直流电机一样好控制。
直流电机为什么好控?因为它的电枢磁场和励磁磁场天然就是垂直的,你调电枢电流就能直接控制转矩,互不干扰。但交流电机不行——三相电流在空间上旋转,磁场方向跟着变,转矩和磁通耦合在一起,牵一发而动全身。
FOC的核心思路就一句话:通过坐标变换,把交流电机解耦成直流电机来控。
FOC的终极目标:
- 独立控制 d轴电流(励磁分量) → 控制磁通
- 独立控制 q轴电流(转矩分量) → 控制转矩
- 两者正交解耦,互不干扰
我在一个伺服项目里遇到过,客户要求零速满载启动不抖动。当时就是d/q轴耦合没处理好,一启动就嗡嗡响。后来把解耦算法重写了一遍,问题才解决。嗯,这里要记住:解耦是FOC的灵魂。
1.2 Clark变换:从三相到两相
Clark变换,也叫3→2变换。把电机三相绕组(A、B、C)产生的空间磁场,投影到两相静止坐标系(α、β)上。
为什么要这么做?因为三相系统计算太麻烦,两相系统简单得多。你想想看,三个变量变成两个变量,矩阵运算量直接降维。
Clark变换的数学表达式:
// 等幅值变换(最常用)
Iα = Ia
Iβ = (Ia + 2*Ib) / √3
// 或者写成矩阵形式
[ Iα ] [ 1 -1/2 -1/2 ] [ Ia ]
[ Iβ ] = [ 0 √3/2 -√3/2 ] [ Ib ]
[ Ic ]
我的习惯:实际项目中我几乎只用等幅值变换,因为后续PI调节器的输出限幅好处理。等功率变换虽然数学上更严谨,但限幅值要乘以√(2/3),容易搞混。我曾经在这个细节上吃过亏——限幅设错了,电流环直接饱和,电机嗡嗡叫。
Clark变换的物理意义:把三相绕组产生的旋转磁动势,用两相正交绕组等效。说白了,就是换了个坐标系,磁场没变。
1.3 Park变换:从静止到旋转
Clark变换完了,我们得到的是αβ静止坐标系下的电流。但问题是——这个坐标系不跟着转子转。你想想看,如果坐标系不动,那电流分量还是交流量,PI调节器追不上。
Park变换就是干这个的:把αβ静止坐标系,旋转到dq旋转坐标系。旋转速度等于电机电角速度,这样dq轴上的电流就变成了直流量。
Park变换公式:
Id = Iα * cos(θ) + Iβ * sin(θ)
Iq = -Iα * sin(θ) + Iβ * cos(θ)
// 其中 θ 是转子电角度
这里有个关键点:θ必须准确。θ错了,Park变换出来的Id/Iq就是错的,整个FOC就乱套了。
避坑指南:我曾经在一个项目里,编码器安装有0.5度的机械偏差,换算成电角度偏差在低速时还好,高速时直接导致q轴电流波动20%以上。后来加了角度补偿才搞定。所以——角度精度是FOC的命门。
Park变换的逆变换(从dq回到αβ)同样重要,因为SVPWM需要αβ坐标系下的电压指令。
1.4 SVPWM调制策略
SVPWM,Space Vector Pulse Width Modulation,空间矢量脉宽调制。这是FOC的最后一公里——把dq轴电压指令,变成三相逆变器的开关信号。
为什么不用传统的SPWM?因为SVPWM的直流母线利用率更高(比SPWM高15%),谐波更小。说白了,同样的母线电压,SVPWM能让电机跑得更快。
SVPWM的核心步骤:
- 扇区判断:根据Uα、Uβ判断参考电压矢量在哪个扇区
- 作用时间计算:计算两个相邻基本矢量的作用时间T1、T2
- 占空比分配:根据T1、T2和零矢量分配三相占空比
- 死区补偿:插入死区时间,防止上下桥臂直通
扇区判断的快速算法:
// 定义三个中间变量
U1 = Uβ
U2 = (√3/2)*Uα - 0.5*Uβ
U3 = -(√3/2)*Uα - 0.5*Uβ
// 扇区号计算
N = 0;
if (U1 > 0) N += 1;
if (U2 > 0) N += 2;
if (U3 > 0) N += 4;
// N值对应扇区:1→II, 2→VI, 3→I, 4→IV, 5→III, 6→V
我的经验:扇区判断用查表法最快,别用if-else嵌套。我在STM32F103上做过测试,查表法比条件判断快了将近3μs——对于20kHz的PWM周期来说,这3μs很宝贵。
下面这张图展示了FOC从电流采样到SVPWM输出的完整信号链:
1.5 三个变换的工程要点对比
| 变换名称 | 输入 | 输出 | 关键参数 | 常见坑 |
|---|---|---|---|---|
| Clark变换 | Ia, Ib, Ic | Iα, Iβ | 变换系数(等幅值/等功率) | 系数选错导致电流幅值偏差 |
| Park变换 | Iα, Iβ, θ | Id, Iq | 转子电角度θ | 角度偏差导致d/q轴耦合 |
| SVPWM | Uα, Uβ | 三相占空比 | 母线电压、死区时间 | 扇区判断错误、死区补偿不当 |
总结一下:
- Clark变换:把三相变两相,静止坐标系
- Park变换:把静止变旋转,交流变直流
- SVPWM:把电压指令变成开关信号,驱动电机
这三个模块环环相扣,任何一个出问题,后面的速度震荡和负载扰动抑制都无从谈起。我建议你先把这部分代码在仿真环境里跑通,再上硬件。别急着调参数——基础打牢了,后面事半功倍。