电机驱动开发学习25. 弱磁控制与全速域增益调度
-
- [一、 课程上下文与整体设计](#一、 课程上下文与整体设计)
-
- [1.1 为什么需要弱磁控制与增益调度?](#1.1 为什么需要弱磁控制与增益调度?)
-
- [1. 电压极限与弱磁控制(Flux Weakening, FW)](#1. 电压极限与弱磁控制(Flux Weakening, FW))
- [2. 全速域动态特性的剧烈变化与增益调度(Gain Scheduling, GS)](#2. 全速域动态特性的剧烈变化与增益调度(Gain Scheduling, GS))
- [1.2 课程演进与知识图谱](#1.2 课程演进与知识图谱)
- [1.3 控制架构与数据流图](#1.3 控制架构与数据流图)
- [二、 数学原理与控制策略](#二、 数学原理与控制策略)
-
- [2.1 永磁同步电机稳态极限分析](#2.1 永磁同步电机稳态极限分析)
-
- [1. 电压极限圆(Voltage Limit Ellipse/Circle)](#1. 电压极限圆(Voltage Limit Ellipse/Circle))
- [2. 电流极限圆(Current Limit Circle)](#2. 电流极限圆(Current Limit Circle))
- [3. 动态电流限幅分配](#3. 动态电流限幅分配)
- [2.2 电压反馈型闭环弱磁控制(Single-Loop Voltage Feedback FW)](#2.2 电压反馈型闭环弱磁控制(Single-Loop Voltage Feedback FW))
- [2.3 全速域分段增益调度(Gain Scheduling)策略](#2.3 全速域分段增益调度(Gain Scheduling)策略)
- [三、 工程实现要点与核心代码解读](#三、 工程实现要点与核心代码解读)
-
- [3.1 目录结构与新增文件说明](#3.1 目录结构与新增文件说明)
- [3.2 核心数据结构设计 (`bsp_fw.h`)](#3.2 核心数据结构设计 (
bsp_fw.h)) - [3.3 电压闭环弱磁核心逻辑 (`User/foc/bsp_fw.c`)](#3.3 电压闭环弱磁核心逻辑 (
User/foc/bsp_fw.c)) -
- [3.3.1 程序里「弱磁」到底在干什么?](#3.3.1 程序里「弱磁」到底在干什么?)
- [3.3.2 实现要点与示意代码](#3.3.2 实现要点与示意代码)
- [3.4 增益调度分段改写实现 (`User/foc/bsp_fw.c`)](#3.4 增益调度分段改写实现 (
User/foc/bsp_fw.c)) - [3.5 运行时改写 PI 与积分连续性处理 (`bsp_pid_app.c`)](#3.5 运行时改写 PI 与积分连续性处理 (
bsp_pid_app.c))
- [四、 调试指南与实验 CookBook](#四、 调试指南与实验 CookBook)
-
- [4.0 板上实测与上板边界(必读)](#4.0 板上实测与上板边界(必读))
- [4.1 串口命令行(仅本机可跑流程)](#4.1 串口命令行(仅本机可跑流程))
- [4.1.1 怎么看弱磁控制是否生效?](#4.1.1 怎么看弱磁控制是否生效?)
- [4.2 FreeMASTER / VOFA+ 观测(本机 800 段)](#4.2 FreeMASTER / VOFA+ 观测(本机 800 段))
- [4.3 常见故障(对照本机边界)](#4.3 常见故障(对照本机边界))
- [4.4 概念仿真(Python,对照用,非上板高速测试)](#4.4 概念仿真(Python,对照用,非上板高速测试))
- [五、 总结与后续演进](#五、 总结与后续演进)
-
- [5.1 本章核心收益回顾](#5.1 本章核心收益回顾)
- [5.2 算法与板上局限性](#5.2 算法与板上局限性)

一、 课程上下文与整体设计
1.1 为什么需要弱磁控制与增益调度?
在前面的课程(L20~L23)中,我们完成了基于霍尔传感器的 FOC 基础建设,包括双采样标定、矢量调制(SVPWM)与完善的系统保护机制。Lesson 24 则进一步引入了滑模观测器(SMO)与锁相环(PLL),打通了从 Align(对齐) → \rightarrow → I/F(启动) → \rightarrow → IF-hold → \rightarrow → Hall FOC 的全流程,并实现了 SMO+PLL 后台角速度估计与无位置传感器可重复启动能力。
然而,当电机转速升高至额定转速附近时,系统会遭遇严重的物理边界瓶颈。
1. 电压极限与弱磁控制(Flux Weakening, FW)
永磁同步电机(PMSM)在旋转时,定子绕组切割永磁体磁场会产生反电动势(Back-EMF, E E E)。其幅值与电角速度成正比:
∣ E ∣ = ω e ψ f \vert{}E\vert{} = \omega_e \psi_f ∣E∣=ωeψf
在驱动器中,逆变器能输出的最大无失真相电压幅值受到直流母线电压 V b u s V_{\mathrm{bus}} Vbus 的严格限制(基于空间矢量调制 SVPWM):
∣ V s ∣ max = V lim = V b u s 3 ⋅ η \vert{}V_s\vert{}{\max} = V{\lim} = \frac{V_{\mathrm{bus}}}{\sqrt{3}} \cdot \eta ∣Vs∣max=Vlim=3 Vbus⋅η
其中 η \eta η 为空间利用率/电压裕量系数(工程上通常取 0.90 ∼ 0.98 0.90 \sim 0.98 0.90∼0.98)。
当电机转速升至基速(Base Speed, ω b \omega_b ωb)时,反电动势及定子压降的矢量和将顶满逆变器的最大电压幅值极限(即电压圆):
∣ V s ∣ = V d 2 + V q 2 ≤ V lim \vert{}V_s\vert{} = \sqrt{V_d^2 + V_q^2} \le V_{\lim} ∣Vs∣=Vd2+Vq2 ≤Vlim
在基速以上,即使电流环 PID 将交轴电压 V q V_q Vq 输出至饱和状态,也无法继续向电机注入交轴电流 I q I_q Iq 来产生电磁转矩。
为了突破基速限制,必须引入弱磁控制(FW) :通过主动向直轴注入负电流( I d ≤ 0 I_d \le 0 Id≤0),产生与永磁体主磁场方向相反的定子直轴磁通,从而削弱气隙主磁通,抵消部分反电动势。这相当于人为降低了电机的"等效反电动势常数",腾出了电压裕量,使转速得以突破基速限制,迈向更高的超频/弱磁运行区。
2. 全速域动态特性的剧烈变化与增益调度(Gain Scheduling, GS)
电机系统在全速域运行(从 0 r p m 0\,\mathrm{rpm} 0rpm 到高达 150 % 150\% 150% 额定转速的弱磁区)时,其系统模型和环境参数会发生巨大漂移:
- SMO 观测器反电动势信号强度变化 :SMO 的核心是观测反电动势信号 E d , E q E_d, E_q Ed,Eq。在极低速时,反电动势信号微弱(低信噪比),如果滑模增益 K s m o K_{\mathrm{smo}} Ksmo 设置过大,极其容易引入高频抖振与噪声;而在高速/弱磁区,反电动势幅值剧增,若保持低速时的增益不变,滑模面收敛速度将跟不上系统状态变化,导致观测相位滞后甚至失步。
- 锁相环(PLL)动态响应:PLL 用于从估计的反电动势中提炼转速和角度,其自然频率与阻尼比需要与系统当前的转速和噪声动态相匹配。
- 电流环与速度环交叠耦合 :弱磁区内,直轴电压与交轴电压存在强交叉耦合关系( − ω e L q I q -\omega_e L_q I_q −ωeLqIq 与 ω e ( L d I d + ψ f ) \omega_e (L_d I_d + \psi_f) ωe(LdId+ψf)),系统饱和度极高,PID 的动态裕量显著收窄,保持固定 PI 参数会导致环路振荡。
因此,单组固定的 PI 与 SMO 参数无法兼顾从零速启动到极高转速弱磁的全速域稳定性和动态响应。引入全速域增益调度(Gain Scheduling),根据当前实时转速区间平滑改写调节器与观测器增益,是实现宽调速范围变频驱动的关键。
1.2 课程演进与知识图谱
| 章节 | 核心能力 | 本章关系 |
|---|---|---|
| L20~23 | Hall FOC 基座 + 采样 + 标定 + 保护 | 继承:提供基础 FOC 矢量控制与硬件电流/电压采样能力 |
| L24 | SMO+PLL 观测与无感可重复启动 | 继承与瓶颈:提供后台角速度与位置估测;但高速下受限于逆变器电压圆极限 |
| L25(本章) | 电压反馈弱磁 + 全速域增益调度 | 扩展 :模块落地;本机板上以 t 800 验收,不做超高速弱磁冲击 |
| L26(预告) | 参数辨识与前馈解耦 | 后续优化 :消除 R s / L s R_s/L_s Rs/Ls 及温漂对交叉解耦与弱磁控制相位的负面影响 |
本课工程默认拓扑与边界:
- 控角链路继承 L24 路径(Hall 闭环或条件 SMO 闭环)。
- 弱磁算法模块仅通过改写直轴电流指令 I d ∗ I_d^* Id∗ 来干预 FOC。
- 增益调度模块仅在运行时改写 PI 参数( K p , K i K_p, K_i Kp,Ki)与 SMO/PLL 滤波增益。
- 提供配置宏
FOC_FW_ENABLE与FOC_GS_ENABLE,置 0 时系统可完全无缝退回 L24 状态。
1.3 控制架构与数据流图
下图展示了从速度环采样到 SVPWM 调制的完整计算闭环。弱磁控制与增益调度以 20Hz( 50 m s 50\,\mathrm{ms} 50ms 周期,速度环节奏)在后台被触发更新,而电流环与 SMO 则运行在 15kHz 的高频中断中。

二、 数学原理与控制策略
2.1 永磁同步电机稳态极限分析
在 dq 旋转坐标系下,PMSM 的稳态电压方程为(忽略定子电阻压降 I R s I R_s IRs):
{ V d = − ω e L q I q V q = ω e ( ψ f + L d I d ) \begin{cases} V_d = -\omega_e L_q I_q \\ V_q = \omega_e (\psi_f + L_d I_d) \end{cases} {Vd=−ωeLqIqVq=ωe(ψf+LdId)
其中:
- ω e \omega_e ωe 为电角速度( ω e = P n ⋅ ω m \omega_e = P_n \cdot \omega_m ωe=Pn⋅ωm, P n P_n Pn 为极对数, ω m \omega_m ωm 为机械角速度);
- L d , L q L_d, L_q Ld,Lq 为直轴与交轴电感;
- ψ f \psi_f ψf 为永磁体链过定子的磁通幅值。
由上式可知,交轴电压 V q V_q Vq 由两部分组成:永磁体主感应电动势 ω e ψ f \omega_e \psi_f ωeψf,以及直轴电流产生的交轴去磁压降 ω e L d I d \omega_e L_d I_d ωeLdId。
1. 电压极限圆(Voltage Limit Ellipse/Circle)
逆变器输出的最大电压能力限制了 V d V_d Vd 和 V q V_q Vq 的模长:
V d 2 + V q 2 ≤ V lim 2 ⟹ ( − ω e L q I q ) 2 + ( ω e ( ψ f + L d I d ) ) 2 ≤ V lim 2 V_d^2 + V_q^2 \le V_{\lim}^2 \implies (-\omega_e L_q I_q)^2 + (\omega_e (\psi_f + L_d I_d))^2 \le V_{\lim}^2 Vd2+Vq2≤Vlim2⟹(−ωeLqIq)2+(ωe(ψf+LdId))2≤Vlim2
整理后可得 ( I d , I q ) (I_d, I_q) (Id,Iq) 平面上的电压极限椭圆方程:
( I d + ψ f L d ) 2 ( V lim ω e L d ) 2 + I q 2 ( V lim ω e L q ) 2 ≤ 1 \frac{(I_d + \frac{\psi_f}{L_d})^2}{\left(\frac{V_{\lim}}{\omega_e L_d}\right)^2} + \frac{I_q^2}{\left(\frac{V_{\lim}}{\omega_e L_q}\right)^2} \le 1 (ωeLdVlim)2(Id+Ldψf)2+(ωeLqVlim)2Iq2≤1
对于表贴式永磁同步电机(SPM, L d = L q = L s L_d = L_q = L_s Ld=Lq=Ls),该方程简化为圆心位于 ( − ψ f L s , 0 ) (-\frac{\psi_f}{L_s}, 0) (−Lsψf,0),半径为 R v = V lim ω e L s R_v = \frac{V_{\lim}}{\omega_e L_s} Rv=ωeLsVlim 的电压圆。
随着电角速度 ω e \omega_e ωe 的升高,电压圆半径 R v R_v Rv 按照 1 ω e \frac{1}{\omega_e} ωe1 的比例缩小,逼近原点 ( 0 , 0 ) (0,0) (0,0)。若不注入负 I d I_d Id, I d = 0 I_d=0 Id=0 轴上的可运行区间将会被迅速压缩至 0。
2. 电流极限圆(Current Limit Circle)
逆变器与电机绕组受限于最大发热与过流能力,定子电流矢量模长不能超过最大允许电流 I s , max I_{s,\max} Is,max:
I d 2 + I q 2 ≤ I s , max 2 I_d^2 + I_q^2 \le I_{s,\max}^2 Id2+Iq2≤Is,max2
在 ( I d , I q ) (I_d, I_q) (Id,Iq) 平面上,这是一个圆心位于原点 ( 0 , 0 ) (0,0) (0,0),半径为 I s , max I_{s,\max} Is,max 的圆。

3. 动态电流限幅分配
当注入负的弱磁电流 I d ∗ < 0 I_d^* < 0 Id∗<0 后,根据电流极限圆约束,交轴电流的最大可用上限 I q , max I_{q,\max} Iq,max 必须被动态裁剪:
I q , max = I s , max 2 − ( I d ∗ ) 2 I_{q,\max} = \sqrt{I_{s,\max}^2 - (I_d^*)^2} Iq,max=Is,max2−(Id∗)2
速度环 PI 调节器的输出 I q ∗ I_q^* Iq∗ 必须经由 I q , max I_{q,\max} Iq,max 进行饱和限幅:
I q ∗ = s a t ( I q , raw ∗ , − I q , max , I q , max ) I_q^* = \mathrm{sat}\left(I_{q,\text{raw}}^*, \, -I_{q,\max}, \, I_{q,\max}\right) Iq∗=sat(Iq,raw∗,−Iq,max,Iq,max)
2.2 电压反馈型闭环弱磁控制(Single-Loop Voltage Feedback FW)
弱磁控制算法主要分为基于电机模型的开环查表法 (根据电机参数计算出理论 I d I_d Id)与基于电压反馈的闭环控制法。
由于电机参数(如 ψ f , L d , L q \psi_f, L_d, L_q ψf,Ld,Lq)在实际运行中会随温度变化发生严重漂移,且母线电压 V b u s V_{\mathrm{bus}} Vbus 存在波动,开环方法极易导致电压过饱和而失控。本课工程采用单环电压反馈闭环弱磁算法。

算法步骤:
-
反馈调制电压幅值计算 :
∣ V s ∣ = V d 2 + V q 2 \vert{}V_s\vert{} = \sqrt{V_d^2 + V_q^2} ∣Vs∣=Vd2+Vq2
-
电压裕量偏差计算 :
e v = ∣ V s ∣ − V lim e_v = \vert{}V_s\vert{} - V_{\lim} ev=∣Vs∣−Vlim
当 ∣ V s ∣ > V lim \vert{}V_s\vert{} > V_{\lim} ∣Vs∣>Vlim 时, e v > 0 e_v > 0 ev>0,说明端电压顶满极限,产生过饱和;反之 e v < 0 e_v < 0 ev<0 说明电压裕量充足。
- 弱磁 PI 调节器积分计算 :
I d , r a w ∗ = − ( K p , f w ⋅ e v + K i , f w ∫ e v d t ) I_{d,\mathrm{raw}}^* = - \left( K_{p,\mathrm{fw}} \cdot e_v + K_{i,\mathrm{fw}} \int e_v \, dt \right) Id,raw∗=−(Kp,fw⋅ev+Ki,fw∫evdt)
- 单向钳位与物理限幅 :
弱磁算法只允许输出负的直轴电流 (防止误注入正 I d I_d Id 导致增磁产生更大反电动势过压),同时其幅值受限于系统允许的最大弱磁电流 I d , min I_{d,\min} Id,min:
I d ∗ = c l a m p ( I d , r a w ∗ , I d , min , 0 ) I_d^* = \mathrm{clamp}\left(I_{d,\mathrm{raw}}^*, \, I_{d,\min}, \, 0\right) Id∗=clamp(Id,raw∗,Id,min,0)
其中 I d , min = − F O C _ F W _ I D _ M I N _ A I_{d,\min} = -FOC\_FW\_ID\_MIN\_A Id,min=−FOC_FW_ID_MIN_A(例如 − 2.5 A -2.5\,\mathrm{A} −2.5A)。
- 滞回退出机制 :
为防止电机在基速临界点附近运行时, I d ∗ I_d^* Id∗ 在 0 A 0\,\mathrm{A} 0A 与负值之间频繁震荡造成系统失稳,设置转速与电压的双重滞回限制:仅当转速高于 FOC_FW_BASE_RPM 且 e v > 0 e_v > 0 ev>0 时才使能弱磁积分;当转速低于 FOC_FW_EXIT_RPM 且 ∣ V s ∣ < V lim × 0.95 \vert{}V_s\vert{} < V_{\lim} \times 0.95 ∣Vs∣<Vlim×0.95 时,强行复位弱磁 PI 积分器并将 I d ∗ I_d^* Id∗ 清零退出。
2.3 全速域分段增益调度(Gain Scheduling)策略
系统将电机的全运行转速划分为 4 个区段(Zone 0 ~ Zone 3),并在后台根据当前测量转速平滑切换或插值更新调节器参数。
text
转速 (rpm)
▲
3200│────────────────────────────────────────── Zone 3 (FW 弱磁区)
│ • 弱磁开启,强交叉耦合
│ • 进一步收紧 PI 增益,SMO_K 抬升至最高
2000│────────────────────────────────────────── Zone 2 (High 高速区)
│ • 反电动势充足,信噪比极佳
│ • 电流环/速度环 PI 适当放软,防振荡
600│────────────────────────────────────────── Zone 1 (Mid 中速区)
│ • 额定线性区
│ • SMO_K & PLL 增益随转速线性抬升
0│────────────────────────────────────────── Zone 0 (Low 低速/启动区)
▼ • SMO_K 降低(×0.75)抑抖,速度环较软
各区段调节策略与参数设计表:
| 区段名称 | 机械转速范围 ( r p m \mathrm{rpm} rpm) | SMO 观测器增益 K s m o K_{\mathrm{smo}} Ksmo | PLL 锁相环带宽 ω n \omega_n ωn | 速度环 PI ( K p , s , K i , s K_{p,s}, K_{i,s} Kp,s,Ki,s) | 电流环 PI ( K p , c , K i , c K_{p,c}, K_{i,c} Kp,c,Ki,c) | 控制策略物理目的 |
|---|---|---|---|---|---|---|
| Zone 0 (Low) | 0 ≤ n < 600 0 \le n < 600 0≤n<600 | K b a s e × 0.75 K_{\mathrm{base}} \times 0.75 Kbase×0.75 | 低带宽(重滤波) | 偏软(较小 K p K_p Kp) | 基准增益 | 降低开关抖振噪声,平滑切入无感控制 |
| Zone 1 (Mid) | 600 ≤ n < 2000 600 \le n < 2000 600≤n<2000 | 随着转速线性抬升 | 中等带宽 | 标准增益 | 基准增益 | 匹配反电动势增长,保障动态响应速度 |
| Zone 2 (High) | 2000 ≤ n < 3200 2000 \le n < 3200 2000≤n<3200 | 高增益维持 | 高带宽 | 稍微放软 | 增益适度收紧 | 抑制高频相位噪声,防止中高频谐振 |
| Zone 3 (FW) | n ≥ 3200 n \ge 3200 n≥3200 | 额外抬升 1.2 × 1.2\times 1.2× | 额定最高带宽 | 软调节(防止超调) | 增益收敛 0.8 × 0.8\times 0.8× | 适应电压饱和状态下的强耦合与低增益裕量 |
无缝切换防冲击要点 :
在 PI 控制器中,若在运行期间直接修改 K p K_p Kp 或 K i K_i Ki,极易产生控制量突变(Spike)。本工程在
fw_gain_schedule()执行增益更新时,采用无抖动平滑过渡算法 ,在修改 K p K_p Kp 的同时对积分累加量(Integrator Accumulator)进行等比修正(或保持控制输出 u ( t ) u(t) u(t) 连续),且**严禁在增益切换时执行pi_reset()**。
三、 工程实现要点与核心代码解读
3.1 目录结构与新增文件说明
text
User/foc/
├── bsp_fw.h # 弱磁与增益调度宏定义、数据结构与 API 声明
├── bsp_fw.c # 弱磁闭环算法与分段增益调度实现
├── bsp_smo.h / .c # SMO 观测器 (开放运行时 SMO_K / PLL 增益改写接口)
├── bsp_pid_app.h / .c # PID 环路调用逻辑更新 (整合弱磁与电流限幅)
└── bsp_foc.h / .c # FOC 基础接口与速度限幅放宽
sim/
└── fw_gain_simulation.py # Python 弱磁与增益调度理论仿真与验算脚本
3.2 核心数据结构设计 (bsp_fw.h)
c
typedef struct {
uint8_t fw_enable; /* 弱磁功能总使能开关: 0-禁用, 1-使能 */
uint8_t gs_enable; /* 增益调度总使能开关: 0-禁用, 1-使能 */
uint8_t fw_active; /* 当前是否处于弱磁激活状态指示 Flag */
uint8_t gs_zone; /* 当前增益调度所在的 Zone 编号 (0, 1, 2, 3) */
/* 弱磁闭环 PI 参数与状态变量 */
float kp; /* 弱磁 PI 比例系数 */
float ki; /* 弱磁 PI 积分系数 */
float integrator; /* 弱磁积分器累加值 (A) */
float id_cmd; /* 弱磁计算生成的 Id* 指令 (<= 0.0f) */
/* 运行状态监控量 */
float vs_mag; /* 当前电压矢量模长 |Vs| (V) */
float vs_lim; /* 逆变器最大无失真电压极限 Vlim (V) */
float modulation_ratio;/* 调制比 m = |Vs| / Vlim */
float iq_max; /* 动态电流圆裁剪后的 Iq 上限 (A) */
} fw_gs_controller_t;
extern fw_gs_controller_t g_fw_gs_ctrl;
3.3 电压闭环弱磁核心逻辑 (User/foc/bsp_fw.c)
3.3.1 程序里「弱磁」到底在干什么?
常见误解:弱磁 = 转速 if 超限就砍速 / 限 t。
本工程不是这样。 弱磁模块的本体是:电压圆吃紧时,把直轴电流指令改成负的 (I_d^*) ,用电流削弱气隙磁通、腾出电压裕量;同时按电流圆收紧 (I_{q,\max})。串口把 t 钳到 1200、以及 allow_fw 里一堆转速判断,都不是弱磁算法本身。
速度环约每 (50,\mathrm{ms}) 调用一次 fw_voltage_step()(bsp_pid_app.c),数据流如下:


| 动作 | 是否弱磁本体 | 说明 |
|---|---|---|
改 Id* 为负 |
✅ 是 | 削弱磁通,对应理论里的 (I_d\le 0) |
用 Iq_max 限交轴 |
✅ 配套 | (I_{q,\max}=\sqrt{I_{s,\max}2-(I_d*)^2}) |
allow_fw 等 if (rpm...) |
❌ 准入开关 | 决定「现在允不允许算弱磁」,防中低速误触发互抖 |
串口 t 钳到 1200 |
❌ 无关 | 防 IF 大滑差失步的目标软限制,见 bsp_pid_app.c |
| I/F、IF-hold 期间不调 FW | ❌ 保护 | 开环大 Vq 易假饱和,避免狂灌负 Id |
和「单纯限额」的差别:
- 限额:超速 → 限目标转速 / 砍 (I_q) → 转速上不去,也没有「削弱磁场」。
- 本课弱磁 :(\lvert V_s\rvert) 顶满 → 负 (I_d^*) → 同样母线下理论上能转得更快;电流环仍是
Id→Id*、Iq→Iq*,只是Id*不再固定为 0。
本机在 t 800 稳态常见 en=1, act=0, Id*≈0:模块已使能,但未进入弱磁区------这是预期,不是坏了(见 §4.1.1)。
3.3.2 实现要点与示意代码
下面的代码片段展现了弱磁控制步骤:计算端电压模长 → \rightarrow → 比对电压极限 → \rightarrow → 抗积分饱和 PI 调节 → \rightarrow → 结合电流圆裁剪 I q , max I_{q,\max} Iq,max。(示意用;以仓库 bsp_fw.c 为准。)
c
#include "bsp_fw.h"
#include "bsp_foc.h"
#include "arm_math.h"
fw_gs_controller_t g_fw_gs_ctrl = {
.fw_enable = FOC_FW_ENABLE,
.gs_enable = FOC_GS_ENABLE,
.kp = 0.005f, /* 弱磁闭环 Kp */
.ki = 0.001f, /* 弱磁闭环 Ki */
.id_cmd = 0.0f,
.fw_active = 0,
.gs_zone = 0
};
/**
* @brief 电压反馈弱磁一步计算 (建议 20Hz / 50ms 周期调用)
* @param vd: 当前直轴电压 Vd (V)
* @param vq: 当前交轴电压 Vq (V)
* @param vbus: 直流母线电压采样值 (V)
* @param actual_rpm: 当前实测机械转速 (rpm)
* @param out_id_cmd: [out] 输出的直轴电流指令 Id* (A)
* @param out_iq_max: [out] 输出的交轴电流最大限制 Iq_max (A)
*/
void fw_voltage_step(float vd, float vq, float vbus, float actual_rpm,
float *out_id_cmd, float *out_iq_max)
{
float abs_rpm = fabsf(actual_rpm);
/* 1. 计算逆变器最大无失真相电压幅值极限 Vlim (SVPWM 线性调制区) */
g_fw_gs_ctrl.vs_lim = (vbus / 1.7320508f) * FOC_FW_VS_REF_RATIO;
/* 2. 计算当前实际输出电压矢量模长 |Vs| = sqrt(Vd^2 + Vq^2) */
arm_sqrt_f32(vd * vd + vq * vq, &g_fw_gs_ctrl.vs_mag);
/* 3. 计算当前调制比 m */
if (g_fw_gs_ctrl.vs_lim > 0.1f) {
g_fw_gs_ctrl.modulation_ratio = g_fw_gs_ctrl.vs_mag / g_fw_gs_ctrl.vs_lim;
} else {
g_fw_gs_ctrl.modulation_ratio = 0.0f;
}
/* 4. 判别弱磁进入与退出条件 (滞回控制) */
if (!g_fw_gs_ctrl.fw_enable) {
g_fw_gs_ctrl.fw_active = 0;
g_fw_gs_ctrl.integrator = 0.0f;
g_fw_gs_ctrl.id_cmd = 0.0f;
} else {
if (abs_rpm >= FOC_FW_BASE_RPM || g_fw_gs_ctrl.modulation_ratio > 0.98f) {
g_fw_gs_ctrl.fw_active = 1; /* 进入弱磁区 */
} else if (abs_rpm < FOC_FW_EXIT_RPM && g_fw_gs_ctrl.modulation_ratio < 0.92f) {
g_fw_gs_ctrl.fw_active = 0; /* 退出弱磁区 */
g_fw_gs_ctrl.integrator = 0.0f;
g_fw_gs_ctrl.id_cmd = 0.0f;
}
}
/* 5. 若弱磁激活,执行电压误差积分 PI 调节 */
if (g_fw_gs_ctrl.fw_active) {
float err_v = g_fw_gs_ctrl.vs_mag - g_fw_gs_ctrl.vs_lim;
/* 积分累加 */
g_fw_gs_ctrl.integrator += g_fw_gs_ctrl.ki * err_v;
/* 积分抗饱和防爆钳位: 限制在 [-FOC_FW_ID_MIN_A, 0.0f] */
if (g_fw_gs_ctrl.integrator < -FOC_FW_ID_MIN_A) {
g_fw_gs_ctrl.integrator = -FOC_FW_ID_MIN_A;
} else if (g_fw_gs_ctrl.integrator > 0.0f) {
g_fw_gs_ctrl.integrator = 0.0f;
}
/* 计算包含比例和积分的 PI 输出 */
float id_target = - (g_fw_gs_ctrl.kp * err_v) + g_fw_gs_ctrl.integrator;
/* 单向与幅值约束: Id* 必须 <= 0.0A */
if (id_target > 0.0f) {
id_target = 0.0f;
} else if (id_target < -FOC_FW_ID_MIN_A) {
id_target = -FOC_FW_ID_MIN_A;
}
g_fw_gs_ctrl.id_cmd = id_target;
}
/* 6. 基于电流极限圆求解最大允许交轴电流 Iq_max = sqrt(Is_max^2 - Id*^2) */
float id_sq = g_fw_gs_ctrl.id_cmd * g_fw_gs_ctrl.id_cmd;
float is_max_sq = FOC_FW_IS_MAX_A * FOC_FW_IS_MAX_A;
if (is_max_sq > id_sq) {
arm_sqrt_f32(is_max_sq - id_sq, &g_fw_gs_ctrl.iq_max);
} else {
g_fw_gs_ctrl.iq_max = 0.0f; /* 若 Id 占满电流圆,Iq 被压缩至 0 */
}
/* 输出参数写回 */
*out_id_cmd = g_fw_gs_ctrl.id_cmd;
*out_iq_max = g_fw_gs_ctrl.iq_max;
}
3.4 增益调度分段改写实现 (User/foc/bsp_fw.c)
c
/**
* @brief 全速域增益调度逻辑 (按转速平滑重构 PI / SMO 参数)
* @param actual_rpm: 当前实测机械转速 (rpm)
*/
void fw_gain_schedule(float actual_rpm)
{
if (!g_fw_gs_ctrl.gs_enable) {
return;
}
float abs_rpm = fabsf(actual_rpm);
uint8_t target_zone = 0;
/* Zone 区域判定 */
if (abs_rpm < 600.0f) {
target_zone = 0;
} else if (abs_rpm < 2000.0f) {
target_zone = 1;
} else if (abs_rpm < 3200.0f) {
target_zone = 2;
} else {
target_zone = 3;
}
g_fw_gs_ctrl.gs_zone = target_zone;
/* 设定不同 Zone 下的目标增益 */
float smo_k_factor = 1.0f;
float pll_bw_factor = 1.0f;
float spd_pi_factor = 1.0f;
switch (target_zone) {
case 0: /* Low 区: 低速降增益抑抖 */
smo_k_factor = 0.75f;
pll_bw_factor = 0.80f;
spd_pi_factor = 0.85f;
break;
case 1: /* Mid 区: 标称线性插值 */
smo_k_factor = 0.75f + 0.25f * ((abs_rpm - 600.0f) / 1400.0f);
pll_bw_factor = 1.00f;
spd_pi_factor = 1.00f;
break;
case 2: /* High 区: 高速区放软速度环,保持 SMO 增益 */
smo_k_factor = 1.10f;
pll_bw_factor = 1.10f;
spd_pi_factor = 0.90f;
break;
case 3: /* FW 弱磁区: 反电动势高,SMO_K 再次抬升,PI 再收软 */
smo_k_factor = 1.35f;
pll_bw_factor = 1.25f;
spd_pi_factor = 0.75f;
break;
default:
break;
}
/* 将改写后的参数下发给底层子系统 (注意:此处仅平滑更新系数,绝不能复位 PID) */
smo_pll_set_gains(smo_k_factor, pll_bw_factor);
pid_speed_set_dynamic_factor(spd_pi_factor);
}
3.5 运行时改写 PI 与积分连续性处理 (bsp_pid_app.c)
在传统的 PID 实现中,修改 K p / K i K_p/K_i Kp/Ki 如果触发 pi_reset() 或是直接改写参数,会导致输出突变。为了保证在增益调度过程中的控制连续性:
c
void pid_speed_set_dynamic_factor(float factor)
{
/* 保持当前基准 Kp, Ki 参数,乘以调度缩放因子 */
float new_kp = g_pid_speed_base_kp * factor;
float new_ki = g_pid_speed_base_ki * factor;
/* 无缝切换处理:调整积分无缝累加值,确保在 Kp 变化瞬间,PID 总输出 u(t) 不发生突变 */
/* u(t) = Kp * e(t) + Integral */
/* Integral_new = u(t) - Kp_new * e(t) */
float err = pid_speed.target - pid_speed.feedback;
float current_u = pid_speed.output;
pid_speed.kp = new_kp;
pid_speed.ki = new_ki;
/* 修正 pid 累加量 */
pid_speed.integral = current_u - (new_kp * err);
}
四、 调试指南与实验 CookBook
4.0 板上实测与上板边界(必读)
本机不要测过高转速。 稳区约 800--850 rpm;
t >1200固件自动钳到 1200。深度弱磁(千转以上)本课不作板上验收。
| 项目 | 结果 |
|---|---|
| 推荐测试 | t 800(Hall FOC,可重复) |
| 稳定运行 | 约 800--850 rpm |
| 软顶(真实转子) | 约 1100 rpm;再高易 IF 大滑差、Iq 跟丢 |
t 软限制 |
t >1200 → 钳到 1200(防止误设更高目标开环冲飞) |
| 本课验收重点 | fw / gs 模块可用;800 段 pid/fw 读数正常 |
| 不做 | 板上冲击 2500 / 3500 / 3800;勿按旧 Cookbook 超高速阶跃 |
推荐顺序:
text
r → s 0(等 ~2s)→ t 800 → w 1 → pid / fw / gs → w 0
瓶颈简述:>850 走 IF 巡航,开环 θ 易与转子脱节;本机软顶主要是角度路径 ,不是 Ke 电压圆先到(概念仿真见 sim/fw_gain_simulation.py)。高速/深弱磁留给 L26 及以后。
4.1 串口命令行(仅本机可跑流程)
波特率 115200:
text
r
s 0
t 800
w 1
pid # ACT≈800;看 Vd/Vq、mod、Id*
fw
gs
w 0
不要再用 t 2500 / t 3500 / t 3800 做上板实验。若误输入高目标,应看到 note: clamp ... -> 1200。
4.1.1 怎么看弱磁控制是否生效?
发串口:
text
fw
pid
| 字段 | 含义 | 「弱磁在干活」时 |
|---|---|---|
FW: en=1 |
弱磁开关开着 | 模块已使能(必要非充分) |
act=1 |
正在弱磁 | 真正在注入 |
Id* / Id_cmd |
直轴指令 | 明显为负(如 −0.5A~−2.5A) |
Mod / mod |
(\lvert V_s\rvert/V_{\lim}) | 贴近 ~0.9--1.0,且仍欠速时更易触发 |
Iq_max |
电流圆剩余 | Id* 变负后会略降 |
对比实验:fw 0 关闭、fw 1 打开,同一工况看 Id* 是否变化。
本机 t≤850(稳区约 800)对照:
- 正常多为:
en=1,act=0,Id*≈0,Mod不饱和 → 模块在、弱磁未激活。 - 原因:远未顶满电压圆;且稳态
rpm<900时固件会强制退弱磁,避免与速度环互抖。 - 若要看到
act=1且深负Id*,需要真实转速进入电压圆吃紧区;本机角度路径软顶约 1100,深度弱磁验收留待后续课程。概念曲线可用sim/fw_gain_simulation.py。
4.2 FreeMASTER / VOFA+ 观测(本机 800 段)
采样约 50 H z 50\,\mathrm{Hz} 50Hz,建议通道:
text
g_fm_actual_rpm / g_fm_target_rpm
g_fm_fw_mod / g_fm_fw_id_ma
g_fm_target_iq / g_fm_gs_zone
在 t 800 稳态下:ACT 贴目标;Id* 宜接近 0;mod 有读数即可。不必做 2000→3800 弱磁阶跃波形验收。
4.3 常见故障(对照本机边界)
text
常见异常排查
├── 1. 误设 t 2500/3500,电机抖或不转 / Iq≈0
│ └── 预期:固件应 clamp→1200;稳跑仍建议 t 800;异常则 w 0 后 t 800 → w 1
│
├── 2. t 800 时 ACT 不稳、峰峰很大
│ ├── 弱磁误触发负 Id 互抖 → 查 fw,稳态 Id* 应近 0
│ └── 测速毛刺 → 看 Hall/TIM,勿用 IF sync 当 ACT
│
├── 3. 想验证「深弱磁 Id* 变负」
│ └── 本机当前到不了该区;用 sim/fw_gain_simulation.py 看概念曲线即可
│
└── 4. Zone/GS 切换异常
└── 确认增益改写未调用 pi_reset();本机 800 段多在 Zone 0/1
4.4 概念仿真(Python,对照用,非上板高速测试)
运行(勿据此去板子上冲高速):
powershell
cd "...\lesson25. 弱磁控制与全速域增益调度\sim"
pip install -r requirements.txt
python fw_gain_simulation.py
脚本用铭牌参数画电压圆 / 理想弱磁路径 / ACT≠sync,并标注本机 800 / 1100 可达区。看图理解「为什么软顶不是电压圆」即可;上板只跑 §4.1 的 t 800。
产出图:fw_voltage_circle.png、fw_closed_loop.png、fw_board_compare.png、fw_if_slip.png 等。
电压圆扫速 + 电流圆工作点

闭环 Id / Iq_max / GS(贴近 bsp_fw) *

理想弱磁路径 vs 本机 800/1100

sync 虚高 vs Hall ACT

3000 rpm 下 Id 建立过程 *

五、 总结与后续演进
5.1 本章核心收益回顾
本课工程上落地 了弱磁与增益调度模块(bsp_fw、fw/gs 串口),并与 L24 启动链兼容:
- 电压反馈弱磁框架 :监视 ∣ V s ∣ |V_s| ∣Vs∣,逼近电压圆时给出 I d ∗ ≤ 0 I_d^*\le 0 Id∗≤0,电流圆限制 I q , max I_{q,\max} Iq,max。
- 全速域增益调度框架:按转速 Zone 改写环路/SMO 相关增益。
- 本机板上验收 :稳定约 800--850 rpm;不把「跑到 3000+/深弱磁」作为本课通过标准。
理论拓宽到超基速弱磁区的能力在代码与仿真中具备;本机受角度路径限制,深度弱磁波形留待后续课程。
5.2 算法与板上局限性
- 非 MTPA/MTPV:单环电压反馈弱磁,工程实用型,非最优轨迹。
- 未做前馈解耦:高速交叉耦合留给 L26。
- 本机中高速瓶颈 :Hall HF ~900 墙;IF 巡航大滑差易失步;故串口限制
t\le1200,暂不测过高转速。