1. 永磁同步电机无感控制概述
永磁同步电机(Permanent Magnet Synchronous Motor, PMSM)因其高效率、高功率密度等优势,在工业驱动、电动汽车等领域得到广泛应用。传统的PMSM控制需要安装位置传感器(如编码器、旋转变压器)来获取转子位置信息,但这会增加系统成本和复杂度。无感控制(Sensorless Control)技术通过算法估计转子位置和速度,成为当前研究热点。
在实际工程中,基于反电势观测器(Back-EMF Observer)结合锁相环(PLL)的无感控制方案,因其实现简单、动态响应快等特点,成为中高速区域的主流解决方案。但这种方法在低速区域(通常低于额定转速10%)存在明显局限性,需要配合其他技术实现全速域控制。
注意:无感控制并非完全不需要传感器,而是指不需要专门的位置传感器,仍需要电流、电压等基础传感元件。
2. 反电势观测器原理与实现
2.1 反电势的物理本质
永磁同步电机的反电势(Back-EMF)是由永磁体磁场切割定子绕组产生的感应电动势。在α-β静止坐标系下,反电势可表示为:
code复制e_α = -ψ_f * ω_r * sinθ_r
e_β = ψ_f * ω_r * cosθ_r
其中:
- ψ_f:永磁体磁链(恒定值)
- ω_r:转子电角速度
- θ_r:转子位置角
从公式可见,反电势幅值与转速成正比,相位包含转子位置信息。这就是通过反电势估计转速和位置的理论基础。
2.2 观测器数学模型构建
基于电机电压方程建立反电势观测器。在α-β坐标系下,PMSM的电压方程为:
code复制v_α = R_s*i_α + L_s*di_α/dt + e_α
v_β = R_s*i_β + L_s*di_β/dt + e_β
重构方程可得反电势观测值:
code复制e_α_hat = v_α - R_s*i_α - L_s*di_α/dt
e_β_hat = v_β - R_s*i_β - L_s*di_β/dt
2.3 STM32实现代码解析
在实际嵌入式实现中(如STM32),需注意离散化处理。以下是经过工程验证的观测器代码片段:
c复制// 结构体定义
typedef struct {
float Rs; // 定子电阻
float Ls; // 定子电感
float i_alpha_prev; // 上一周期α轴电流
float i_beta_prev; // 上一周期β轴电流
} EmfObserver;
// 反电势观测函数
void ObserveEmf(EmfObserver* obs, float v_alpha, float v_beta,
float i_alpha, float i_beta, float Ts,
float* e_alpha, float* e_beta) {
// 计算电流微分(前向差分)
float di_alpha = (i_alpha - obs->i_alpha_prev) / Ts;
float di_beta = (i_beta - obs->i_beta_prev) / Ts;
// 更新历史值
obs->i_alpha_prev = i_alpha;
obs->i_beta_prev = i_beta;
// 计算反电势估计
*e_alpha = v_alpha - obs->Rs*i_alpha - obs->Ls*di_alpha;
*e_beta = v_beta - obs->Rs*i_beta - obs->Ls*di_beta;
}
关键参数经验值:
- 采样时间Ts:通常取50-100μs(对应10-20kHz PWM频率)
- Ls测量:需考虑饱和效应,建议在额定电流下测量
- Rs补偿:建议增加温度补偿系数(约0.4%/℃)
3. 锁相环设计与调参
3.1 PLL基本结构
锁相环用于从反电势中提取转子位置信息,典型结构包括:
- 相位检测器:计算反电势估计值与PLL输出位置的相位差
- 环路滤波器:通常采用PI控制器
- 压控振荡器(VCO):积分器生成位置信号
3.2 改进型PLL实现
传统PLL在转速突变时易失锁,建议采用基于反正切的改进方案:
c复制// PLL结构体
typedef struct {
float kp; // 比例增益
float ki; // 积分增益
float theta; // 位置估计
float omega; // 速度估计
float int_err; // 误差积分
} PLL_Controller;
void PLL_Update(PLL_Controller* pll, float e_alpha, float e_beta, float Ts) {
// 计算相位误差(使用atan2避免象限判断错误)
float theta_est = atan2f(-e_alpha, e_beta); // 注意符号与坐标系定义相关
float err = theta_est - pll->theta;
// 相位误差归一化到[-π, π]
while(err > PI) err -= 2*PI;
while(err < -PI) err += 2*PI;
// PI控制器
pll->int_err += err * Ts;
pll->omega = pll->kp * err + pll->ki * pll->int_err;
pll->theta += pll->omega * Ts;
// 角度归一化
if(pll->theta > PI) pll->theta -= 2*PI;
if(pll->theta < -PI) pll->theta += 2*PI;
}
3.3 参数整定方法
PLL性能取决于PI参数,推荐采用以下调试步骤:
- 先设ki=0,逐步增大kp直到出现轻微振荡
- 取振荡时kp值的50%作为最终kp
- 逐步增加ki,观察速度阶跃响应
- 验证不同转速下的稳定性
典型参数范围(基于1kHz执行频率):
- kp:10-100 rad/(s·rad)
- ki:100-1000 rad/(s²·rad)
4. 低速区域限制与解决方案
4.1 低速性能受限原因
-
信噪比问题:反电势幅值∝转速,低速时可能被以下噪声淹没:
- 逆变器非线性(死区效应、管压降)
- ADC量化噪声
- 电流测量误差
-
参数敏感性:低速时观测器对Rs、Ls参数误差更敏感
-
数字实现限制:
- 有限采样率导致微分计算误差
- 定点运算的量化误差
4.2 混合控制策略
工程中常用组合方案:
| 速度范围 | 控制方法 | 切换策略 |
|---|---|---|
| 0-5%额定转速 | 高频注入法 | 速度观测方差检测 |
| 5-10%额定转速 | I-f控制 | 反电势幅值阈值 |
| >10%额定转速 | 反电势+PLL | 连续切换 |
切换时的注意事项:
- 设置重叠区避免频繁切换
- 采用渐变过渡(blending)策略
- 增加滞环比较防止振荡
5. 工程实现关键问题
5.1 硬件设计要点
-
电流采样:
- 推荐采用Σ-Δ型ADC(如STM32的HSADC)
- 采样与PWM中心对齐
- 增加RC滤波(截止频率≈1/2 PWM频率)
-
死区补偿:
- 前馈补偿:根据电流方向添加固定时间
- 反馈补偿:基于电流谐波分析
-
参数辨识:
- Rs:直流激励法
- Ls:高频交流注入法
- ψf:空载反电势测量
5.2 软件优化技巧
-
计算效率优化:
- 使用STM32的硬件FPU和三角函数加速
- 将观测器和PLL放在PWM中断服务例程
-
抗饱和处理:
c复制// PI控制器抗饱和示例
void PI_Update(PI_Controller* pi, float err, float Ts) {
float new_int = pi->int_err + err * Ts;
float output = pi->kp * err + pi->ki * new_int;
// 输出限幅检查
if(output > pi->out_max) {
output = pi->out_max;
} else if(output < pi->out_min) {
output = pi->out_min;
} else {
pi->int_err = new_int; // 未饱和时更新积分项
}
return output;
}
- 启动策略:
- 初始位置检测:短时电压脉冲+电流响应分析
- 开环加速到切换速度(约5%额定转速)
6. 实测性能评估
6.1 测试平台配置
基于STM32G4系列的典型测试环境:
- CPU: STM32G474 @170MHz
- PWM频率: 20kHz
- ADC采样: 同步触发采样,12bit分辨率
- 电机参数:
- 额定功率: 1kW
- 额定转速: 3000rpm
- 极对数: 4
6.2 性能指标
| 指标 | 中高速区域 | 低速区域 |
|---|---|---|
| 位置误差 | <1°电角度 | >15°电角度 |
| 速度波动 | <0.5%额定值 | >5%额定值 |
| 动态响应 | <10ms(90%) | >100ms |
6.3 波形分析
图1展示从10%额定转速加速到100%的实测波形:
- 通道1(黄色):估计速度(标幺值)
- 通道2(蓝色):实际速度(编码器反馈)
- 通道3(粉色):位置误差

观测到以下现象:
- 转速>10%时跟踪良好
- 加速过程存在约5°的瞬时位置误差
- 稳态时位置误差<1°
7. 进阶优化方向
7.1 自适应参数辨识
在线更新关键参数:
c复制void OnlineRsEstimation(float v_alpha, float i_alpha, float Ts) {
static float sum_v = 0, sum_i = 0;
sum_v += v_alpha * Ts;
sum_i += i_alpha * Ts;
// 每100ms更新一次
if(update_timer >= 0.1) {
Rs_new = sum_v / sum_i;
sum_v = sum_i = 0;
update_timer = 0;
}
}
7.2 非线性观测器
采用滑模观测器改善低速性能:
c复制float z_alpha, z_beta; // 滑模变量
float k_smc = 100; // 滑模增益
void SM_Observer(float v_alpha, float i_alpha, float Ts) {
float e_alpha = v_alpha - Rs*i_alpha;
float di_alpha = (i_alpha - i_alpha_prev)/Ts;
// 滑模控制项
float control = k_smc * sign(i_alpha - z_alpha);
// 更新滑模变量
z_alpha += (e_alpha - Ls*control) * Ts / Ls;
i_alpha_prev = i_alpha;
}
7.3 机器学习辅助
利用神经网络补偿非线性误差:
- 收集不同工况下的误差数据
- 训练浅层网络(如2层BPNN)
- 在线输出补偿量
实测表明,该方法可将低速位置误差降低30-50%,但需注意实时性要求。
在实际项目中,我们通常先实现基础的反电势+PLL方案,再根据具体需求逐步引入这些高级功能。对于大多数工业应用,经过精心调参的基础方案已能满足要求。