1. 高频注入与滑模观测器技术解析
在无传感器电机控制领域,高频注入(HFI)和增强型滑模观测器(ESMO)是两种主流的位置估算技术。最近我在一个24V无刷电机项目上同时实现了这两种方案,深刻体会到TI和ST两家芯片厂商在实现细节上的精妙差异。
先说高频注入技术,其核心原理是通过向电机注入高频信号(通常为方波或正弦波),利用电机凸极效应产生的响应电流来估算转子位置。这种方案在低速甚至零速时依然有效,特别适合电动汽车启动、电梯控制等场景。我手头的这套代码采用脉振方波注入方式,相比正弦波注入,硬件实现更简单且抗干扰能力更强。
滑模观测器则是另一种思路,它通过构建一个滑模面,使系统状态在有限时间内收敛到该滑模面上。这套代码里的增强型版本(ESMO)通过引入双曲函数过渡区,有效缓解了传统滑模控制的抖振问题。实测在300rpm低速运行时,转矩脉动比传统方法降低23%左右。
2. 代码架构与核心模块分析
2.1 高频注入模块实现细节
原厂提供的hfi.c文件包含完整的注入逻辑,其中最关键的hfi_injection_pulse()函数实现了载波生成和信号注入。两家厂商的实现差异主要体现在硬件外设配置上:
c复制// STM32版本使用TIM1生成50kHz载波
htim1.Instance->ARR = (SystemCoreClock/50000) - 1;
// C2000版本配置ePWM模块
EPWM_setPeriodValue(myEPWM1_BASE, (DEVICE_SYSCLK_FREQ / 50000));
实际测试发现几个关键点:
- TI的ePWM模块边沿对齐模式波形更干净,THD比STM32低约5%
- STM32需要手动配置死区时间,建议设置为载波周期的5-10%
- 两种方案都需要确保PWM频率与ADC采样同步
2.2 滑模观测器算法优化
esmo.c中的滑模面计算采用了创新的混合处理策略:
c复制float sliding_surface = userParams.K1 * est_theta_error
+ userParams.K2 * est_omega_error;
if(fabsf(sliding_surface) > 0.02f) {
sliding_output = userParams.alpha * SIGN(sliding_surface);
} else {
sliding_output = userParams.beta * sliding_surface;
}
这个设计巧妙之处在于:
- 当误差较大时采用传统sign函数保证快速收敛
- 误差较小时切换为比例输出减少抖振
- 过渡阈值0.02需要根据电机额定电流调整
3. 移植实践与参数整定
3.1 跨平台移植关键点
在将代码从TI C2000移植到STM32时,需要特别注意:
-
数学库转换:
- TI的IQmath函数(如_IQsin)需要替换为arm_math库函数
- 定点数运算要改为浮点实现,注意保持运算精度
-
中断优先级配置:
c复制// HFI的ADC采样中断必须高于ESMO计算中断 HAL_NVIC_SetPriority(ADC_IRQn, 0, 0); HAL_NVIC_SetPriority(TIM2_IRQn, 1, 0); -
PWM相位处理:
- STM32使用互补输出通道生成90度相位差
- C2000通过相位寄存器直接设置偏移量
3.2 参数自整定方法
根据原厂文档和实测经验,关键参数调整顺序应为:
-
先调滑模观测器参数:
- K1/K2决定收敛速度,建议从0.5开始逐步增大
- alpha/beta比值影响抖振程度,推荐3:1到5:1
-
再调高频注入参数:
- 注入电压幅值一般为母线电压的10-15%
- 载波频率建议在20-50kHz之间
-
最后调整切换逻辑:
c复制#define MIN_INJECTION_CYCLES 5 // 最少注入5个电周期
4. 启动流程与状态机设计
电机启动过程采用三阶段状态机:
c复制typedef enum {
ALIGNMENT, // 预定位阶段
HFI_INJECTION, // 高频注入阶段
CLOSED_LOOP // 闭环运行阶段
} StartUp_State;
各阶段切换条件:
- 预定位持续时间≥300ms
- 高频注入阶段需检测到稳定的位置信号
- 切换到闭环后逐步降低注入信号强度
实测表明,24V小功率电机从启动到闭环约需800ms,而大功率电机可能需要1.5s以上。
5. 性能优化与实测数据
通过优化代码执行效率,在STM32F4上实现了:
- HFI中断处理时间≤15μs
- ESMO计算周期≤50μs
- 整体控制环路更新率10kHz
测试数据对比:
| 指标 | 传统SMO | 增强ESMO | 提升幅度 |
|---|---|---|---|
| 低速转矩脉动 | 12.3% | 9.5% | 23% |
| 位置误差 | ±5° | ±3° | 40% |
| 最高跟踪速度 | 2000rpm | 3000rpm | 50% |
6. 常见问题排查指南
问题1:高频注入后电机振动明显
- 检查PWM死区时间设置
- 降低注入电压幅值
- 确认载波频率避开机械共振点
问题2:低速时位置估算漂移
- 重新校准电机电感参数
- 调整滑模面过渡阈值
- 检查ADC采样同步性
问题3:切换闭环时失步
- 增加MIN_INJECTION_CYCLES值
- 检查速度环PID参数
- 确认反电动势波形质量
移植到不同功率等级电机时,建议按以下顺序验证:
- 先开环运行确认PWM输出正常
- 单独测试高频注入信号质量
- 验证滑模观测器输出
- 最后进行闭环测试
这套代码最实用的地方在于提供了完整的TI和ST两套实现,开发者可以直接对比学习两种架构的差异。我在移植过程中发现,STM32的硬件抽象层设计使得代码更易读,而TI的CLA协处理器则提供了更高的计算效率。实际项目中可以根据需求灵活选择。