1. 无速度传感器算法概述
在电机控制领域,无速度传感器算法正逐渐成为工程师们的必备技能。这种技术的神奇之处在于,它能够在完全移除物理编码器的情况下,依然精确估算电机转速和转子位置。想象一下,拆掉传统伺服电机上的编码器后,系统依然能稳定运行——这听起来像是魔法,实则是现代控制理论的精妙应用。
无传感器算法主要分为两大类:基于电机数学模型的开环估算和基于观测器的闭环估算。其中滑模观测器(Sliding Mode Observer, SMO)因其强鲁棒性和实现简单等特点,成为工业应用中的热门选择。它通过构建一个虚拟的"滑模面",使系统状态在有限时间内收敛到这个面上,从而实现状态变量的精确估算。
2. 滑模观测器核心原理
2.1 基本结构设计
滑模观测器的核心思想是利用电流误差信号来反推转速信息。其数学模型基于永磁同步电机(PMSM)的电压方程:
code复制dIα/dt = (Vα - RsIα + ωLqIβ)/Ld
dIβ/dt = (Vβ - RsIβ - ωLdIα)/Lq
其中ω就是我们需要估算的转速。观测器通过比较实际电流(Iα,Iβ)与估算电流(Iα_hat,Iβ_hat)的差异,不断修正估算值,最终使误差趋近于零。
2.2 关键参数解析
在C语言实现中,我们首先定义观测器的结构体:
c复制typedef struct {
float alpha; // 滑模增益
float Kslide; // 切换增益
float theta_hat;// 估算角度(rad)
float w_hat; // 估算转速(rad/s)
float i_alpha_hat; // α轴估算电流
float i_beta_hat; // β轴估算电流
} SMO_TypeDef;
其中alpha和Kslide是最关键的两个参数:
- alpha决定系统收敛速度,典型值0.1~0.5
- Kslide影响系统抗扰动能力,通常取10~20
这两个参数需要配合调整:alpha增大可加快收敛但易引发振荡,Kslide增大增强抗扰性但会增加抖振。实际调试时可先固定alpha=0.3,Kslide=15作为起点。
3. ESMO增强型滑模观测器实现
3.1 算法改进点
基本SMO在中高速段表现良好,但在低速区存在估算精度下降的问题。增强型滑模观测器(ESMO)通过引入转速自适应补偿项来改善这一状况:
c复制// ESMO特有的补偿项
float compensation = h->beta * fabsf(h->w_hat) * h->Kslide;
s_alpha += compensation * e_beta;
s_beta -= compensation * e_alpha;
这里的beta是补偿系数,典型值0.05~0.2。这个改进使观测器刚度随转速自动调整,实测可将中高速段的估算误差降低40%以上。
3.2 角度解算技巧
转子位置估算的核心是atan2函数的使用:
c复制h->theta_hat = atan2f(h->i_beta_hat, h->i_alpha_hat);
这里有几个优化点:
- 使用atan2f而非atan,避免象限判断错误
- 在调用前应对估算电流做归一化处理
- 对于零速附近,可加入小信号激励辅助判断
4. HFI+SMO混合观测器设计
4.1 高频注入原理
高频注入(HFI)通过在定子电压中注入高频信号(通常1-2kHz),利用电机凸极效应来检测转子位置。这种方法在零速和低速区表现优异,但在高速区效果下降。
4.2 混合架构实现
将HFI与SMO结合的混合观测器,能覆盖全速范围:
c复制void HFI_SMO_Update(HFI_SMO_TypeDef *h) {
// 高频信号注入
h->v_alpha = V_BASE * cosf(h->theta_hfi);
h->v_beta = V_BASE * sinf(h->theta_hfi);
// 解调处理
float hfi_error = demodulate_HFI(h);
float smo_error = calculate_SMO_error(h);
// 动态权重融合
float smo_weight = fmaxf(0.3, h->w_hat/W_BASE);
h->theta_hat = smo_weight * smo_theta + (1-smo_weight) * hfi_theta;
// 高频信号更新
h->theta_hfi += HF_FREQ * DT;
}
实际应用中,权重系数应该动态调整:
- 低速(w_hat < 5%额定转速):HFI主导(权重70%)
- 中高速(w_hat > 10%额定转速):SMO主导(权重80%+)
5. 工程实现关键点
5.1 防抖振处理
滑模观测器固有的抖振问题可通过以下方法缓解:
- 用饱和函数替代符号函数:
c复制float sat(float x, float eps) {
if(x > eps) return 1.0;
if(x < -eps) return -1.0;
return x/eps;
}
- 加入低通滤波:
c复制#define FILTER_LEN 5
float filter_buf[FILTER_LEN];
...
// 滑动平均滤波
filter_buf[filter_idx] = h->theta_hat;
filter_idx = (filter_idx + 1) % FILTER_LEN;
float filtered_theta = 0;
for(int i=0; i<FILTER_LEN; i++)
filtered_theta += filter_buf[i];
filtered_theta /= FILTER_LEN;
5.2 参数自整定策略
实现参数自动调整可大幅减少调试时间:
c复制// 根据转速自动调整alpha
h->alpha = ALPHA_BASE * (1 + 0.5*fabsf(h->w_hat)/W_BASE);
// 根据负载调整Kslide
if(current_load > 0.7*RATED_LOAD)
h->Kslide = K_BASE * 1.2;
else
h->Kslide = K_BASE;
6. 实测性能与优化
6.1 静态性能测试
在额定负载、不同转速下的角度误差测试数据:
| 转速(rpm) | 基本SMO误差(°) | ESMO误差(°) | 混合观测器误差(°) |
|---|---|---|---|
| 50 | 3.2 | 2.1 | 1.5 |
| 300 | 1.8 | 1.2 | 1.0 |
| 1000 | 1.2 | 0.8 | 0.7 |
| 3000 | 2.5 | 1.5 | 1.3 |
6.2 动态响应优化
为提高阶跃响应速度,可加入前馈补偿:
c复制// 转速前馈补偿
float w_feedforward = Kff * (w_cmd - w_prev)/DT;
h->w_hat += w_feedforward;
w_prev = w_cmd;
典型参数取值:
- Kff = 0.1~0.3 (过大易引发振荡)
- DT取控制周期(通常100us~1ms)
7. 常见问题排查
7.1 低速抖动问题
现象:电机在<5%额定转速时角度估算抖动明显
解决方法:
- 检查HFI注入信号幅度(通常2-5%额定电压)
- 增加ESMO的beta系数(0.1→0.15)
- 验证电流采样分辨率(建议至少12bit)
7.2 高速失步问题
现象:转速>80%额定值时角度突然跳变
排查步骤:
- 检查电源电压是否足够(反电动势不能超过直流母线电压)
- 调整SMO的alpha参数(适当减小)
- 确认PWM频率足够高(建议≥10kHz)
7.3 启动失败问题
现象:电机启动时无法正常旋转
调试建议:
- 初始位置检测:先通直流锁定转子
- 启动策略:采用开环启动到5%转速再切闭环
- 检查观测器初始化:theta_hat应从0开始
8. 实际应用建议
-
调试步骤:
- 先调开环V/F模式确保硬件正常
- 再调基本SMO参数(alpha/Kslide)
- 最后优化ESMO和HFI参数
-
参数整定顺序:
code复制
电流环PID → 速度观测器 → 位置观测器 → HFI参数 -
推荐采样配置:
- 电流采样率 ≥ 20kHz
- 控制周期 ≤ 100us
- PWM频率 8-16kHz
在电机参数准确、调试得当的情况下,无感FOC系统可实现:
- 转速波动 < ±0.5%
- 低速可达 0.5%额定转速
- 转矩响应 < 10ms