在永磁同步电机(PMSM)的无传感器控制策略中,滑模观测器(SMO)因其对系统参数变化和外部扰动具备良好的鲁棒性,同时计算开销适中,被广泛应用于Cortex-M0等资源受限的微控制器平台。本节重点介绍如何在仅支持整数运算的M0内核上高效实现完整的滑模观测器,主要解决符号函数的工程化处理以及低通滤波器的定点化设计这两个关键技术难点。
滑模观测器通常基于反电动势进行状态估计,其核心思想是构建一个电流观测模型,并通过引入开关型反馈项(如符号函数),使观测电流快速趋近于实际测量值。对于表贴式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这类处理器上实现上述结构时,面临以下关键限制:
标准符号函数 $\text{sign}(x)$ 在数字实现中不仅会加剧高频抖动,其条件判断逻辑(if-else分支)还可能导致执行时间不可预测,不利于实时控制。因此常采用平滑替代方式来削弱不连续性。常用方法包括:
饱和函数(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内核等资源受限的处理器。
对于饱和函数在边界层内的线性区域,也可使用预先计算的小规模查找表。将归一化后的误差作为索引直接读取输出值,牺牲少量内存空间来换取确定的执行时间,并避免乘除运算开销。
在极端资源受限的应用场景中,甚至可以采用两电平或三电平的滞环比较器代替连续型饱和函数,尽管这种方式会引入更大的噪声[1]。
滑模控制项 zα,β 包含高频开关成分,必须通过低通滤波器(LPF)提取其等效控制分量,进而获得平滑的反电动势估计值 êα,β。其传递函数形式如下:
其中 ωc 表示截止频率。在数字系统中,通常采用一阶后向欧拉法进行离散化处理:
式中 Ts 为控制周期。定义系数 a = Tsωc,则上式可改写为:
这构成一个典型的一阶无限脉冲响应(IIR)滤波器。定点实现的关键在于合理选择系数 a 和 1a 的Q格式及其运算精度。
系数 a 通常远小于1。例如当 Ts = 100μs、ωc = 100 rad/s 时,可得 a = 0.01。为了保证足够的计算精度,不能选用过低位数的Q格式。
设系统基准值为
1.0,推荐使用 Q15 格式(1位符号位,15位小数位),以兼顾动态范围与精度需求。将系数 a 量化为 Q15 对应的整数形式:
例如当 a = 0.01 时,有:
在代码中可通过宏定义方式固定系数:
#define A_Q15 328 // a = 0.01 in Q15 #define ONE_MINUS_A_Q15 (32768 - A_Q15) // 1-a in Q15, 注意1.0用32768表示
此方法确保了滤波器在定点环境下的稳定性与精度,同时保持高效运算特性。
Q150x10001.0Q15// 简化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在实现整数化锁相环(PLL)以从滤波后的反电动势 eα,β 中提取转子电角度 θe 时,通常采用基于PI控制的离散化结构。其核心思想是构造一个与角度偏差相关的误差信号 ε: ε = –eα cosθe – eβ 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 为采样周期。Q30上述运算全过程需以定点数形式完成,关键点包括: 三角函数的整数化处理: cosθe 与 sinθe 通过预先建立的查找表获取。一般在 [0, 2π) 范围内设置 512 或 1024 个采样点,并以32768格式存储正弦/余弦值。角度查表索引由 θe 的高有效位直接截取得到。Q15误差项的定点计算: ε 的计算包含两次乘加操作,中间结果保持在[0, 2π)格式(如 Q30),随后需将其转换为Q30格式输入至 PLL 控制器环节,确保数据一致性。Q15PLL核心的定点实现: KiTs 与 KpTs 应提前转换为定点系数(例如Q15*Q15格式)。估计角速度 ωe 和估计角度 θe 需使用较高精度表示(如Q20或Q12),以便兼顾分辨率与动态范围。在进行角度累加时,必须处理模溢出问题——当 θe 超过Q10所对应的数值时,应减去等效的定点周期值,维持角度在合理区间内循环。 稳定性与防溢出设计注意事项: 所有中间运算结果必须限制在32位有符号整数可表达范围内。对于多级级联滤波器或后续处理模块,建议采用2π格式的混合精度策略,并在关键路径上加入饱和保护机制,防止因数值溢出导致系统失稳。Qx注意:由于乘法操作可能导致数据超出16位范围,因此所有乘法运算应在32位宽的寄存器中执行。int16_t滤波器系数通过移位和定点近似方法由int32_t推导得出,避免了浮点运算开销。 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; }32768 - A_Q151-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;角度补偿机制 由于低通滤波器(LPF)会引入相位滞后,需进行前馈补偿以提升精度。 相位滞后可近似表示为: Δθ ≈ arctan(ω / ω) 因此,最终输出的角度估计应修正为: θfinal = θ + Δθ 其中,Δθ 可通过查表法或简化公式(如 Δθ ≈ ω / ω)实时计算并累加至当前角度估计值中。i_αβ系统集成流程与执行顺序 将滑模观测器(SMO)与PLL模块整合进Cortex-M0平台的电流环时,需合理规划执行流程: 1. 读取ADC采集的电流采样值 2. 执行滑模观测器算法: - 计算电流误差 - 应用饱和函数 - 更新观测器状态 - 输出反电动势估计信号z_αβ3. 对输出结果进行低通滤波处理,获得平滑信号z_αβ4. 进入PLL模块: - 利用滤波后的信号与上一周期的角度信息 - 更新当前估计角度ê_αβ和转速θ_e5. 基于最新角度值执行Park/Clark变换,完成FOC闭环控制中的其余运算ω_e资源使用评估(基于100MHz PWM频率,即10kHz控制周期)int16_t
扫码加好友,拉您进群



收藏
