前言上一章我们通过Clark 变换把三相电流 Iu,Iv,Iw 变成了两相静止坐标系下的电流 Iα,Iβ。到这里电机电流从 “三相耦合” 变成了 “两相正交”计算简单了很多但依然是交流量—— 大小随时间正弦变化没法用简单的 PID 直接稳控。FOC 之所以能把无刷电机变得像直流电机一样好控制核心全靠 Park 变换。本章我们一次性讲透Park 变换到底在干什么d/q 轴分别代表什么物理意义电角度 θ 从哪来、怎么算完整公式推导 两种写法浮点 / 定点代码直接可用工程里 90% 的人都会踩的坑读完这一章你才算真正摸到 FOC 的核心逻辑。1. Park 变换到底解决了什么问题先一句话总结Park 变换把 αβ 静止坐标系变换到 dq 旋转坐标系让交流量变成直流量。展开说αβ 坐标系固定在定子上不动dq 坐标系固定在转子上跟着转子一起旋转当你站在 “旋转的转子” 视角去看电流原来随时间正弦波动的 Iα,Iβ会变成两个稳定不变的直流分量 Id,Iq交流变直流意味着什么可以用普通 PI 调节器直接控制可以做到完全解耦磁场归磁场力矩归力矩控制简单、稳定、响应快、低速平滑这就是 FOC 能吊打方波驱动的根本原因。2. d 轴与 q 轴的物理意义对表贴式永磁同步电机 PMSM我们常用的 BLDC 绝大多数都是这种d 轴direct axis直轴与转子永磁体磁场方向一致对应励磁分量q 轴quadrature axis交轴超前 d 轴 90° 电角度对应转矩分量控制目标极其清晰Id0弱磁控制以外默认都让 d 轴电流为 0不削弱磁场效率最高Iq想力气大就加大 Iq想刹车就减小甚至反向这就是经典的Id0 FOC 控制策略3. 电角度 θ 是整个变换的 “钥匙”Park 变换本质是矢量旋转旋转多少度由电角度 θ决定。电角度怎么来θ 的作用它代表当前转子磁场指向的角度决定了 dq 坐标系相对于 αβ 坐标系旋转了多少。没有 θPark 变换无从谈起。θ 不准 → FOC 直接抖、啸叫、无力、发热。4. Park 变换标准公式推导4.1 变换关系从 αβ 静止坐标系逆时针旋转 θ得到 dq 旋转坐标系5. 反 Park 变换FOC 输出必备电流环计算完 Vd,Vq 之后要变回 αβ 给 SVPWM 用这就是反 Park。公式6. 完整代码实现浮点版6.1 Park 变换#include math.h /** * brief Park 变换: αβ → dq * param Iα, Iβ: 两相静止电流 * param theta: 电角度(弧度) * param Id, Iq: 输出直流量 */ void Park_Transform(float Ialpha, float Ibeta, float theta, float *Id, float *Iq) { float sin_theta sinf(theta); float cos_theta cosf(theta); *Id Ialpha * cos_theta Ibeta * sin_theta; *Iq -Ialpha * sin_theta Ibeta * cos_theta; }6.2 反 Park 变换/** * brief 反Park变换: dq → αβ * param Vd, Vq: 电压指令 * param theta: 电角度(弧度) * param Valpha, Vbeta: 输出静止坐标系电压 */ void Inv_Park(float Vd, float Vq, float theta, float *Valpha, float *Vbeta) { float sin_theta sinf(theta); float cos_theta cosf(theta); *Valpha Vd * cos_theta - Vq * sin_theta; *Vbeta Vd * sin_theta Vq * cos_theta; }7. 定点优化版无 FPU 单片机适用对 STM32F103 等资源紧张的 MCU可以用正弦余弦表 Q15 定点// 正弦余弦表(θ:0~360°,精度1°), Q15格式 const int16_t sin_table[] { // 自行填入 0~359° 的 sin*32767 }; #define GET_SIN(deg) sin_table[deg%360] #define GET_COS(deg) sin_table[(deg90)%360] void Park_Fixed(int16_t Ialpha, int16_t Ibeta, uint16_t theta_deg, int16_t *Id, int16_t *Iq) { int32_t sin_theta GET_SIN(theta_deg); int32_t cos_theta GET_COS(theta_deg); *Id ((int32_t)Ialpha * cos_theta (int32_t)Ibeta * sin_theta) 15; *Iq ((int32_t)-Ialpha * sin_theta (int32_t)Ibeta * cos_theta) 15; }工程建议有 FPUF4/F7/H7/G4直接用浮点简单好调无 FPU 用查表法速度极快8. 为什么变换后 Id、Iq 是直流最关键的理解举个直观例子你站在地面αβ看风车叶片位置一直在变是交流你坐在风车转子上dq一起转叶片相对你不动是直流对应到电机、 随电角度正弦波动用 θ 同步旋转后波动被 “抵消” 了输出的 、 变成恒定直流于是用 PI 控制器去稳 Id、Iq就像控制简单直流电机一样轻松这就是 FOC 的数学魔法。9. 工程高频踩坑9.1 θ 角度方向反了现象电机一转就啸叫、抖动、电流巨大改方向也没用原因电角度 θ 递增方向与转子实际旋转方向相反解决theta -theta;或反序 Hall 计算角度。9.2 sin/cos 角度单位不统一代码里用弧度计算时用角度结果完全错乱统一规则C 语言 math.hsinf/cosf 一律用弧度霍尔 / 编码器先转弧度再传入9.3 dq 轴定义反了有些资料 / 电机库定义IqIαsinθIβcosθ符号不一样会导致力矩方向相反电机飞车、失控解决整套 FOC 坐标系从头到尾保持一致不要混用多家库公式。9.4 角度延迟未补偿编码器读取、ADC 采样、运算都需要时间θ 已经变了你还用旧角度→ 电流环相位滞后 → 低速抖、高速弱高端 FOC 都会做角度前馈补偿 / 观测器相位补偿9.5 Id 没有置 0表贴式电机默认 Id0如果你给 Id 一个随机初始值会出现力矩小电流大发热严重效率极低10. 完整 FOC 电流环结构完整的电流环流程ADC 采样三相电流 Iu,Iv,IwClark 变换→ Iα,IβPark 变换→ Id,IqPI 闭环Idref0Iqref 为力矩指令输出 Vd,Vq反 Park 变换→ Vα,Vβ送入SVPWM生成三相 PWM这就是标准Id0 FOC 控制架构。11. 本章总结Park 变换是 FOC 真正的灵魂核心就 4 点功能αβ 静止 → dq 旋转交流变直流核心变量电角度 θ决定旋转角度物理意义Id励磁默认 0Iq转矩控制力气公式必须记住一对正变换 反变换代码直接套用到这里FOC 最难的数学部分已经全部结束。