1. 无速度传感器算法概述
在电机控制领域,速度传感器一直是获取转子位置和转速信息的关键部件。但传统光电编码器或旋转变压器不仅增加系统成本,还降低了可靠性。我在工业现场见过太多因传感器故障导致的停机事故,这促使我开始研究无速度传感器技术。
无速度传感器算法通过电机绕组上的电压、电流等电气量,实时估算转子位置和转速。这种技术省去了物理传感器,特别适合恶劣环境或对成本敏感的应用。目前主流方案包括滑模观测器(SMO)、模型参考自适应(MRAS)和高频注入(HFI)等,每种方法各有优劣。
2. 核心算法原理剖析
2.1 滑模观测器基础架构
滑模观测器的核心思想是通过构造一个带有切换函数的动态系统,迫使系统状态在有限时间内到达预设的滑模面。以永磁同步电机为例,其电流方程可表示为:
c复制// 简化版α-β坐标系下的电机模型
typedef struct {
float Rs; // 定子电阻
float Ls; // 定子电感
float psi_f; // 永磁体磁链
} MotorParams;
void motor_model(MotorParams *p, float i_alpha, float i_beta,
float u_alpha, float u_beta, float *di_alpha,
*di_beta) {
*di_alpha = (u_alpha - p->Rs*i_alpha)/p->Ls;
*di_beta = (u_beta - p->Rs*i_beta)/p->Ls;
}
观测器通过比较实际电流与模型电流的误差,采用符号函数进行反馈:
c复制float sign_function(float x) {
return (x > 0) ? 1.0 : -1.0;
}
// 滑模观测器核心计算
void smo_update(float i_alpha_err, float i_beta_err,
float *e_alpha, float *e_beta) {
float k_slide = 10.0; // 滑模增益
*e_alpha = k_slide * sign_function(i_alpha_err);
*e_beta = k_slide * sign_function(i_beta_err);
}
2.2 ESO增强型滑模观测器
基础SMO存在抖振问题,我在某风机项目中实测发现转速波动可达±5 RPM。ESO(Extended Sliding Mode Observer)通过引入扩张状态观测器,将系统扰动作为新状态进行估计:
c复制typedef struct {
float z1_alpha; // 电流观测状态
float z2_alpha; // 反电动势观测状态
float z1_beta;
float z2_beta;
float beta; // 观测器增益
} ESO_State;
void eso_update(ESO_State *s, float i_alpha, float i_beta,
float u_alpha, float u_beta, float dt) {
// α轴更新
float e_alpha = s->z1_alpha - i_alpha;
s->z1_alpha += (-s->beta*e_alpha + u_alpha/Ls) * dt;
s->z2_alpha += (-s->beta*s->beta*e_alpha) * dt;
// β轴更新同理
...
}
实测数据显示,ESO可将转速波动降低到±1 RPM以内,但计算量增加约15%。在STM32F4系列MCU上,完整ESO算法执行时间约28μs。
2.3 HFI高频注入技术
对于零低速工况(<5%额定转速),传统反电动势法失效。我在某伺服压机项目中采用HFI技术,通过在定子绕组注入高频信号(通常1-2kHz),利用转子的凸极效应获取位置信息:
c复制void hfi_injection(float *u_alpha, float *u_beta, float t) {
float Vh = 12.0; // 注入电压幅值
float wh = 2*PI*1500; // 1.5kHz注入频率
*u_alpha += Vh * cos(wh * t);
*u_beta += Vh * sin(wh * t);
}
// 解调处理
float hfi_demodulate(float i_alpha, float i_beta, float t) {
float wh = 2*PI*1500;
float L_diff = 0.1; // 电感差异
float mod_signal = i_alpha * sin(wh*t) - i_beta * cos(wh*t);
return L_diff * mod_signal; // 包含位置信息
}
关键提示:HFI注入电压幅值需谨慎选择,过大会引起振动噪声,过小则信噪比不足。根据我的经验,对于额定电压380V的电机,注入幅值建议在5-15V之间。
3. 混合算法实现策略
3.1 SMO与HFI的无缝切换
在实际项目中,我采用速度分区策略:
- 低速区(0-5%额定转速):纯HFI模式
- 过渡区(5-10%):HFI+SMO加权融合
- 高速区(>10%):纯SMO模式
c复制// 混合算法选择逻辑
void algorithm_select(float speed_pu, float *hfi_weight,
float *smo_weight) {
if (speed_pu < 0.05) {
*hfi_weight = 1.0;
*smo_weight = 0.0;
} else if (speed_pu < 0.1) {
float ratio = (speed_pu - 0.05) / 0.05;
*smo_weight = ratio;
*hfi_weight = 1.0 - ratio;
} else {
*smo_weight = 1.0;
*hfi_weight = 0.0;
}
}
3.2 位置观测器实现细节
转子角度通过锁相环(PLL)从反电动势中提取,我在代码中采用二阶PLL提高跟踪性能:
c复制typedef struct {
float theta; // 估计角度
float speed; // 估计转速
float kp; // 比例增益
float ki; // 积分增益
float i_term; // 积分项
} PLL_State;
void pll_update(PLL_State *s, float e_alpha, float e_beta, float dt) {
// 计算角度误差
float sin_theta = sin(s->theta);
float cos_theta = cos(s->theta);
float err = e_alpha * cos_theta - e_beta * sin_theta;
// PI控制器更新
s->i_term += s->ki * err * dt;
s->speed = s->kp * err + s->i_term;
// 角度积分
s->theta += s->speed * dt;
if (s->theta > 2*PI) s->theta -= 2*PI;
if (s->theta < 0) s->theta += 2*PI;
}
实测表明,在额定转速下角度估计误差<0.5度,动态响应时间约20ms。
4. 关键参数整定指南
4.1 滑模增益选择
滑模增益k_slide直接影响系统鲁棒性和抖振程度。通过大量实验,我总结出以下经验公式:
code复制k_slide = 1.5 * (R/L) * Imax + 1.2 * w_base * psi_f/L
其中:
- R/L:电机时间常数倒数
- Imax:最大相电流
- w_base:额定电角速度
- psi_f:永磁体磁链
4.2 观测器带宽设计
ESO的带宽(由β决定)应与控制系统带宽匹配:
- 过低:动态响应慢
- 过高:放大噪声
我的经验法则是:
code复制beta = 2 * PI * (5~10) * f_control
其中f_control为电流环带宽,通常500Hz-1kHz。
5. 工程实践中的挑战
5.1 参数敏感性分析
在某电动叉车项目中,电机温升导致电阻变化30%,引起转速估计偏差。解决方案:
- 在线电阻辨识算法
- 采用参数鲁棒性更强的ESO结构
c复制void online_rs_ident(float *Rs, float u_alpha, float u_beta,
float i_alpha, float i_beta, float dt) {
static float integral = 0;
float err = (u_alpha - *Rs*i_alpha) * i_alpha +
(u_beta - *Rs*i_beta) * i_beta;
integral += 0.001 * err * dt; // 自适应增益
*Rs = integral;
}
5.2 数字实现要点
- 采样同步:PWM中断中立即采样电流,避免开关噪声
- 定点优化:Q15格式处理三角函数,节省50%计算时间
- 抗饱和处理:积分项需做限幅
c复制// 定点数三角函数优化示例
short q15_sin(short theta_q15) {
// 使用查表法+线性插值
static const short sin_table[64] = {...};
int index = theta_q15 >> 10;
short frac = theta_q15 & 0x3FF;
return sin_table[index] +
((sin_table[index+1]-sin_table[index])*frac >> 10);
}
6. 实测性能对比
在某工业输送带电机上测试结果:
| 指标 | 基础SMO | ESO增强型 | HFI+SMO混合 |
|---|---|---|---|
| 零速保持力 | 失败 | 失败 | 成功 |
| 转速波动(%) | ±2.5 | ±0.8 | ±0.5 |
| 阶跃响应(ms) | 35 | 28 | 22 |
| CPU占用率(%) | 12 | 18 | 25 |
7. 完整实现框架
建议的软件架构:
c复制typedef struct {
MotorParams motor; // 电机参数
ESO_State eso; // ESO观测器状态
PLL_State pll; // PLL状态
float hfi_angle; // HFI估计角度
float final_angle; // 最终输出角度
} SensorlessCtrl;
void sensorless_update(SensorlessCtrl *ctrl,
float i_alpha, float i_beta,
float u_alpha, float u_beta,
float t, float dt) {
// HFI信号注入
hfi_injection(&u_alpha, &u_beta, t);
// 电流采样与坐标变换
...
// ESO更新
eso_update(&ctrl->eso, i_alpha, i_beta, u_alpha, u_