1. 高频方波注入(HFI)无感FOC控制方案概述
在永磁同步电机(PMSM)控制领域,零速和低速状态下的转子位置检测一直是个棘手问题。传统观测器在低速时信噪比太低,而高频信号注入法(HFI)通过在电机中注入高频信号并检测响应来解决这个难题。我在STM32F405平台上实现的这套方案,结合了高频方波注入和滑模观测器(SMO),实现了从零速到高速的全速域无传感器控制。
这个方案最突出的特点是:
- 零速带载启动能力(实测可达5Nm)
- 堵转状态下的转矩保持
- 全速域平滑切换(低速HFI+高速SMO)
- 完整的工程实现(CubeMX配置+MDK工程)
2. 系统架构与硬件设计
2.1 硬件平台选型
选择STM32F405作为主控芯片主要基于以下考虑:
- 168MHz主频满足实时控制需求
- 硬件FPU加速浮点运算
- 丰富的外设资源(3个ADC、高级定时器等)
- 性价比优势明显
电机驱动部分采用三相全桥拓扑,关键参数:
- 功率级:IPM模块(如FSBB30CH60)
- 驱动芯片:EG2133(带死区保护)
- 电流采样:三电阻+运放调理电路
- 母线电压检测:电阻分压+运放隔离
2.2 软件架构设计
系统采用分层架构:
- 底层驱动层(HAL库+CubeMX配置)
- 算法核心层(FOC+观测器)
- 应用层(状态机+保护逻辑)
关键中断安排:
- PWM周期中断(20kHz):电流环控制
- ADC采样完成中断:电流采样处理
- 1kHz定时中断:速度环+状态监控
3. 高频方波注入实现细节
3.1 高频信号生成
使用TIM1高级定时器生成互补PWM,关键配置:
c复制// CubeMX配置要点
htim1.Instance = TIM1;
htim1.Init.Prescaler = 0;
htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED3;
htim1.Init.Period = 84-1; // 10kHz载波(168MHz/2/84)
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
死区时间设置经验:
- 根据MOSFET开关特性调整
- 典型值500ns(对应BDTR寄存器值0x18)
- 过大会导致波形畸变,过小可能直通
3.2 信号提取与处理
带通滤波器设计要点:
- 中心频率=注入频率/2
- 带宽约±500Hz
- 采用二阶IIR实现
改进的巴特沃斯带通实现:
c复制typedef struct {
float a1, a2;
float b0, b1, b2;
float x[3], y[3];
} BiquadFilter;
float Biquad_Update(BiquadFilter *f, float input)
{
f->x[2] = f->x[1];
f->x[1] = f->x[0];
f->x[0] = input;
f->y[2] = f->y[1];
f->y[1] = f->y[0];
f->y[0] = f->b0*f->x[0] + f->b1*f->x[1] + f->b2*f->x[2]
- f->a1*f->y[1] - f->a2*f->y[2];
return f->y[0];
}
3.3 角度跟踪算法
基于锁相环的角度跟踪实现:
c复制typedef struct {
float angle;
float speed;
float Kp;
float Ki;
float integral;
} PLL_Observer;
void PLL_Update(PLL_Observer *o, float alpha, float beta, float dt)
{
// 正交信号生成
float sin_est = arm_sin_f32(o->angle);
float cos_est = arm_cos_f32(o->angle);
float err = alpha*cos_est - beta*sin_est; // 相位误差
// PI调节器
o->integral += o->Ki * err * dt;
float delta = o->Kp * err + o->integral;
// 角度更新
o->angle += delta * dt;
o->speed = delta;
// 角度归一化
if(o->angle > PI) o->angle -= 2*PI;
else if(o->angle < -PI) o->angle += 2*PI;
}
4. 零速启动流程实现
4.1 三阶段启动策略
-
高频注入阶段:
- 持续时间:约100ms
- 目标:角度收敛(误差<5°)
- 判断标准:信号幅值稳定
-
磁极辨识阶段:
- 脉冲序列:+I, 0, -I
- 持续时间:每个脉冲200μs
- 判定方法:比较电流积分绝对值
-
闭环启动阶段:
- 初始给定速度:0.5Hz
- 电流限幅:额定值150%
- 切换条件:速度观测器收敛
4.2 磁极辨识优化
改进的脉冲序列检测法:
c复制#define IDENT_PULSE_WIDTH 200 // μs
#define IDENT_CURRENT 30 // % of rated
void Pole_Identification(void)
{
float i_peak[3] = {0};
// 三脉冲测试
for(int i=0; i<3; i++){
float id_ref = (i-1) * IDENT_CURRENT;
FOC_SetCurrent(id_ref, 0);
delay_us(IDENT_PULSE_WIDTH);
i_peak[i] = get_current_peak();
FOC_SetCurrent(0, 0);
delay_us(500);
}
// 极性判断
if(fabsf(i_peak[2]) > fabsf(i_peak[0])){
gMotor.pole = POLE_NORTH;
}else{
gMotor.pole = POLE_SOUTH;
gFOC.angle += PI; // 角度补偿
}
}
5. 全速域切换策略
5.1 混合观测器设计
速度区间划分:
- 低速区(<5%额定转速):纯HFI
- 过渡区(5%~15%):HFI+SMO混合
- 高速区(>15%):纯SMO
切换逻辑实现:
c复制void Observer_Switch(float speed)
{
static enum {MODE_HFI, MODE_TRANS, MODE_SMO} mode = MODE_HFI;
// 滞回切换防止振荡
if(mode == MODE_HFI && speed > 0.15f*RATED_SPEED){
mode = MODE_TRANS;
start_smo_transition();
}
else if(mode == MODE_TRANS && speed > 0.2f*RATED_SPEED){
mode = MODE_SMO;
enable_smo_observer();
}
else if(mode == MODE_SMO && speed < 0.1f*RATED_SPEED){
mode = MODE_HFI;
enable_hfi_observer();
}
// 过渡区混合
if(mode == MODE_TRANS){
float blend = (speed - 0.15f*RATED_SPEED) / (0.05f*RATED_SPEED);
gFOC.angle = blend*smo_angle + (1-blend)*hfi_angle;
}
}
5.2 角度补偿技巧
切换瞬间的角度补偿方法:
- 记录切换前最后10个角度样本
- 计算SMO与HFI的角度偏差均值
- 应用补偿量:
c复制float compensate_angle = 0.5f * (smo_angle - hfi_angle);
gFOC.angle += compensate_angle;
6. 关键参数调试指南
6.1 HFI参数整定
-
注入频率:
- 典型值:1-5kHz
- 过高导致电流纹波大
- 过低影响角度分辨率
-
注入电压幅值:
- 通常为母线电压5-10%
- 带载时需要适当增加
-
带通滤波器参数:
- 中心频率=注入频率/2
- 带宽=±(10-20%中心频率)
6.2 电流环调试
PI参数经验公式:
c复制// 电流环PI参数估算
void CurrentLoop_Tuning(float R, float L, float Ts)
{
float Kp = 0.5f * L / Ts; // 理论值的50%开始
float Ki = 0.1f * R / Ts;
// 实际调试步骤:
// 1. 先设Ki=0,调Kp至响应无超调
// 2. 逐步增加Ki改善稳态误差
// 3. 带载验证动态响应
}
6.3 常见问题排查
-
角度抖动大:
- 检查PWM死区补偿
- 调整带通滤波器带宽
- 验证ADC采样同步性
-
启动失败:
- 检查磁极辨识结果
- 确认初始角度收敛
- 调整启动电流限幅
-
切换振荡:
- 增加过渡区宽度
- 优化角度补偿算法
- 检查速度观测一致性
7. 工程实现注意事项
-
ADC采样同步:
- 使用定时器TRGO触发ADC
- 采样时刻设置在PWM周期中点
- 确保采样保持时间足够
-
代码优化技巧:
- 关键函数使用内联汇编优化
- 三角函数查表法加速
- DMA传输减少CPU负载
-
安全保护机制:
- 硬件过流保护(比较器)
- 软件二级保护(电流环限幅)
- 状态监控看门狗
移植到其他平台时的重点检查项:
- 定时器时钟配置
- ADC采样时序
- PWM死区时间
- 电机参数(极对数、电阻、电感)
这套方案在多个项目中验证过稳定性,包括AGV驱动、工业机械臂等应用场景。实际调试中发现,电机参数准确性对性能影响很大,建议先用LCR表测量电机相电阻和电感,再通过离线辨识验证参数。
