这一章在干嘛?

全书压轴。磁场定向控制(FOC)通过 Clarke/Park 坐标变换把三相交流量变成两个直流量 分别控制励磁与转矩,再经 SVPWM 调制成连续旋转的电压矢量——转矩平稳、效率高、噪声小。最后用 ST MCSDK 跑通一个真实工程。

27.1 FOC 全景框图

27.2 Clarke 与 Park 变换

27.3 SVPWM:用 8 个开关状态拼出任意矢量

27.4 转子位置与硬件平台

27.5 MCSDK 实战与例程解析

27.1 FOC 全景框图

FOC(field-oriented control,磁场定向控制/矢量控制)是 BLDC 与 PMSM 高效控制的最佳选择:转矩平稳、效率高、噪声小、动态响应快,代价是硬件成本高、对 MCU 要求高、算法难。

原书图 27.1.1.1 原书图 27.1.1.1:电流闭环控制 FOC 框图:八步循环

电流环每个 PWM 周期执行八步:

操作产物
采样三相电流
Clarke 变换(三相静止 → 两相静止)
Park 变换(静止 → 随转子旋转)(直流量!)
与给定 求误差两个误差量
两个 PI 控制器
反 Park 变换(回静止系)
SVPWM 调制三半桥开关状态
循环——

原书图 27.1.3.1 原书图 27.1.3.1:Iq、Id 的含义:Iq 对应转矩,Id 对应励磁

原书图 27.1.3.2 原书图 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 原书图 27.1.2.1.2:Clarke 变换:三相坐标系到两相静止坐标系

原书图 27.1.2.1.3 原书图 27.1.2.1.3:Clarke 变换前后的波形:仍是正弦

变换后仍是正弦(非线性),没法用 PID 直接控——于是Park 变换把坐标系旋到随转子转动(θ 为转子电角度,d 轴与转子磁场重合叫直轴,q 轴垂直叫交轴):

原书图 27.1.2.2.1 原书图 27.1.2.2.1:Park 变换与 d-q 轴示意图

原书图 27.1.2.2.3 原书图 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.1:三相绕组示意图

原书图 27.1.4.1.2 原书图 27.1.4.1.2:U4(100) 导通情况

原书图 27.1.4.1.4 原书图 27.1.4.1.4:矢量扇区

第一扇区的作用时间:

7 段式分配:每次切换只改变一相开关状态、零矢量对半分配、PWM 对称——扇区 1 的顺序为 U0→U4→U6→U7→U6→U4→U0。

原书图 27.1.4.1.5 原书图 27.1.4.1.5:第一扇区

原书图 27.1.4.1.6 原书图 27.1.4.1.6:扇区 1 通电顺序(7 段式)

扇区判断用三个量的符号组合:。最大不失真矢量是六边形的内切圆,幅值 ——比 SPWM 的 高出 15.47%,且谐波更小、开关损耗更低。

原书图 27.1.4.1.8 原书图 27.1.4.1.8:矢量边界:最大不失真范围为六边形内切圆

27.4 转子位置与硬件平台

转子位置(电角度 θ)从哪来?① 霍尔(60° 一格,粗糙);② 编码器(精确,但每次上电需校准对齐——通小电流把转子吸到对齐点并置零);③ 都没有时用观测器估算(滑模观测器、龙伯格观测器、高频注入法)。

硬件仍用 ATK-PD6010B 驱动板(含电流检测、过零检测、传感器反馈、反电动势检测、刹车单元);PMSM 传感器为 DB15 接口需转接板。电机参数对比:

参数BLDCPMSM
磁极4 极(2 对极)8 极(4 对极)
额定24V / 3000RPM / 6.6A24V / 3000RPM / 4A
反电势6.6V/kRPM4.3V/kRPM
线电阻 / 电感0.4Ω / 0.8mH1.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 原书图 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。