全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 MATLAB等数学软件专版
42 0
2025-12-09

第8章 观测器与无传感器控制

8.1 滑模观测器(SMO)的整数实现方法

在永磁同步电机(PMSM)的无传感器控制策略中,滑模观测器(SMO)因其对系统参数变化和外部扰动具备良好的鲁棒性,同时计算开销适中,被广泛应用于Cortex-M0等资源受限的微控制器平台。本节重点介绍如何在仅支持整数运算的M0内核上高效实现完整的滑模观测器,主要解决符号函数的工程化处理以及低通滤波器的定点化设计这两个关键技术难点。

8.1.1 基本原理及整数化实现挑战

滑模观测器通常基于反电动势进行状态估计,其核心思想是构建一个电流观测模型,并通过引入开关型反馈项(如符号函数),使观测电流快速趋近于实际测量值。对于表贴式PMSM(即满足 $L_d = L_q = L_s$ 的情形),在 $\alpha\beta$ 静止坐标系下的电压方程可表示为:

\[ \begin{bmatrix} u_{\alpha} \\ u_{\beta} \end{bmatrix} = R_s \begin{bmatrix} i_{\alpha} \\ i_{\beta} \end{bmatrix} + L_s \frac{d}{dt} \begin{bmatrix} i_{\alpha} \\ i_{\beta} \end{bmatrix} + \begin{bmatrix} e_{\alpha} \\ e_{\beta} \end{bmatrix} \]

其中,扩展反电动势分量定义如下:$e_{\alpha} = -\omega_e \psi_f \sin\theta_e$,$e_{\beta} = \omega_e \psi_f \cos\theta_e$,它们隐含了转子电角度 $\theta_e$ 和电角速度 $\omega_e$ 的信息,是位置估算的关键来源。

对应的滑模观测器模型可写为:

\[ L_s \frac{d}{dt} \begin{bmatrix} \hat{i}_{\alpha} \\ \hat{i}_{\beta} \end{bmatrix} = \begin{bmatrix} u_{\alpha} \\ u_{\beta} \end{bmatrix} - R_s \begin{bmatrix} \hat{i}_{\alpha} \\ \hat{i}_{\beta} \end{bmatrix} - \begin{bmatrix} z_{\alpha} \\ z_{\beta} \end{bmatrix} \]

式中,$z_\alpha$ 与 $z_\beta$ 为滑模控制项,传统形式为 $z = k_{smo} \cdot \text{sign}(\hat{i} - i)$,其中 $k_{smo}$ 为滑模增益系数。

Q15

在Cortex-M0这类处理器上实现上述结构时,面临以下关键限制:

  • 缺乏浮点运算单元(FPU):所有数学运算必须采用整数或定点数格式完成;
  • 主频与算力有限:算法需高度优化,避免复杂乘除、查表或非线性操作;
  • 符号函数不连续性问题:直接使用 sign 函数会导致高频颤振,引发噪声并影响稳定性;
  • 反电动势提取依赖滤波:需要设计适合定点环境的低通滤波结构,并补偿由此带来的相位滞后。

8.1.2 符号函数的工程化简化方案

标准符号函数 $\text{sign}(x)$ 在数字实现中不仅会加剧高频抖动,其条件判断逻辑(if-else分支)还可能导致执行时间不可预测,不利于实时控制。因此常采用平滑替代方式来削弱不连续性。常用方法包括:

  1. 饱和函数(Saturation Function)替代法

    该方法最为常见且高效,使用饱和函数 $\text{sat}(x/\Phi)$ 来代替原始的 $\text{sign}(x)$,其中 $\Phi$ 表示边界层厚度,用于限定线性区域范围。具体表达式如下:

    \[ \text{sat}\left(\frac{x}{\Phi}\right) = \begin{cases} 1, & x > \Phi \\ \frac{x}{\Phi}, & |x| \leq \Phi \\ -1, & x < -\Phi \end{cases} \]

    在定点运算环境中,为减少耗时的除法操作,通常将 $\Phi$ 设计为2的幂次(例如 $2^n$),从而可用右移运算替代除法,显著提升效率。例如,若取 $\Phi = 64$,则 $x / \Phi$ 可用 $x >> 6$ 实现。

将数值设为2的幂次方(例如256,对应Q格式中的1.0),此时可通过右移操作实现对 x/Φ 的计算,从而显著提升运算速度。以电流误差 ε = - i 为例,假设该误差采用

Q15
所示的格式(取值范围为[-1, 1)),并令 Φ 对应
0x1000
(即Q12格式下的1.0)。在此条件下,饱和函数的C语言实现代码如下:

#define BOUNDARY_LAYER 0x1000 // Q12(1.0)
int16_t sat_function(int16_t error) { // error为Q15
    int32_t temp = (int32_t)error; // 扩展至32位防止溢出
    if (temp > BOUNDARY_LAYER) {
        return 0x7FFF; // Q15下近似1.0 (0.999...)
    } else if (temp < -BOUNDARY_LAYER) {
        return -0x7FFF; // Q15下近似-1.0
    } else {
        // 等价于 (error * (2^15)) / (2^12) = error * 8,即Q15*2^3 -> Q12
        // 直接返回Q15格式结果,需左移3位(error * 8)
        return (int16_t)((temp << 3)); // 结果仍在Q15,值域(-1,1)
    }
}

这种方法将原本复杂的符号判断和除法运算转换为简单的比较与位移操作,特别适用于M0内核等资源受限的处理器。

查表法(Look-Up Table, LUT)

对于饱和函数在边界层内的线性区域,也可使用预先计算的小规模查找表。将归一化后的误差作为索引直接读取输出值,牺牲少量内存空间来换取确定的执行时间,并避免乘除运算开销。

简化开关函数设计

在极端资源受限的应用场景中,甚至可以采用两电平或三电平的滞环比较器代替连续型饱和函数,尽管这种方式会引入更大的噪声[1]。

8.1.3 低通滤波器的定点实现

滑模控制项 zα,β 包含高频开关成分,必须通过低通滤波器(LPF)提取其等效控制分量,进而获得平滑的反电动势估计值 êα,β。其传递函数形式如下:

êα,β(s) = (ωc / (s + ωc)) · zα,β(s)

其中 ωc 表示截止频率。在数字系统中,通常采用一阶后向欧拉法进行离散化处理:

ê(k) = ê(k1) + Tsωc[z(k1) ê(k1)]

式中 Ts 为控制周期。定义系数 a = Tsωc,则上式可改写为:

ê(k) = (1 a)ê(k1) + a·z(k1)

这构成一个典型的一阶无限脉冲响应(IIR)滤波器。定点实现的关键在于合理选择系数 a1a 的Q格式及其运算精度。

设计步骤:

1. 参数范围与精度分析

系数 a 通常远小于1。例如当 Ts = 100μsωc = 100 rad/s 时,可得 a = 0.01。为了保证足够的计算精度,不能选用过低位数的Q格式。

2. Q格式选择

设系统基准值为

1.0
,推荐使用
Q15
格式(1位符号位,15位小数位),以兼顾动态范围与精度需求。将系数 a 量化为
Q15
对应的整数形式:

AQ15 = round(a × 215)

例如当 a = 0.01 时,有:

AQ15 = round(0.01 × 32768) = 328
3. 定点运算实现

在代码中可通过宏定义方式固定系数:

#define A_Q15         328               // a = 0.01 in Q15
#define ONE_MINUS_A_Q15 (32768 - A_Q15) // 1-a in Q15, 注意1.0用32768表示

此方法确保了滤波器在定点环境下的稳定性与精度,同时保持高效运算特性。

Q15

0x1000

1.0

Q15
// 简化PLL步骤示例 (伪代码)
int32_t error;      // Q30格式,用于存储误差计算结果
int32_t est_omega;  // Qxx格式,根据实际速度范围设定精度
int32_t est_angle;  // Qxx格式,作为角度累加器,高位用作查表索引

// 1. 计算误差 epsilon
error = (int32_t)(-e_alpha_q15) * cos_val_q15 + (int32_t)(-e_beta_q15) * sin_val_q15; // 结果为Q30
Q30
在实现整数化锁相环(PLL)以从滤波后的反电动势 eα,β 中提取转子电角度 θe 时,通常采用基于PI控制的离散化结构。其核心思想是构造一个与角度偏差相关的误差信号 ε: ε = –eα cosθeeβ sinθe ≈ E sin(θeθe) 当系统接近稳态时,该误差近似正比于真实角度与估计角度之差,即 ε ∝ (θeθe)。 对应的离散域更新方程如下: ωe(k) = ωe(k–1) + KiTs·ε(k) θe(k) = θe(k–1) + Ts·ωe(k) + KpTs·ε(k) 其中 Kp 和 Ki 分别为比例与积分增益系数,Ts 为采样周期。
32768
上述运算全过程需以定点数形式完成,关键点包括: 三角函数的整数化处理: cosθe 与 sinθe 通过预先建立的查找表获取。一般在 [0, 2π) 范围内设置 512 或 1024 个采样点,并以
Q15
格式存储正弦/余弦值。角度查表索引由 θe 的高有效位直接截取得到。
[0, 2π)
误差项的定点计算: ε 的计算包含两次乘加操作,中间结果保持在
Q30
格式(如 Q30),随后需将其转换为
Q15
格式输入至 PLL 控制器环节,确保数据一致性。
Q15*Q15
PLL核心的定点实现: KiTs 与 KpTs 应提前转换为定点系数(例如
Q20
格式)。估计角速度 ωe 和估计角度 θe 需使用较高精度表示(如
Q12
Q10
),以便兼顾分辨率与动态范围。在进行角度累加时,必须处理模溢出问题——当 θe 超过
所对应的数值时,应减去等效的定点周期值,维持角度在合理区间内循环。 稳定性与防溢出设计注意事项: 所有中间运算结果必须限制在32位有符号整数可表达范围内。对于多级级联滤波器或后续处理模块,建议采用
Qx
格式的混合精度策略,并在关键路径上加入饱和保护机制,防止因数值溢出导致系统失稳。
int16_t
注意:由于乘法操作可能导致数据超出16位范围,因此所有乘法运算应在32位宽的寄存器中执行。
int32_t
滤波器系数通过移位和定点近似方法由
32768 - A_Q15
推导得出,避免了浮点运算开销。 int16_t lpf_filter(int16_t z_input, int16_t prev_output) { int32_t temp; // 计算 (1-a)*prev_output (Q15 * Q15 -> Q30) temp = (int32_t)ONE_MINUS_A_Q15 * (int32_t)prev_output; // 计算 a*z_input (Q15 * Q15 -> Q30) temp += (int32_t)A_Q15 * (int32_t)z_input; // 结果舍入并转换回Q15: (Q30 + 2^14) >> 15 temp = (temp + 0x4000) >> 15; return (int16_t)temp; }
1-a
// 1. 误差处理与格式转换
error = error >> 15; // 将误差近似转换为Q15定点格式

// 2. 估计速度更新(采用简化的PI控制结构)
est_omega += Ki_Ts_Q20 * error; // 根据误差调整速度估计值,注意数据对齐与移位操作

// 对估计速度进行限幅处理,确保其在合理范围内
est_omega = MAX(MIN(est_omega, MAX_OMEGA_Q), MIN_OMEGA_Q);

// 3. 估计角度更新
// 结合速度项与比例项的修正量,累加得到新的角度估计
est_angle += ((est_omega >> (OMEGA_Q - ANGLE_Q_DELTA)) + Kp_Ts_Qxx * error);
// 使用掩码实现模运算,保证角度始终处于有效区间内
est_angle &= ANGLE_MOD_MASK;

i_αβ
角度补偿机制 由于低通滤波器(LPF)会引入相位滞后,需进行前馈补偿以提升精度。 相位滞后可近似表示为: Δθ ≈ arctan(ω / ω) 因此,最终输出的角度估计应修正为: θfinal = θ + Δθ 其中,Δθ 可通过查表法或简化公式(如 Δθ ≈ ω / ω)实时计算并累加至当前角度估计值中。
z_αβ
系统集成流程与执行顺序 将滑模观测器(SMO)与PLL模块整合进Cortex-M0平台的电流环时,需合理规划执行流程: 1. 读取ADC采集的电流采样值 2. 执行滑模观测器算法: - 计算电流误差 - 应用饱和函数 - 更新观测器状态 - 输出反电动势估计信号
z_αβ
3. 对输出结果进行低通滤波处理,获得平滑信号
ê_αβ
4. 进入PLL模块: - 利用滤波后的信号与上一周期的角度信息 - 更新当前估计角度
θ_e
和转速
ω_e
5. 基于最新角度值执行Park/Clark变换,完成FOC闭环控制中的其余运算
int16_t
资源使用评估(基于100MHz PWM频率,即10kHz控制周期)
  • 计算负载: 整个SMO+PLL流程在优化良好的情况下约消耗50–100条M0内核指令,在48MHz主频下运行时间远低于100μs,满足实时性要求。
  • 内存占用:
    • RAM: 用于存储观测器状态、滤波器变量、PLL参数及查找表等,总需求约为20–50字节。
    • Flash/ROM: 主要用于存放正弦查找表(例如512点正弦表占1KB)以及程序固件代码。
核心要点总结 - 滑模观测器的整数化实现关键在于对连续域非线性环节(如符号函数)和滤波结构进行适合定点运算的离散化近似。 - 使用饱和函数替代理想符号函数,可有效抑制高频抖振,同时降低计算开销;选择以2的幂次作为边界层厚度,便于将除法转化为高效移位操作。 - 一阶低通滤波器在定点实现中需谨慎设定Q格式系数,推荐使用32位中间变量参与运算,避免溢出并维持数值稳定性。 - 位置与速度提取采用锁相环(PLL)架构时,三角函数可通过预存查表实现;PLL内部的PI控制器也需完成离散化设计,并匹配合适的定点增益参数。 - 针对滤波导致的相位延迟,应引入基于速度估计的前馈角度补偿机制,显著提高位置估算精度。 - 在算法集成过程中,必须同步评估Cortex-M0平台上的CPU负载与内存消耗,确保整体模块可在规定控制周期内稳定运行。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群