电机驱动开发学习24. 无感FOC与滑模_PLL观测器
电机驱动开发学习24. 无感FOC与滑模_PLL观测器

一、课程上下文与整体设计
1.1 课程演进与无感驱动的必要性
在前几课中,我们逐步建立了完整且可运行的 FOC 驱动框架:从基础的坐标变换、双闭环控制,到 SVPWM 生成、扇区双相采样,以及 Lesson 23 引入的保护状态机。在这些课程中,转子的电角度 θ \theta θ 均依赖硬件传感器(霍尔传感器或编码器)提供。
然而在工业与家电产品(如高速风筒、空调压缩机、无人机 ESC)中,硬件传感器带来了增加 BOM 成本、线束易损坏、高温高湿环境下可靠性差等致命缺点。
无感(Sensorless)FOC 的核心思想是:利用电机本身的定子电压与电流,根据电机物理模型反推转子内部的反电动势(BEMF),进而解析出转子电角度 θ \theta θ 与电角速度 ω \omega ω。
| 章节 | 角度/转速来源 | 低速/启动策略 | 本章关系 |
|---|---|---|---|
| L20~22 | 霍尔边沿 + ω ⋅ T s \omega \cdot T_s ω⋅Ts 动态补偿 | Offset → \rightarrow → Hall Run | 基座:提供已知正确的物理角度与电流环验证 |
| L23 | 霍尔边沿 + 状态机 | 硬件保护状态机 | 兜底:无感失锁/堵转时复用此保护状态机 |
| L24(本章) | SMO+PLL 后台估 E ^ / θ ^ \hat{E}/\hat{\theta} E^/θ^(对照);稳态控角暂用霍尔 | Align → I/F → IF-hold → Hall FOC | 核心:打通开环拖起与观测器;纯 SMO 控角仍为下一步 |
| L25(预告) | 观测器 + 弱磁控制器 | 弱磁升速 / 增益调度 | 扩展:拓展全速域控制能力 |
核心逻辑:
- 有感解决的是“电机怎么闭环控制”;
- 无感解决的是“没有传感器时, θ \theta θ 和 ω \omega ω 从哪里来”。
- SMO 从电流残差中“挤”出反电动势;PLL 将带噪声的 E ^ \hat{E} E^ 锁成平滑的 θ ^ \hat{\theta} θ^、 ω ^ \hat{\omega} ω^。
- 本课工程现状(现场已验证):零/低速用 I/F 强制角爬到可观测区;到速后先把控角交给 Hall FOC 稳住转速与电流;SMO+PLL 全程并行估计,便于
sl/pid对照,尚未作为唯一控角源(避免误锁失步)。
1.2 滑模_PLL观测器概念说明
本文标题中的滑模_PLL观测器是一套组合算法:
- SMO(滑模观测器):从定子电压、电流中提取估算反电动势 e ^ α β \hat e_{\alpha\beta} e^αβ;仅输出反电动势矢量,不能直接输出转子角度、转速。
- PLL软件锁相环:接收SMO输出的反电动势矢量,闭环求解平滑转子电角度 θ ^ \hat{\theta} θ^、电角速度 ω ^ \hat{\omega} ω^,规避直接atan2计算带来的角度噪声跳变。
两者必须配套使用,合称为滑模‑PLL观测器;SMO负责提取反电动势,PLL负责解析位置转速。
1.3 数据流与启动切换图解
下图说明无感 FOC 的目标数据流(SMO 控角)。当前固件在到速后走「IF-hold → Hall FOC」,SMO 仍在后台估速/估角:

本课实际启动链路(串口可复现):
w 1
→ CHARGE(自举)→ OFFSET(零偏)→ ALIGN(霍尔扇区定位)
→ I/F(Iq 固定 + θ_if 斜坡,贴霍尔边沿爬)
→ RUN + IF-hold(控角仍跟 θ_if,速度环补 Iq,SMO 跟踪/估速)
→ Hall FOC(hall≈目标后 θ 连续交接;降 Iq,霍尔 HF θ 闭环)
→ (规划)SMO 锁相吻合后再切纯无感控角
上电提示里仍可能打印
I/F->SMO/-> SL,属于历史措辞;以本图与下方日志字段为准:切 RUN 后先 IF-hold,到速再 Hall FOC,SMO 只后台估。
1.4 现场日志对照(与 1.3 一一映射)
下面是一组空载 t 400 + w 1 的完整串口片段。读日志时按 1.3 链路阶段拆,注意不要被 -> SL 误导成「已经纯无感闭环」。
指令序(准备)
| 日志 | 含义 |
|---|---|
r → PI/fault reset, Iq=0 | 清故障锁存,Iq 置零 |
s 0 → recalibrating current (wait ~2s) | 电流零偏;约 2s 后再启动 |
t 400 → RPM target: 400 ... use w 1 | 只改目标,不会转,须 w 1 |
w 1 之后:按 1.3 阶段读
| 1.3 阶段 | 典型日志 | 字段怎么读 |
|---|---|---|
| CHARGE | charge boot cap → charge done -> offset cal | 下桥自举,约数十 ms |
| OFFSET | ADC off U/V/W=1550/... cal=1 | 三相零偏采样完成 |
| ALIGN | align hall=4 theta=210 deg duty=1200 | 按当前霍尔扇区定位;相移 240° 时扇区中心角约 210° |
| I/F | align done -> I/F Iq (Iq*=1600 ...) | 固定 Iq*≈1600 mA,开始斜坡 |
FOC I/F: t=.. if=.. E=.. hall=.. sync=.. Iq*=.. slip=0 | if:开环电角速度 (rad/s);hall/sync:边沿估速 / 开环同步机械 rpm;E:SMO 估 |Ê|;slip=0:未超前霍尔太多 | |
| → IF-hold | I/F ok ... -> SL + handover: ... (IF-hold keep theta) | 「ok」= 可进 RUN;keep theta= 控角仍跟 θ_if,不是掰到霍尔扇区中心,也不是 SMO 控角 |
FOC IF-hold: sync=134 hall=109 Iq=1600 tgt=400 | 速度环补速;sync/hall 爬向 tgt | |
IF-hold: sync=401 hall=365 Iq=1400 tgt=400 | 已贴近目标;Iq 开始从强拖电流往下收 | |
| → Hall FOC | IF-hold -> Hall FOC rpm=377 th=207 | θ 连续交给霍尔 HF 角;稳态有感闭环 |
| 检查 | fc → state=OK ... boot=5 | boot=5 = BOOT_RUN;无故障 |
| 停机 | s 0 → FOC boot abort: was=5 | 停环并重新标定;也可用 w 0 |
本例时间线(约)
15:37:41.19 w 1 / CHARGE
15:37:41.23 OFFSET
15:37:42.08 ALIGN (hall=4)
15:37:42.88 I/F 开始(Iq*=1600,if 从 0 爬)
15:37:46.46 I/F ok → IF-hold(sync≈134,仍 keep theta)
15:37:48.48 IF-hold 已近目标(sync≈401,hall≈365)
15:37:48.64 IF-hold → Hall FOC(rpm≈377)
15:38:00.73 fc OK boot=5
分辨结果
- 好:I/F 段
slip=0且hall随sync上升;出现IF-hold keep theta;随后有IF-hold -> Hall FOC;fc为 OK。 - 差:I/F 中途
slip累加 / 掉速;进 RUN 后无keep theta却转速塌陷;卡在 IF-hold 大 Iq 抖振且迟迟没有Hall FOC;fc非 OK 或串口假死(先r再查)。
串口操作口令见 ##4.2;异常对照见 ##4.3。
二、数学建模与算法原理
2.1 预备概念
-
反电动势(Back-EMF, e α β \boldsymbol{e}_{\alpha\beta} eαβ)
转子永磁磁场相对定子绕组切割产生的感应电压。幅值 ∥ e ∥ = ψ f ω e \Vert{}\boldsymbol{e}\Vert{}=\psi_f\omega_e ∥e∥=ψfωe,与电角速度成正比;零/极低速时几乎为 0,所以 SMO 在静止时不可观。无感 FOC 的目标,就是从可测的 v v v、 i i i 里把 e \boldsymbol{e} e 估计出来,再解析 θ e \theta_e θe、 ω e \omega_e ωe。 -
转子磁链( ψ f \psi_f ψf)
永磁体在定子侧等效的磁链幅值(Wb)。它把机械旋转“翻译”成电压: ∥ e ∥ = ψ f ω e \Vert e\Vert=\psi_f\omega_e ∥e∥=ψfωe。 ψ f \psi_f ψf 越大,同一转速下反电动势越强,越容易被观测。 -
反电动势与电角度的映射
在 α \alpha α- β \beta β 下,隐极机反电动势可写成
e α = − ψ f ω e sin θ e e_\alpha=-\psi_f\omega_e\sin\theta_e eα=−ψfωesinθe, e β = ψ f ω e cos θ e e_\beta=\psi_f\omega_e\cos\theta_e eβ=ψfωecosθe。
因此 e \boldsymbol{e} e 的幅值携带转速信息,相位携带转子电角度;SMO 估出 e ^ \hat{\boldsymbol{e}} e^ 后,PLL 才能从相位锁出 θ ^ e \hat{\theta}_e θ^e、 ω ^ e \hat{\omega}_e ω^e。 -
电角度 / 电角速度与极对数
θ e \theta_e θe、 ω e \omega_e ωe 是按电气周期计的角度与角速度。若机械角速度为 ω m \omega_m ωm(rad/s)、极对数为 p p p,则 ω e = p ω m \omega_e=p\,\omega_m ωe=pωm。用 rpm 时: ω e = n r p m ⋅ 2 π 60 ⋅ p \omega_e=n_{\mathrm{rpm}}\cdot\frac{2\pi}{60}\cdot p ωe=nrpm⋅602π⋅p。本系列电机 p = 4 p=4 p=4。 -
滑模面(Sliding Surface, S S S)
人为规定的“目标误差集合”。本课取 S = i ~ α β = 0 S=\tilde{\boldsymbol{i}}_{\alpha\beta}=\mathbf{0} S=i~αβ=0,即希望估计电流等于实测电流。滑模控制要做两件事:先把状态推到该面上(到达),再让它贴在面上滑动(保持)。 -
滑模增益(Sliding Gain, K K K)
开关/饱和律前面的幅度系数(单位 V)。 K K K 越大,把误差“拉回滑模面”越猛,但也更容易抖振。到达条件要求 K K K 大于反电动势分量的上界,否则误差到不了面。 -
滑模注入项(Injection Term, z α β \boldsymbol{z}_{\alpha\beta} zαβ)
观测器方程里人为加进去的一项,形式常为 K ⋅ s g n ( i ~ ) K\cdot\mathrm{sgn}(\tilde{\boldsymbol{i}}) K⋅sgn(i~) 或 K ⋅ s a t ( i ~ / ε ) K\cdot\mathrm{sat}(\tilde{\boldsymbol{i}}/\varepsilon) K⋅sat(i~/ε)。它不对应真实电路元件,而是算法里用来强迫电流误差收敛的虚拟电压;到达滑模面后,它会“顶住”真实反电动势。 -
等效控制量(Equivalent Control)
理想情况下,状态已贴在滑模面上、且沿面滑动时,为维持 S = 0 S=0 S=0、 S ˙ = 0 \dot{S}=0 S˙=0 所需的平均控制。对 SMO 而言,此时 z e q ≈ e α β \boldsymbol{z}_{\mathrm{eq}}\approx\boldsymbol{e}_{\alpha\beta} zeq≈eαβ,因此可把 z \boldsymbol{z} z 的低频成分当作反电动势估计。工程上常用低通滤波从抖振的 z \boldsymbol{z} z 里取出这个“等效”部分。 -
饱和边界层厚度(Boundary Layer, ε \varepsilon ε)
用 s a t \mathrm{sat} sat 代替 s g n \mathrm{sgn} sgn 时,在 ∣ i ~ ∣ < ε | \tilde{i} | < \varepsilon ∣i~∣<ε 的薄层内控制量从开关变成线性。 ε \varepsilon ε 越大,抖振越弱、相位滞后越大;越小则越接近理想滑模、抖振越重。本工程对应FOC_SMO_SAT_EPS(单位 A)。 -
LPF 截止角频率( ω c = 2 π f c \omega_c=2\pi f_c ωc=2πfc)
对 z \boldsymbol{z} z 做一阶低通得到平滑 e ^ \hat{\boldsymbol{e}} e^ 时的截止角频率。 f c f_c fc 过低 → e ^ \hat{e} e^ 滞后、估角偏慢;过高 → 抖振/谐波渗进 PLL。本工程 f c f_c fc 对应FOC_SMO_E_LPF_HZ。 -
I/F Current-Frequency Control(电流-频率控制) ,在零速和极低速下的开环/半闭环启动策略。
2.2 符号约定
矢量均在 α \alpha α- β \beta β 静止坐标系。下文 θ \theta θ、 ω \omega ω 若未特别说明,均指电角度 θ e \theta_e θe、电角速度 ω e \omega_e ωe。
| 符号 | 含义 |
|---|---|
| R s R_s Rs、 L s L_s Ls | 定子电阻、电感(隐极机 L d = L q = L s L_d=L_q=L_s Ld=Lq=Ls) |
| ψ f \psi_f ψf | 永磁体转子磁链(Wb) |
| p p p | 极对数;本系列电机 p = 4 p=4 p=4 |
| θ e \theta_e θe、 ω e \omega_e ωe | 转子电角度(rad)、电角速度(rad/s) |
| ω m \omega_m ωm、 n r p m n_{\mathrm{rpm}} nrpm | 机械角速度(rad/s)、机械转速(rpm); ω e = p ω m = n r p m ⋅ 2 π 60 ⋅ p \omega_e=p\,\omega_m=n_{\mathrm{rpm}}\cdot\frac{2\pi}{60}\cdot p ωe=pωm=nrpm⋅602π⋅p |
| v α β \boldsymbol{v}_{\alpha\beta} vαβ、 i α β \boldsymbol{i}_{\alpha\beta} iαβ | 实际相电压、相电流(已知/可测) |
| e α β \boldsymbol{e}_{\alpha\beta} eαβ | 真实反电动势(未知,待估计); e α = − ψ f ω e sin θ e e_\alpha=-\psi_f\omega_e\sin\theta_e eα=−ψfωesinθe, e β = ψ f ω e cos θ e e_\beta=\psi_f\omega_e\cos\theta_e eβ=ψfωecosθe |
| i ^ α β \hat{\boldsymbol{i}}_{\alpha\beta} i^αβ | 估计电流(观测器内部状态;帽子 ⋅ ^ \hat{\cdot} ⋅^ 表示估计量) |
| i ~ α β = i ^ α β − i α β \tilde{\boldsymbol{i}}_{\alpha\beta}=\hat{\boldsymbol{i}}_{\alpha\beta}-\boldsymbol{i}_{\alpha\beta} i~αβ=i^αβ−iαβ | 电流观测误差(波浪号 ⋅ ~ \tilde{\cdot} ⋅~ 表示误差) |
| z α β \boldsymbol{z}_{\alpha\beta} zαβ | 滑模注入项;到达滑模面后其等效成分 ≈ e \approx\boldsymbol{e} ≈e |
| K K K | 滑模增益(V) |
| S ( x ) = i ~ α β S(\boldsymbol{x})=\tilde{\boldsymbol{i}}_{\alpha\beta} S(x)=i~αβ | 滑模面 |
| s g n ( ⋅ ) \mathrm{sgn}(\cdot) sgn(⋅) / s a t ( ⋅ ) \mathrm{sat}(\cdot) sat(⋅) | 符号函数 / 饱和函数 |
| ε \varepsilon ε | 饱和边界层厚度(A),FOC_SMO_SAT_EPS |
| e ^ α β \hat{\boldsymbol{e}}_{\alpha\beta} e^αβ | 对 z \boldsymbol{z} z 低通后的反电动势估计 |
| ω c = 2 π f c \omega_c=2\pi f_c ωc=2πfc | LPF 截止角频率,FOC_SMO_E_LPF_HZ |
2.3 PMSM 坐标系方程与反电动势
忽略定子铁芯饱和与凸极效应(假设为隐极永磁同步电机 L d = L q = L s L_d = L_q = L_s Ld=Lq=Ls),PMSM 在两相静止坐标系( α − β \alpha-\beta α−β)下的电压方程可表示为:
v α = R s i α + L s d i α d t + e α v_\alpha = R_s i_\alpha + L_s \frac{d i_\alpha}{d t} + e_\alpha vα=Rsiα+Lsdtdiα+eα
v β = R s i β + L s d i β d t + e β v_\beta = R_s i_\beta + L_s \frac{d i_\beta}{d t} + e_\beta vβ=Rsiβ+Lsdtdiβ+eβ
用矢量形式写成一阶状态空间方程:
d i α β d t = − R s L s i α β + 1 L s v α β − 1 L s e α β \frac{d \boldsymbol{i}_{\alpha\beta}}{d t} = -\frac{R_s}{L_s}\boldsymbol{i}_{\alpha\beta} + \frac{1}{L_s}\boldsymbol{v}_{\alpha\beta} - \frac{1}{L_s}\boldsymbol{e}_{\alpha\beta} dtdiαβ=−LsRsiαβ+Ls1vαβ−Ls1eαβ
其中, e α β = [ e α , e β ] T \boldsymbol{e}_{\alpha\beta} = [e_\alpha, e_\beta]^T eαβ=[eα,eβ]T 为转子旋转产生的反电动势(符号与映射见 §2.1 / §2.2):
e α = − ψ f ω e sin θ e e_\alpha = -\psi_f \omega_e \sin\theta_e eα=−ψfωesinθe
e β = ψ f ω e cos θ e e_\beta = \psi_f \omega_e \cos\theta_e eβ=ψfωecosθe
物理本质(与 §2.1 呼应):
∥ e ∥ = ψ f ω e \Vert{}\boldsymbol{e}\Vert{} = \psi_f \omega_e ∥e∥=ψfωe 与电角速度成正比。
- 转速为 0 或极低时, e α β ≈ 0 \boldsymbol{e}_{\alpha\beta} \approx \mathbf{0} eαβ≈0,信号被噪声淹没,无法观测。
- 因此 SMO 在零速/极低速必然失效,启动须依赖开环拖动(Align + I/F 强拖)。
对本系列电机: R s = 0.89 Ω R_s = 0.89\,\Omega Rs=0.89Ω, L s = 0.62 m H L_s = 0.62\,\mathrm{mH} Ls=0.62mH, p = 4 p = 4 p=4。机械转速 200 r p m 200\,\mathrm{rpm} 200rpm 时, ω e = 200 × 2 π 60 × 4 ≈ 83.77 r a d / s \omega_e = 200 \times \frac{2\pi}{60} \times 4 \approx 83.77\,\mathrm{rad/s} ωe=200×602π×4≈83.77rad/s,反电动势幅值已进入可被电流采样可靠提取的量级。
2.4 滑模观测器(SMO)原理与连续化改造
本节在 §2.3 电机方程之上构造电流观测器(预备概念与符号见 §2.1 / §2.2)。
观测器方程从哪来?有没有物理含义?
回顾 §2.3 真实电机在 α \alpha α- β \beta β 下的电流动态(把电压方程整理成对 i i i 求导):
d i α β d t = − R s L s i α β + 1 L s v α β − 1 L s e α β \frac{d \boldsymbol{i}_{\alpha\beta}}{d t} = -\frac{R_s}{L_s}\boldsymbol{i}_{\alpha\beta} + \frac{1}{L_s}\boldsymbol{v}_{\alpha\beta} - \frac{1}{L_s}\boldsymbol{e}_{\alpha\beta} dtdiαβ=−LsRsiαβ+Ls1vαβ−Ls1eαβ
各项在电路上的含义很直观:定子是 R s R_s Rs- L s L_s Ls 串联支路,端电压 v \boldsymbol{v} v 一部分落在电阻上、一部分驱动电感电流变化,剩下要去“顶住”转子切割产生的反电动势 e \boldsymbol{e} e。其中 v \boldsymbol{v} v、 i \boldsymbol{i} i 可知可测, e \boldsymbol{e} e 不可直接测。
滑模观测器做的事是:在软件里按同一套物理结构再造一条“虚拟定子支路”,用估计电流 i ^ \hat{\boldsymbol{i}} i^ 代替真实 i i i,并把未知的 e \boldsymbol{e} e 换成可设计的滑模注入项 z \boldsymbol{z} z:
d i ^ α β d t = − R s L s i ^ α β + 1 L s v α β − 1 L s z α β \frac{d \hat{\boldsymbol{i}}_{\alpha\beta}}{d t} = -\frac{R_s}{L_s}\hat{\boldsymbol{i}}_{\alpha\beta} + \frac{1}{L_s}\boldsymbol{v}_{\alpha\beta} - \frac{1}{L_s}\boldsymbol{z}_{\alpha\beta} dtdi^αβ=−LsRsi^αβ+Ls1vαβ−Ls1zαβ
对照关系:
| 真实电机 | 观测器(软件副本) |
|---|---|
| i \boldsymbol{i} i(实测) | i ^ \hat{\boldsymbol{i}} i^(积分状态) |
| v \boldsymbol{v} v(同一路给定/重构电压) | 同左 |
| e \boldsymbol{e} e(未知 BEMF) | z \boldsymbol{z} z(算法注入,逼近 e \boldsymbol{e} e) |
| R s , L s R_s,L_s Rs,Ls(电机参数) | 同左(参数错了,估 e \boldsymbol{e} e 会偏) |
物理含义:方程骨架是有物理的——就是定子 RL + 反电动势的电路模型副本; z \boldsymbol{z} z 本身不是板上多出来的电压源,而是观测器为了让 i ^ \hat{i} i^ 追上 i i i 而“假想”加在虚拟支路上的电压。当 i ^ → i \hat{i}\to i i^→i 且贴在滑模面上时,副本与真机一致,只能推出 z ≈ e \boldsymbol{z}\approx\boldsymbol{e} z≈e,于是从 z \boldsymbol{z} z(再经 LPF)读出反电动势。
将观测器方程与物理电机方程相减,定义电流观测误差为 i ~ α β = i ^ α β − i α β \tilde{\boldsymbol{i}}_{\alpha\beta} = \hat{\boldsymbol{i}}_{\alpha\beta} - \boldsymbol{i}_{\alpha\beta} i~αβ=i^αβ−iαβ,得到误差动态方程:
d i ~ α β d t = − R s L s i ~ α β + 1 L s ( e α β − z α β ) \frac{d \tilde{\boldsymbol{i}}_{\alpha\beta}}{d t} = -\frac{R_s}{L_s}\tilde{\boldsymbol{i}}_{\alpha\beta} + \frac{1}{L_s}\left(\boldsymbol{e}_{\alpha\beta} - \boldsymbol{z}_{\alpha\beta}\right) dtdi~αβ=−LsRsi~αβ+Ls1(eαβ−zαβ)
1. 滑模控制律设计
为了使观测误差 i ~ α β \tilde{\boldsymbol{i}}_{\alpha\beta} i~αβ 在有限时间内收敛到 0,设计滑模面 S ( x ) = i ~ α β = 0 S(\boldsymbol{x}) = \tilde{\boldsymbol{i}}_{\alpha\beta} = \mathbf{0} S(x)=i~αβ=0。传统滑模控制采用符号函数(Sign Function):
z α β = K ⋅ s g n ( i ~ α β ) \boldsymbol{z}_{\alpha\beta} = K \cdot \mathrm{sgn}(\tilde{\boldsymbol{i}}_{\alpha\beta}) zαβ=K⋅sgn(i~αβ)
其中 K K K 为滑模增益,必须满足滑模到达条件 K > max ( ∥ e α ∥ , ∥ e β ∥ ) K > \max(\Vert{}e_\alpha\Vert{}, \Vert{}e_\beta\Vert{}) K>max(∥eα∥,∥eβ∥)。
2. 抖振抑制与饱和函数替代
由于开关逻辑的理想化,符号函数
s
g
n
(
x
)
\mathrm{sgn}(x)
sgn(x) 在滑模面
S
=
0
S=0
S=0 附近会发生高频开关切换,从而产生严重的高频高幅值抖振(Chattering)。工程上通常采用连续的**饱和函数(Saturation Function)sat(x)** 替代 sgn(x) 来构造边界层:
s a t ( y ) = { 1 , y > 1 y , − 1 ≤ y ≤ 1 − 1 , y < − 1 其中 y = i ~ ε \mathrm{sat}(y) = \begin{cases} 1, & y > 1 \\ y, & -1 \le y \le 1 \\ -1, & y < -1 \end{cases} \quad \text{其中 } y = \frac{\tilde{i}}{\varepsilon} sat(y)=⎩ ⎨ ⎧1,y,−1,y>1−1≤y≤1y<−1其中 y=εi~
式中
ε
\varepsilon
ε 代表饱和边界层厚度(FOC_SMO_SAT_EPS)。
sgn(x) 符号函数 sat(x) 饱和函数
│ │
│ 1 │ 1
────────┼───────► ───/───►
│ / │
-1 │ -1/ │
│ │
高频抖振,谐波极其严重 边界层内线性化,滤除高频开关量
当系统状态进入滑模面后, d i ~ d t → 0 \frac{d \tilde{\boldsymbol{i}}}{d t} \to 0 dtdi~→0 且 i ~ → 0 \tilde{\boldsymbol{i}} \to 0 i~→0,代入误差方程可得:
z α β ≈ e α β \boldsymbol{z}_{\alpha\beta} \approx \boldsymbol{e}_{\alpha\beta} zαβ≈eαβ
为了进一步滤除开关信号中的高频分量,将滑模输出 z α β \boldsymbol{z}_{\alpha\beta} zαβ 送入一阶低通滤波器(LPF),即可得到平滑的反电动势估计值 e ^ α β \hat{\boldsymbol{e}}_{\alpha\beta} e^αβ:
d e ^ α β d t = − ω c e ^ α β + ω c z α β \frac{d \hat{\boldsymbol{e}}_{\alpha\beta}}{d t} = -\omega_c \hat{\boldsymbol{e}}_{\alpha\beta} + \omega_c \boldsymbol{z}_{\alpha\beta} dtde^αβ=−ωce^αβ+ωczαβ
其中
ω
c
=
2
π
f
c
\omega_c = 2\pi f_c
ωc=2πfc 为 LPF 的截止频率(FOC_SMO_E_LPF_HZ)。
2.5 软件锁相环(PLL)估算角度与转速
直接通过反电动势求角度,通常采用三角函数计算:
θ ^ e = a t a n 2 ( − e ^ α , e ^ β ) \hat{\theta}_e = \mathrm{atan2}\left(-\hat{e}_\alpha, \hat{e}_\beta\right) θ^e=atan2(−e^α,e^β)
然而, a t a n 2 \mathrm{atan2} atan2 对高频噪声极度敏感,微小的反电动势波动都会导致角度剧烈跳变;如果通过微分进一步求解转速 ω ^ = d θ ^ d t \hat{\omega} = \frac{d\hat{\theta}}{dt} ω^=dtdθ^,高频噪声会被再次放大,导致系统无法稳定闭环。
为此,工业界普遍采用 基于坐标旋转的软件锁相环(PLL):
Phase Error
E_hat_αβ ───────►( ⊗ )────────► PI 调解器 ───────► 积分器 ──┬────► θ̂_pll
▲ (1/s) │
│ │
└─────────────── [ sin/cos ] ◄──────────┘
1. 相位误差提取推导
假设当前 PLL 输出的角度估计值为 θ ^ \hat{\theta} θ^,真实反电动势为:
e ^ α = − E m sin θ e , e ^ β = E m cos θ e ( E m = ψ f ω e ) \hat{e}_\alpha = -E_m \sin\theta_e, \quad \hat{e}_\beta = E_m \cos\theta_e \quad (E_m = \psi_f \omega_e) e^α=−Emsinθe,e^β=Emcosθe(Em=ψfωe)
构造矢量相位差信号 ε \varepsilon ε:
ε = − e ^ α cos θ ^ − e ^ β sin θ ^ \varepsilon = -\hat{e}_\alpha \cos\hat{\theta} - \hat{e}_\beta \sin\hat{\theta} ε=−e^αcosθ^−e^βsinθ^
将 e ^ α , e ^ β \hat{e}_\alpha, \hat{e}_\beta e^α,e^β 代入上式:
ε = − ( − E m sin θ e ) cos θ ^ − ( E m cos θ e ) sin θ ^ = E m ( sin θ e cos θ ^ − cos θ e sin θ ^ ) \varepsilon = -(-E_m \sin\theta_e)\cos\hat{\theta} - (E_m \cos\theta_e)\sin\hat{\theta} = E_m \left(\sin\theta_e \cos\hat{\theta} - \cos\theta_e \sin\hat{\theta}\right) ε=−(−Emsinθe)cosθ^−(Emcosθe)sinθ^=Em(sinθecosθ^−cosθesinθ^)
利用正弦差角公式展开:
ε = E m sin ( θ e − θ ^ ) \varepsilon = E_m \sin(\theta_e - \hat{\theta}) ε=Emsin(θe−θ^)
当估计角度 θ ^ \hat{\theta} θ^ 接近真实角度 θ e \theta_e θe 时,相位差较小,利用小角度近似 sin ( Δ θ ) ≈ Δ θ \sin(\Delta\theta) \approx \Delta\theta sin(Δθ)≈Δθ:
ε ≈ E m ⋅ ( θ e − θ ^ ) \varepsilon \approx E_m \cdot (\theta_e - \hat{\theta}) ε≈Em⋅(θe−θ^)
也就是说,相位差信号 ε \varepsilon ε 与角度估计误差 ( θ e − θ ^ ) (\theta_e - \hat{\theta}) (θe−θ^) 成严格的正比例关系。
2. 闭环收敛与角速度恢复
将误差信号 ε \varepsilon ε 输入 PI 控制器,控制器的输出即为估算的电角速度 ω ^ e \hat{\omega}_e ω^e;对 ω ^ e \hat{\omega}_e ω^e 再次积分,即可得到平滑连续的电角度 θ ^ \hat{\theta} θ^:
ω ^ e = K p ⋅ ε + K i ∫ ε d t \hat{\omega}_e = K_p \cdot \varepsilon + K_i \int \varepsilon \, dt ω^e=Kp⋅ε+Ki∫εdt
θ ^ ( t ) = ∫ ω ^ e ( t ) d t \hat{\theta}(t) = \int \hat{\omega}_e(t) \, dt θ^(t)=∫ω^e(t)dt
PLL 闭环控制将强制驱动 ε → 0 \varepsilon \to 0 ε→0,即达成 θ ^ → θ e \hat{\theta} \to \theta_e θ^→θe 的精确锁相。
2.6 I/F 强拖、IF-hold 与切相(本课工程路径)
零速下 SMO 不可观,启动仍分三段开环/半开环,再进入有感稳态(SMO 继续对照):
Align I/F 强拖 IF-hold(RUN) Hall FOC
│◄──────►│◄──────────────────────►│◄─────────────────────►│◄──────────────
│ 扇区定位 │ Iq* 固定 + ω_if 斜坡 │ 控角仍 θ_if │ 霍尔 HF θ
│ │ ω 贴霍尔边沿,防滑差 │ 速度环补 Iq 爬到目标 │ 降 Iq 稳速
│ │ SMO 后台估 Ê │ SMO track/seed 防跑飞 │ SMO 自由估速
└─────────┴────────────────────────┴───────────────────────┴──────────────► t
- Align:按当前霍尔扇区注入定位占空比,建立已知初始 θ \theta θ(本板相移默认 240°)。
- I/F:
Iq ≈ FOC_IF_IQ_MA,电角速度 ω i f \omega_{\mathrm{if}} ωif 斜坡上升;硬限相对霍尔边沿估速的超前,滑差过大降流/失败,避免绕组空烧。 - IF-hold(进入
BOOT_RUN后):交接时禁止把 θ \theta θ 掰到霍尔扇区中心(会失步掉速);控角继续积分 θ i f \theta_{\mathrm{if}} θif,速度环把机械转速拉向目标。 - Hall FOC:当边沿估速与开环同步速都贴近目标后,θ 连续交给霍尔高频角度环,并降低 Iq 下限,避免空载 2A 抖振。
- 纯 SMO 控角:算法与
smo_pll_*已就绪;须等 ω ^ \hat{\omega} ω^ 与霍尔估速长期吻合后再切,本课暂未默认开启(误锁曾导致 Stall/串口假死)。
理论教材中的「I/F→SMO 加权融合」仍可作为下一步;本仓库以 可重复启动、可稳速 为先。
三、软件架构与核心代码落地
3.1 状态机演进(Boot State Machine)
关键代码入口:
| 模块 | 文件 | 作用 |
|---|---|---|
| 启动状态机 | User/foc/bsp_foc_boot.c | Charge/Offset/Align/I/F/IF-hold/Hall 交接 |
| SMO+PLL | User/foc/bsp_smo.c | 估
E
^
\hat{E}
E^、
θ
^
\hat{\theta}
θ^、
ω
^
\hat{\omega}
ω^;track/seed |
| 控角选择 | User/foc/bsp_foc.c → foc_get_electrical_theta() | boot 活跃 / IF-hold / 融合 / 霍尔 /(条件)SMO |
| 参数 | User/foc/bsp_motor_params.h | FOC_SENSORLESS_ENABLE、FOC_IF_*、FOC_SMO_* |
| 串口 | deal_dq_curr_serial_data() | t/w/s/r/pid/sl/fc/... |
FOC_SENSORLESS_ENABLE=0 时可退回 L23 风格 Hall 启动路径做回归。
3.2 关键 API 实现与离散化推导
1. SMO + PLL 离散化核心算法(bsp_smo.c)
连续域状态方程采用前向欧拉法(Forward Euler)进行高频离散化:
i ^ α ( k + 1 ) = i ^ α ( k ) + T s L s [ v α ( k ) − R s i ^ α ( k ) − z α ( k ) ] \hat{i}_\alpha(k+1) = \hat{i}_\alpha(k) + \frac{T_s}{L_s} \left[ v_\alpha(k) - R_s \hat{i}_\alpha(k) - z_\alpha(k) \right] i^α(k+1)=i^α(k)+LsTs[vα(k)−Rsi^α(k)−zα(k)]
一阶 LPF 离散化形式(设 α l p f = 2 π f c T s \alpha_{\mathrm{lpf}} = 2\pi f_c T_s αlpf=2πfcTs):
e ^ α ( k + 1 ) = e ^ α ( k ) + α l p f ⋅ [ z α ( k ) − e ^ α ( k ) ] \hat{e}_\alpha(k+1) = \hat{e}_\alpha(k) + \alpha_{\mathrm{lpf}} \cdot \left[ z_\alpha(k) - \hat{e}_\alpha(k) \right] e^α(k+1)=e^α(k)+αlpf⋅[zα(k)−e^α(k)]
完整算法 C 代码落盘:
#include "bsp_smo.h"
#include "bsp_motor_params.h"
#include <math.h>
typedef struct {
float i_hat_alpha; /* α轴估计电流 (A) */
float i_hat_beta; /* β轴估计电流 (A) */
float e_hat_alpha; /* α轴估算反电动势 (V) */
float e_hat_beta; /* β轴估算反电动势 (V) */
float theta_pll; /* PLL 输出估算电角度 (rad) */
float omega_pll; /* PLL 输出估算电角速度 (rad/s) */
float e_mag; /* 反电动势幅值 (V) */
uint16_t lock_counter;/* 锁相确认计数器 */
uint8_t is_locked; /* 锁相完成标志 */
} SmoPll_t;
static SmoPll_t g_smo;
void smo_pll_step(float i_alpha, float i_beta, float v_alpha, float v_beta, float ts)
{
/* 1. 计算电流观测残差 i_err = i_hat - i */
float i_err_alpha = g_smo.i_hat_alpha - i_alpha;
float i_err_beta = g_smo.i_hat_beta - i_beta;
/* 2. 构建饱和函数 sat(i_err / eps) 替代 sign() */
float z_alpha = FOC_SMO_K * sat_limit(i_err_alpha / FOC_SMO_SAT_EPS);
float z_beta = FOC_SMO_K * sat_limit(i_err_beta / FOC_SMO_SAT_EPS);
/* 3. 更新电流估算器 (前向欧拉离散化) */
float di_hat_alpha = (v_alpha - MOTOR_RS_OHM * g_smo.i_hat_alpha - z_alpha) / MOTOR_LS_H;
float di_hat_beta = (v_beta - MOTOR_RS_OHM * g_smo.i_hat_beta - z_beta) / MOTOR_LS_H;
g_smo.i_hat_alpha += di_hat_alpha * ts;
g_smo.i_hat_beta += di_hat_beta * ts;
/* 4. 反电动势低通滤波 (提取 E_hat) */
float lpf_alpha = 2.0f * 3.1415926f * FOC_SMO_E_LPF_HZ * ts;
g_smo.e_hat_alpha += lpf_alpha * (z_alpha - g_smo.e_hat_alpha);
g_smo.e_hat_beta += lpf_alpha * (z_beta - g_smo.e_hat_beta);
/* 5. 软件锁相环 (PLL) 计算 */
float sin_th = sinf(g_smo.theta_pll);
float cos_th = cosf(g_smo.theta_pll);
/* 相位误差信号 phase_err = -E_alpha*cos(θ) - E_beta*sin(θ) */
float phase_err = -g_smo.e_hat_alpha * cos_th - g_smo.e_hat_beta * sin_th;
/* PI 调节器求解转速 omega_pll */
static float pll_i_term = 0.0f;
pll_i_term += FOC_PLL_KI * phase_err * ts;
g_smo.omega_pll = FOC_PLL_KP * phase_err + pll_i_term;
/* 角速度积分更新估计角度 theta_pll */
g_smo.theta_pll += g_smo.omega_pll * ts;
g_smo.theta_pll = wrap_angle_0_2pi(g_smo.theta_pll);
/* 6. 反电动势幅值计算与锁相判定 */
g_smo.e_mag = sqrtf(g_smo.e_hat_alpha * g_smo.e_hat_alpha +
g_smo.e_hat_beta * g_smo.e_hat_beta);
if (g_smo.e_mag >= FOC_SMO_LOCK_E_MIN &&
fabsf(g_smo.omega_pll) >= FOC_SMO_LOCK_OMEGA_MIN)
{
if (g_smo.lock_counter < (uint16_t)(FOC_SMO_LOCK_HOLD_MS / (ts * 1000.0f))) {
g_smo.lock_counter++;
} else {
g_smo.is_locked = 1; /* 锁定成功 */
}
} else {
g_smo.lock_counter = 0;
g_smo.is_locked = 0; /* 失锁 */
}
}
3.3 角度选择逻辑(与代码一致的优先级)
foc_get_electrical_theta() 大致优先级(详见 bsp_foc.c):
- Boot 活跃(Charge/Offset/Align/Drag):用
foc_boot_get_theta()(含 I/F 强制角)。 - IF-hold:仍用 boot 开环 θ \theta θ,SMO 只估速/对照。
- Sensorless blend(若使能): θ i f \theta_{\mathrm{if}} θif 与 θ s m o \theta_{\mathrm{smo}} θsmo 插值。
- SMO locked 且与霍尔估速接近:才允许 SMO 控角(防误锁)。
- 否则:霍尔高频角度(Hall FOC)。
上文 3.2 节给出的 SMO 代码块为原理示意;仓库实现以
bsp_smo.c/smo_pll_t为准(含track_en、seed、锁相保持等现场保护)。
四、调试 Cookbook 与现场抓波分析
4.1 核心参数调参矩阵
SMO/PLL 宏以 bsp_motor_params.h / bsp_smo.h 为准;下表为调参方向参考(数值随现场可能已改):
| 参数名称 | 调参方向 | 现象与影响 |
|---|---|---|
FOC_SMO_K | 过小难进滑模面;过大抖振 | 幅值须大于当前转速下最大 ∣ E ^ ∣ |\hat{E}| ∣E^∣ |
FOC_SMO_SAT_EPS | 过小≈sign 抖振大;过大相位滞后 | 边界层,常取额定电流 5%~10% |
FOC_SMO_E_LPF_HZ | 过低估角滞后;过高谐波进 PLL | 常取最大基频 2~5 倍 |
FOC_PLL_KP / FOC_PLL_KI | KP 管带宽;KI 消稳态角差 | 过大易抖、震荡 |
FOC_IF_IQ_MA / FOC_IF_OMEGA_RAMP | Iq 不足失步;斜坡过快跟不上 | 本板默认约 1600 mA |
FOC_IF_HOLD_* | 上限/步进影响到速与 t 变目标 | IF-hold 爬目标段 |
4.2 串口复现(COM47 @ 115200,本板现场)
推荐上电后顺序(空载约 400 rpm):
r # 清故障/锁存(Stall 后必做)
s 0 # 等待约 2s 完成电流零偏(看 OK)
t 400 # 目标转速
w 1 # 启动:Align → I/F → IF-hold → Hall FOC
pid # 看 SP/ACT/Iq、boot_stage
sl # 看 SMO lock / Ê / θ / 估速 vs 霍尔
fc # 故障与 boot 摘要
w 0 # 停机:清 Iq、关 PWM(勿指望「松油门仍转」)
期望日志关键词:IF-hold keep theta → IF-hold -> Hall FOC → fc 里 boot=5;无故障。sl 中 SMO 估速可与霍尔对照,不等于已用 SMO 控角。字段含义与阶段映射见 §1.4。
| 指令 | 作用 |
|---|---|
t <rpm> | 速度目标;IF-hold 内软跟新目标,避免瞬间改 SP 抖停 |
w 1 / w 0 | 启动 / 停机 |
s 0 | 电流零偏标定 |
r | 复位故障锁存 |
pid / sl / fc | 环路 / 观测器 / 故障状态 |
4.3 常见异常现象与排查指南

异常场景 1:I/F 强拖阶段电机剧烈震动抖动,无法顺利升速
- 原因:
FOC_IF_IQ_MA不足、斜坡过快,或相对霍尔边沿超前过大(滑差)。 - 处理:
- 适当加大
FOC_IF_IQ_MA(本工程默认约 1600 mA)。 - 降低
FOC_IF_OMEGA_RAMP,或收紧FOC_IF_OMEGA_LEAD_MAX。 - 确认
FOC_IF_OMEGA_SIGN/FOC_IF_IQ_SIGN与转向一致(本板均为+1)。
- 适当加大
异常场景 2:能爬到目标附近,但抖振/过热,或一报 Stall 串口「假死」
- 原因:进 RUN 时把 θ 掰到霍尔扇区中心;IF-hold 中误用 TIM 霍尔转速作 ACT 把 Iq 砍掉;SMO 误锁后切控角;UART 阻塞发送塞死。
- 处理:
- IF-hold 保持连续 θ_if,到速后再 Hall FOC 连续交接。
- IF-hold 速度反馈优先用边沿估速,并保留 Iq 下限直至到速。
- 暂勿用未吻合的 SMO 作唯一控角;
r清故障后再w 1。 - 发送短超时、ISR 内不 TX、日志降噪(已写入本工程)。
异常场景 3:t 改大目标后抖停,或 w 0 反而「更快」
t变大:IF-hold 内应对目标做软过渡,并提高 ω_if 上限;瞬时把速度环 SP 拉飞会切 Iq/失步。w 0:须清 Iq 并关 PWM;若只 abort boot 却保留大 Iq,会表现为「松油门还加速」——本工程已按停机路径修正。
异常场景 4:高速突加负载卡死却不报保护
- 原因:堵转判定过度依赖霍尔边沿间隔;无感估速塌陷未参与。
- 处理:IF-hold/交接宽限期内勿误报 Stall;稳态后结合
∥
E
^
∥
\|\hat{E}\|
∥E^∥ 塌陷与高 Iq 持续触发
FAULT_STALL(见bsp_fault.c)。
五、总结与后续演进
本章在 L20~23 框架上补齐了无感观测链路与可重复启动,并与现场行为对齐:
- SMO + PLL:由
v
α
β
,
i
α
β
v_{\alpha\beta}, i_{\alpha\beta}
vαβ,iαβ 估
e
^
α
β
\hat{e}_{\alpha\beta}
e^αβ,再锁出
θ
^
,
ω
^
\hat{\theta},\hat{\omega}
θ^,ω^(
bsp_smo.c)。 - Align → I/F → IF-hold → Hall FOC:解决零速不可观;到速后用霍尔稳转速/电流,避免误锁失步。
- 角度优先级:
foc_get_electrical_theta()在 boot / IF-hold /(可选)blend /(条件)SMO / 霍尔之间切换。 - 宏开关:
FOC_SENSORLESS_ENABLE=0可退回 Hall 启动做回归。
已验证 / 尚未完成
| 状态 | 内容 |
|---|---|
| 已验证 | 空载约 400 rpm:w 1 可重复启动;出现 IF-hold -> Hall FOC;sl 可对照 SMO |
| 未默认开启 | 纯 SMO 控角(须 hall 与 SMO 估速长期吻合后再切) |
| 局限 | I/F 难带大静载; R s / L s R_s/L_s Rs/Ls 温漂影响估角相位 |
更多推荐
所有评论(0)