这一章在干嘛?
全书压轴。磁场定向控制(FOC)通过 Clarke/Park 坐标变换把三相交流量变成两个直流量 分别控制励磁与转矩,再经 SVPWM 调制成连续旋转的电压矢量——转矩平稳、效率高、噪声小。最后用 ST MCSDK 跑通一个真实工程。
27.1 FOC 全景框图
FOC(field-oriented control,磁场定向控制/矢量控制)是 BLDC 与 PMSM 高效控制的最佳选择:转矩平稳、效率高、噪声小、动态响应快,代价是硬件成本高、对 MCU 要求高、算法难。
原书图 27.1.1.1:电流闭环控制 FOC 框图:八步循环
电流环每个 PWM 周期执行八步:
| 步 | 操作 | 产物 |
|---|---|---|
| ① | 采样三相电流 | |
| ② | Clarke 变换(三相静止 → 两相静止) | |
| ③ | Park 变换(静止 → 随转子旋转) | (直流量!) |
| ④ | 与给定 求误差 | 两个误差量 |
| ⑤ | 两个 PI 控制器 | |
| ⑥ | 反 Park 变换(回静止系) | |
| ⑦ | SVPWM 调制 | 三半桥开关状态 |
| ⑧ | 循环 | —— |
原书图 27.1.3.1:Iq、Id 的含义:Iq 对应转矩,Id 对应励磁
原书图 27.1.3.2:FOC 的目的:Iq 按需控制、Id 控制为 0
FOC 的目的:
(交轴)按需控制转矩、(直轴)控制为 0——id=0 是表贴式电机最常用策略(d 轴电流不产生转矩只发热)。其他策略还有 MTPA(最大转矩电流比)与弱磁控制(超额定转速时减小 id 削弱反电动势以继续提速)。
27.2 Clarke 与 Park 变换
Clarke 变换:三相静止系(3 个互差 120° 的正弦量)→ 两相静止系,磁场等效、恒幅值不变(系数 2/3):
原书图 27.1.2.1.2:Clarke 变换:三相坐标系到两相静止坐标系
原书图 27.1.2.1.3:Clarke 变换前后的波形:仍是正弦
变换后仍是正弦(非线性),没法用 PID 直接控——于是Park 变换把坐标系旋到随转子转动(θ 为转子电角度,d 轴与转子磁场重合叫直轴,q 轴垂直叫交轴):
原书图 27.1.2.2.1:Park 变换与 d-q 轴示意图
原书图 27.1.2.2.3:Park 变换前后波形:正弦变成直流量
匀速旋转向量在 d-q 系下变成直流量——两个控制量被线性化,PI 闪亮登场。而 SVPWM 只接受静止 α-β 系输入,所以 PI 输出 还要经反 Park 变换变回去:
27.3 SVPWM:用 8 个开关状态拼出任意矢量
逆变器只有 8 种开关状态:6 个非零矢量 U1(001)~U6(110)(幅值均为 )+ 2 个零矢量 U0(000)、U7(111)。它们把 360° 分成 6 个 60° 扇区,每个扇区内的目标矢量用相邻两个非零矢量 + 零矢量按伏秒平衡合成:
原书图 27.1.4.1.1:三相绕组示意图
原书图 27.1.4.1.2:U4(100) 导通情况
原书图 27.1.4.1.4:矢量扇区
第一扇区的作用时间:
7 段式分配:每次切换只改变一相开关状态、零矢量对半分配、PWM 对称——扇区 1 的顺序为 U0→U4→U6→U7→U6→U4→U0。
原书图 27.1.4.1.5:第一扇区
原书图 27.1.4.1.6:扇区 1 通电顺序(7 段式)
扇区判断用三个量的符号组合:、、。最大不失真矢量是六边形的内切圆,幅值 ——比 SPWM 的 高出 15.47%,且谐波更小、开关损耗更低。
原书图 27.1.4.1.8:矢量边界:最大不失真范围为六边形内切圆
27.4 转子位置与硬件平台
转子位置(电角度 θ)从哪来?① 霍尔(60° 一格,粗糙);② 编码器(精确,但每次上电需校准对齐——通小电流把转子吸到对齐点并置零);③ 都没有时用观测器估算(滑模观测器、龙伯格观测器、高频注入法)。
硬件仍用 ATK-PD6010B 驱动板(含电流检测、过零检测、传感器反馈、反电动势检测、刹车单元);PMSM 传感器为 DB15 接口需转接板。电机参数对比:
| 参数 | BLDC | PMSM |
|---|---|---|
| 磁极 | 4 极(2 对极) | 8 极(4 对极) |
| 额定 | 24V / 3000RPM / 6.6A | 24V / 3000RPM / 4A |
| 反电势 | 6.6V/kRPM | 4.3V/kRPM |
| 线电阻 / 电感 | 0.4Ω / 0.8mH | 1.02Ω / 0.59mH |
| 传感器 | 霍尔 120° | 1000 线编码器 + 霍尔 |
27.5 MCSDK 实战与例程解析
开发工具 X-CUBE-MCSDK 5.4.4(FUL 完整源码版)+ MotorControlWorkbench + Motor Profiler,依赖 Java 与 STM32CubeMX 5.5.0,安装路径不能含中文。Workbench 配置要点:应用类型选「通用」;MCU 改 STM32F407IG;按手册填电机参数;传感器选霍尔或编码器;MOS 高电平有效;电流传感器按 0.02Ω 采样电阻、差分放大 6 倍设置;速度模式、PWM 16kHz;数字 IO:PWM=定时器 1、霍尔=定时器 5、调试串口=串口 1。
原书图 27.3.1:X-CUBE-MCSDK 组件
必做一步:
生成工程后必须在 CubeMX 中把 SHUTDOWN(PF10)配置为输出且默认拉高 ——不然半桥使能无效、电机纹丝不动!然后 UPDATE 工程、MDK 编译下载。
例程结构(foc_pmsm_m1_encoder_os,FreeRTOS):两个任务——中频任务(每 500µs 调 MC_RunMotorControlTasks → 状态机 ICLWAIT/IDLE/ALIGN_OFFSET_CALIB…编码器对齐完成后自动启动)与安全任务(高优先级保护)。中断全在 stm32f4xx_mc_it.c:TIM1 更新中断触发 ADC 注入通道在 PWM 周期中点采样两相电流,ADC 中断里执行 FOC 主体:
/* FOC 电流环主体:Clarke -> Park -> 双 PI -> 限幅 -> 反Park -> SVPWM */
speedHandle = STC_GetSpeedSensor(pSTC[M1]);
hElAngle = SPD_GetElAngle(speedHandle); /* 编码器获取转子电角度 */
PWMC_GetPhaseCurrents(pwmcHandle[M1], &Iab); /* ADC 注入采样得 ia/ib */
Ialphabeta = MCM_Clarke(Iab); /* Clarke: abc -> αβ */
Iqd = MCM_Park(Ialphabeta, hElAngle); /* Park: αβ -> dq */
Vqd.q = PI_Controller(pPIDIq[M1], /* q 轴 PI: 转矩环 */
(int32_t)(FOCVars[M1].Iqdref.q) - Iqd.q);
Vqd.d = PI_Controller(pPIDId[M1], /* d 轴 PI: id_ref = 0 */
(int32_t)(FOCVars[M1].Iqdref.d) - Iqd.d);
Vqd = Circle_Limitation(pCLM[M1], Vqd); /* 电压圆限幅(89%) */
Valphabeta = MCM_Rev_Park(Vqd, hElAngle); /* 反 Park: dq -> αβ */
hCodeError = PWMC_SetPhaseVoltage(pwmcHandle[M1], Valphabeta); /* SVPWM */
与方波的本质区别:
方波 60° 一步换相、只控占空比;FOC 每个 PWM 周期(16kHz)用 Clarke/Park 把交流量变成直流量做双 PI 闭环,再经反 Park 与 SVPWM 输出 连续可调的旋转电压矢量 ——转矩无跳变。速度环输出作为 内嵌于电流环,形成「电流环(内)+ 速度环(外)」串级结构。验证:上位机监控界面点 Start Motor、拖动圆形旋钮调速,Advanced 页可在线改 PID。
1. Clarke 与 Park 变换各解决什么问题?为什么要反 Park?
Clarke 把三相静止正弦电流(3 变量)等效成两相静止 (恒幅值系数 2/3);Park 把静止系旋到随转子转动的 d-q 系,使正弦量变成直流量从而可用 PI 线性控制;SVPWM 只接受静止 α-β 坐标系输入,故 PI 输出的 必须经反 Park 变回 。
2. SVPWM 如何合成任意电压矢量?最大输出受什么限制?
先由 、、 的符号判断扇区,再用扇区相邻两个非零矢量与零矢量按伏秒平衡 求作用时间(7 段式零矢量对半分配);最大不失真矢量为正六边形内切圆 ,比 SPWM 高约 15.47%。
3. FOC 例程中 Id 给定为何为 0?速度环在哪里实现?
表贴式 PMSM 的 d 轴电流不产生转矩只产生发热,id=0 控制效率最高;速度闭环由速度模式把目标速度经速度环 PI 转为 Iq 电流给定,电流环(d、q 两个 PI)在中断里逐周期执行,构成「速度环(外)+电流环(内)」串级结构。