1. 项目概述:当电机控制遇上滑模观测器
在电机控制领域,无传感器技术一直是工程师们追求的目标。传统的编码器方案不仅增加硬件成本,还降低了系统可靠性。三年前我在开发一款工业风机控制器时,就曾因编码器进水导致整个产线停机。这次经历让我彻底转向无传感器算法研究,而滑模观测器(SMO)与锁相环(PLL)的组合方案,在STM32F103这类成本敏感型MCU上展现出了惊人的性价比。
这个项目本质上是在解决两个核心问题:如何通过电机相电流准确估算转子位置(滑模观测器的职责),以及如何将估算信号处理成稳定可用的转速信息(PLL的强项)。在STM32F103C8T6这样的72MHz主频芯片上实现,需要克服定点数运算精度、ADC采样时序优化、中断响应延迟等一系列工程挑战。
2. 硬件平台选型与配置
2.1 STM32F103的极限压榨
选择STM32F103C8T6这个经典型号并非偶然。其Cortex-M3内核的72MHz主频,配合硬件乘法器和单周期指令,能满足大部分实时控制需求。但真正关键的是其丰富的外设:
- 3个独立ADC模块(12位精度)
- 4个通用定时器(TIM2-TIM5)
- 1个高级控制定时器(TIM1)
- 多达7个DMA通道
在具体配置上,我采用了以下策略:
c复制// ADC配置示例(使用规则组注入组双模式)
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = ENABLE;
hadc1.Init.NbrOfDiscConversion = 2; // 每次触发采样2相电流
hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T3_TRGO; // 由TIM3触发
关键提示:ADC采样时刻必须与PWM中心对齐模式严格同步,否则电流采样会受开关噪声严重影响。实测发现将采样点设置在PWM周期中点后1us效果最佳。
2.2 电流采样电路设计要点
相电流采样是滑模观测器的输入源头,硬件设计不当会导致整个系统失效。我的教训包括:
- 分流电阻选择:50mΩ/3W的锰铜电阻,兼顾灵敏度与温漂
- 运放电路:采用INA240A2双向电流检测芯片,共模抑制比达110dB
- 滤波设计:二阶RC滤波(1kΩ+100nF)配合软件移动平均滤波
实测电路噪声控制在±5mV以内,这对后续的滑模控制至关重要。曾因PCB布局不当导致采样值波动达50mV,直接导致观测器失稳。
3. 滑模观测器核心算法实现
3.1 数学模型离散化处理
滑模观测器基于电机α-β坐标系下的电压方程:
code复制diα/dt = (vα - R*iα + ω*Lq*iβ)/Ld
diβ/dt = (vβ - R*iβ - ω*Ld*iα)/Lq
其中ω为待观测的电角速度。
在STM32上实现时,需将其离散化为:
c复制// 滑模观测器核心计算(每100us执行一次)
void SMO_Update(float v_alpha, float v_beta, float i_alpha, float i_beta) {
static float z_alpha, z_beta;
float e_alpha = i_alpha_est - i_alpha;
float e_beta = i_beta_est - i_beta;
// 滑模控制量计算
z_alpha = (e_alpha > 0) ? -K_slide : K_slide;
z_beta = (e_beta > 0) ? -K_slide : K_slide;
// 状态更新
i_alpha_est += T_s * ((v_alpha - R*i_alpha + we*Lq*i_beta)/Ld + z_alpha);
i_beta_est += T_s * ((v_beta - R*i_beta - we*Ld*i_alpha)/Lq + z_beta);
// 反电动势估算
emf_alpha = Ld * z_alpha;
emf_beta = Ld * z_beta;
}
3.2 关键参数整定经验
滑模增益K_slide的选取直接影响系统性能:
- 过小:无法克服系统扰动
- 过大:引入高频抖振
通过实验得出经验公式:
code复制K_slide = 1.2 * V_bus / sqrt(Ld*Lq)
其中V_bus为母线电压。在24V系统中,典型值取30-50效果较好。
4. 锁相环(PLL)设计与优化
4.1 二阶PLL实现方案
滑模观测器输出的反电动势包含高频噪声,需要PLL提取平滑的位置信号。采用二阶PLL结构:
c复制typedef struct {
float theta; // 输出角度
float omega; // 输出转速
float kp; // 比例增益
float ki; // 积分增益
float err_prev; // 上次误差
} PLL_TypeDef;
void PLL_Update(PLL_TypeDef *hpll, float emf_alpha, float emf_beta) {
float sin_theta = sinf(hpll->theta);
float cos_theta = cosf(hpll->theta);
// 相位检测器
float err = emf_alpha * cos_theta - emf_beta * sin_theta;
// PI调节器
hpll->omega += hpll->ki * err;
float delta_theta = hpll->omega + hpll->kp * err;
// 角度积分
hpll->theta += delta_theta * T_s;
if(hpll->theta > PI) hpll->theta -= 2*PI;
if(hpll->theta < -PI) hpll->theta += 2*PI;
}
4.2 动态响应调参技巧
PLL带宽与系统响应速度直接相关。通过扫频测试发现:
- 带宽<1Hz:转速跟踪滞后明显
- 带宽>50Hz:噪声抑制能力下降
推荐采用临界阻尼配置:
code复制kp = 2 * ξ * ωn
ki = ωn * ωn
其中ξ=0.707(最佳阻尼比),ωn取20-30rad/s(约3-5Hz)
5. 系统集成与实测效果
5.1 中断时序编排策略
整个系统需要严格的时间管理:
- PWM周期中断(20kHz):更新PWM占空比
- ADC采样中断(10kHz):电流采样触发
- 控制算法中断(10kHz):滑模观测器+PLL计算
通过TIM1的TRGO输出触发ADC,确保采样与PWM严格同步。实测时序抖动控制在±50ns以内。
5.2 性能指标对比
| 参数 | 编码器方案 | SMO+PLL方案 |
|---|---|---|
| 位置误差 | ±0.5° | ±2.5° |
| 转速响应带宽 | 100Hz | 30Hz |
| 最低工作转速 | 50rpm | 150rpm |
| 硬件成本 | $8.5 | $1.2 |
虽然静态性能稍逊,但在风机、泵类等对成本敏感的应用中,这套方案的优势非常明显。实测在500W永磁同步电机上,从150rpm到3000rpm的加速过程仅需0.8秒。
6. 典型问题排查指南
6.1 低速抖动问题
现象:转速低于200rpm时角度抖动明显
排查步骤:
- 检查ADC采样值是否稳定(示波器观察)
- 适当增大滑模增益K_slide(提升20%)
- 降低PLL带宽至2Hz以下
- 在反电动势计算后加入移动平均滤波
6.2 高速失步问题
现象:超过额定转速70%后观测器失稳
解决方案:
- 确认电流环带宽足够(应>1kHz)
- 检查参数Ld、Lq是否随电流变化(需导入饱和参数表)
- 在高速区减小滑模增益(公式:K_slide = K_base / (1 + 0.01*ω))
7. 进阶优化方向
对于追求极致的开发者,可以考虑:
- 自适应滑模增益:根据转速动态调整K_slide
- 高频注入法:提升低速性能(但增加CPU负担)
- 磁链观测器:替代传统滑模结构,减少抖振
在最近的项目中,我将滑模观测器与磁链观测器结合,在STM32F103上实现了100rpm稳定运行,角度误差控制在±1.5°以内。这证明即使在资源受限的平台上,通过算法优化仍能突破理论极限。
