电机驱动开发学习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 误导成「已经纯无感闭环」。

指令序(准备)

日志含义
rPI/fault reset, Iq=0清故障锁存,Iq 置零
s 0recalibrating current (wait ~2s)电流零偏;约 2s 后再启动
t 400RPM target: 400 ... use w 1只改目标,不会转,须 w 1

w 1 之后:按 1.3 阶段读

1.3 阶段典型日志字段怎么读
CHARGEcharge boot capcharge done -> offset cal下桥自举,约数十 ms
OFFSETADC off U/V/W=1550/... cal=1三相零偏采样完成
ALIGNalign hall=4 theta=210 deg duty=1200按当前霍尔扇区定位;相移 240° 时扇区中心角约 210°
I/Falign done -> I/F Iq (Iq*=1600 ...)固定 Iq*≈1600 mA,开始斜坡
FOC I/F: t=.. if=.. E=.. hall=.. sync=.. Iq*=.. slip=0if:开环电角速度 (rad/s);hall/sync:边沿估速 / 开环同步机械 rpm;E:SMO 估 |Ê|;slip=0:未超前霍尔太多
→ IF-holdI/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 FOCIF-hold -> Hall FOC rpm=377 th=207θ 连续交给霍尔 HF 角;稳态有感闭环
检查fcstate=OK ... boot=5boot=5 = BOOT_RUN;无故障
停机s 0FOC 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=0hallsync 上升;出现 IF-hold keep theta;随后有 IF-hold -> Hall FOCfc 为 OK。
  • :I/F 中途 slip 累加 / 掉速;进 RUN 后无 keep theta 却转速塌陷;卡在 IF-hold 大 Iq 抖振且迟迟没有 Hall FOCfc 非 OK 或串口假死(先 r 再查)。

串口操作口令见 ##4.2;异常对照见 ##4.3


二、数学建模与算法原理

2.1 预备概念

  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

  2. 转子磁链( ψ f \psi_f ψf
    永磁体在定子侧等效的磁链幅值(Wb)。它把机械旋转“翻译”成电压: ∥ e ∥ = ψ f ω e \Vert e\Vert=\psi_f\omega_e e=ψfωe ψ f \psi_f ψf 越大,同一转速下反电动势越强,越容易被观测。

  3. 反电动势与电角度的映射
    α \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

  4. 电角度 / 电角速度与极对数
    θ 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=nrpm602πp。本系列电机 p = 4 p=4 p=4

  5. 滑模面(Sliding Surface, S S S
    人为规定的“目标误差集合”。本课取 S = i ~ α β = 0 S=\tilde{\boldsymbol{i}}_{\alpha\beta}=\mathbf{0} S=i~αβ=0,即希望估计电流等于实测电流。滑模控制要做两件事:先把状态推到该面上(到达),再让它贴在面上滑动(保持)。

  6. 滑模增益(Sliding Gain, K K K
    开关/饱和律前面的幅度系数(单位 V)。 K K K 越大,把误差“拉回滑模面”越猛,但也更容易抖振。到达条件要求 K K K 大于反电动势分量的上界,否则误差到不了面。

  7. 滑模注入项(Injection Term, z α β \boldsymbol{z}_{\alpha\beta} zαβ
    观测器方程里人为加进去的一项,形式常为 K ⋅ s g n ( i ~ ) K\cdot\mathrm{sgn}(\tilde{\boldsymbol{i}}) Ksgn(i~) K ⋅ s a t ( i ~ / ε ) K\cdot\mathrm{sat}(\tilde{\boldsymbol{i}}/\varepsilon) Ksat(i~/ε)。它不对应真实电路元件,而是算法里用来强迫电流误差收敛的虚拟电压;到达滑模面后,它会“顶住”真实反电动势。

  8. 等效控制量(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} zeqeαβ,因此可把 z \boldsymbol{z} z 的低频成分当作反电动势估计。工程上常用低通滤波从抖振的 z \boldsymbol{z} z 里取出这个“等效”部分。

  9. 饱和边界层厚度(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)。

  10. 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

  11. 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=nrpm602π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πfcLPF 截止角频率,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π×483.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} ze,于是从 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αβ=Ksgn(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>11y1y<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
  1. Align:按当前霍尔扇区注入定位占空比,建立已知初始 θ \theta θ(本板相移默认 240°)。
  2. I/FIq ≈ FOC_IF_IQ_MA,电角速度 ω i f \omega_{\mathrm{if}} ωif 斜坡上升;硬限相对霍尔边沿估速的超前,滑差过大降流/失败,避免绕组空烧。
  3. IF-hold(进入 BOOT_RUN 后):交接时禁止把 θ \theta θ 掰到霍尔扇区中心(会失步掉速);控角继续积分 θ i f \theta_{\mathrm{if}} θif,速度环把机械转速拉向目标。
  4. Hall FOC:当边沿估速与开环同步速都贴近目标后,θ 连续交给霍尔高频角度环,并降低 Iq 下限,避免空载 2A 抖振。
  5. 纯 SMO 控角:算法与 smo_pll_* 已就绪;须等 ω ^ \hat{\omega} ω^ 与霍尔估速长期吻合后再切,本课暂未默认开启(误锁曾导致 Stall/串口假死)。

理论教材中的「I/F→SMO 加权融合」仍可作为下一步;本仓库以 可重复启动、可稳速 为先。


三、软件架构与核心代码落地

3.1 状态机演进(Boot State Machine)

w 1

完成

完成

完成

边沿速/Ê 条件满足

hall≈目标

规划:SMO 吻合

BOOT_IDLE

BOOT_CHARGE
自举预充电

BOOT_OFFSET
电流零偏

BOOT_ALIGN
霍尔扇区定位

BOOT_DRAG
I/F:Iq+θ_if 斜坡

BOOT_RUN
IF-hold:θ 仍开环

BOOT_RUN
Hall FOC 稳速

纯 SMO 控角

关键代码入口:

模块文件作用
启动状态机User/foc/bsp_foc_boot.cCharge/Offset/Align/I/F/IF-hold/Hall 交接
SMO+PLLUser/foc/bsp_smo.c E ^ \hat{E} E^ θ ^ \hat{\theta} θ^ ω ^ \hat{\omega} ω^track/seed
控角选择User/foc/bsp_foc.cfoc_get_electrical_theta()boot 活跃 / IF-hold / 融合 / 霍尔 /(条件)SMO
参数User/foc/bsp_motor_params.hFOC_SENSORLESS_ENABLEFOC_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):

  1. Boot 活跃(Charge/Offset/Align/Drag):用 foc_boot_get_theta()(含 I/F 强制角)。
  2. IF-hold:仍用 boot 开环 θ \theta θ,SMO 只估速/对照。
  3. Sensorless blend(若使能): θ i f \theta_{\mathrm{if}} θif θ s m o \theta_{\mathrm{smo}} θsmo 插值。
  4. SMO locked 且与霍尔估速接近:才允许 SMO 控角(防误锁)。
  5. 否则:霍尔高频角度(Hall FOC)。

上文 3.2 节给出的 SMO 代码块为原理示意;仓库实现以 bsp_smo.c / smo_pll_t 为准(含 track_enseed、锁相保持等现场保护)。


四、调试 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_KIKP 管带宽;KI 消稳态角差过大易抖、震荡
FOC_IF_IQ_MA / FOC_IF_OMEGA_RAMPIq 不足失步;斜坡过快跟不上本板默认约 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 thetaIF-hold -> Hall FOCfcboot=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 不足、斜坡过快,或相对霍尔边沿超前过大(滑差)。
  • 处理
    1. 适当加大 FOC_IF_IQ_MA(本工程默认约 1600 mA)。
    2. 降低 FOC_IF_OMEGA_RAMP,或收紧 FOC_IF_OMEGA_LEAD_MAX
    3. 确认 FOC_IF_OMEGA_SIGN / FOC_IF_IQ_SIGN 与转向一致(本板均为 +1)。

异常场景 2:能爬到目标附近,但抖振/过热,或一报 Stall 串口「假死」

  • 原因:进 RUN 时把 θ 掰到霍尔扇区中心;IF-hold 中误用 TIM 霍尔转速作 ACT 把 Iq 砍掉;SMO 误锁后切控角;UART 阻塞发送塞死。
  • 处理
    1. IF-hold 保持连续 θ_if,到速后再 Hall FOC 连续交接
    2. IF-hold 速度反馈优先用边沿估速,并保留 Iq 下限直至到速。
    3. 暂勿用未吻合的 SMO 作唯一控角;r 清故障后再 w 1
    4. 发送短超时、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 框架上补齐了无感观测链路与可重复启动,并与现场行为对齐:

  1. 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)。
  2. Align → I/F → IF-hold → Hall FOC:解决零速不可观;到速后用霍尔稳转速/电流,避免误锁失步。
  3. 角度优先级foc_get_electrical_theta() 在 boot / IF-hold /(可选)blend /(条件)SMO / 霍尔之间切换。
  4. 宏开关FOC_SENSORLESS_ENABLE=0 可退回 Hall 启动做回归。

已验证 / 尚未完成

状态内容
已验证空载约 400 rpm:w 1 可重复启动;出现 IF-hold -> Hall FOCsl 可对照 SMO
未默认开启纯 SMO 控角(须 hall 与 SMO 估速长期吻合后再切)
局限I/F 难带大静载; R s / L s R_s/L_s Rs/Ls 温漂影响估角相位
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐