1. 项目背景与核心价值
作为一名长期深耕电机控制领域的工程师,我最近在STM32G431平台上实现了一套完整的无感FOC驱动方案,特别针对低速和零速场景进行了优化。这套方案最大的亮点在于结合了高频方波注入(HFI)和滑膜观测器(SMO)两种技术,完美解决了传统无感FOC在低速和零速时观测不准的痛点。
在实际测试中,这套方案可以实现:
- 零速带载启动(启动转矩可达额定转矩的80%)
- 低速稳定运行(最低可持续运行转速<5%额定转速)
- 堵转状态下的力矩保持
- 中高速平滑切换到滑膜观测器模式
2. 硬件平台选型与配置
2.1 STM32G431核心优势
选择STM32G431作为主控芯片主要基于以下几个考量:
- 高性价比:相比F4系列,G4系列在电机控制外设相当的情况下价格更低
- 专业外设:
- 4个高级定时器(TIM1/8/15/17)
- 3个12位ADC(5Msps采样率)
- 3个运算放大器(可用于电流采样)
- 运算能力:170MHz Cortex-M4内核,带FPU和DSP指令集
2.2 关键硬件设计要点
在原理图设计阶段有几个需要特别注意的地方:
电流采样电路:
c复制// 典型的三电阻采样电路配置
#define R_SHUNT 0.01f // 采样电阻阻值
#define OPAMP_GAIN 20.0f // 运放增益
功率驱动部分:
- 栅极驱动芯片选用ST的L6390
- 每个MOSFET栅极都需要10Ω电阻+二极管组成的快速关断电路
- 自举电容建议使用1μF/50V的X7R电容
注意:PCB布局时务必保证电流采样走线对称,避免引入不必要的偏移误差
3. 软件架构设计
3.1 控制环路时序安排
整个FOC控制采用定时器中断触发的方式,关键时序配置如下:
| 任务 | 触发源 | 执行周期 | 优先级 |
|---|---|---|---|
| 电流采样 | TIM1_TRGO | 20kHz | 最高 |
| FOC运算 | ADC中断 | 20kHz | 高 |
| 速度观测 | TIM6 | 5kHz | 中 |
| 通信处理 | 空闲任务 | - | 低 |
c复制// 定时器配置示例(CubeMX生成)
void MX_TIM1_Init(void)
{
htim1.Instance = TIM1;
htim1.Init.Prescaler = 0;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = SystemCoreClock/20000 - 1; // 20kHz
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
}
3.2 高频注入实现细节
高频方波注入的核心在于信号叠加和响应提取:
- 信号注入:
c复制// 在α轴注入1kHz方波信号
Vα = Vα + V_inj * (2*(htim->cnt < htim->arr/2) - 1);
- 响应提取:
采用同步解调技术,通过FIR滤波器提取有效信号:
c复制// 解调系数计算
float demod_coeff = 2.0f/(3.0f*Ts*V_inj);
- 位置估算:
c复制// 使用反正切计算位置
theta_est = atan2f(hfi_beta, hfi_alpha);
4. 滑膜观测器设计与实现
4.1 SMO数学模型
滑膜观测器基于电机反电动势模型:
code复制diα/dt = (Vα - R*iα + ω*L*iβ)/L
diβ/dt = (Vβ - R*iβ - ω*L*iα)/L
滑膜面设计:
code复制Sα = iα_est - iα
Sβ = iβ_est - iβ
4.2 参数整定技巧
通过大量实验总结出以下参数调整经验:
| 参数 | 影响 | 推荐值 | 调整方法 |
|---|---|---|---|
| Kslide | 动态响应 | 0.5-2.0 | 从低往高调 |
| Fsmop | 滤波截止 | 500Hz | 根据转速调整 |
| EMF_Gain | 观测增益 | 0.8-1.2 | 带载调试 |
c复制// 滑膜观测器实现代码片段
void SMO_Update(float ialpha, float ibeta, float valpha, float vbeta)
{
// 电流误差计算
float e_alpha = ialpha_est - ialpha;
float e_beta = ibeta_est - ibeta;
// 滑膜控制量
float z_alpha = (e_alpha > 0) ? Kslide : -Kslide;
float z_beta = (e_beta > 0) ? Kslide : -Kslide;
// 状态更新
ialpha_est += Ts/L * (valpha - R*ialpha + we*L*ibeta - L*z_alpha);
ibeta_est += Ts/L * (vbeta - R*ibeta - we*L*ialpha - L*z_beta);
// 反电动势估算
emf_alpha = -L * z_alpha;
emf_beta = -L * z_beta;
}
5. 模式切换策略
5.1 切换条件设计
采用多条件复合判断确保切换可靠性:
- 速度阈值:>5%额定转速
- 观测一致性:连续10个周期位置误差<5°
- 电流波动:相电流THD<15%
c复制// 切换判断逻辑
if((abs(omega_elec) > SWITCH_SPEED) &&
(pos_error_avg < POS_ERROR_THRESH) &&
(current_thd < THD_THRESH))
{
control_mode = SMO_MODE;
}
5.2 过渡期处理
为避免切换瞬间的转矩波动,采用以下措施:
- 相位对齐:确保HFI和SMO的初始位置一致
- 渐变过渡:用一阶惯性环节平滑过渡观测结果
- 转矩补偿:切换瞬间适当增加q轴电流
6. 实测性能数据
在24V/500W永磁同步电机上测试结果:
| 指标 | 测试值 | 行业平均水平 |
|---|---|---|
| 启动转矩 | 1.2Nm | 0.8Nm |
| 最低转速 | 30rpm | 100rpm |
| 切换波动 | <3% | 10-15% |
| 效率@额定 | 94.5% | 92-93% |
实测发现:在负载突变时,适当提高滑膜增益Kslide可以显著改善动态响应,但需注意噪声抑制
7. 移植与调试指南
7.1 参数适配流程
- 电机参数识别:
c复制// 静态参数测量
R = Vdc / (2 * Irated);
L = (t_curr_rise * Vdc) / (2 * Irated);
- 开环测试:
- 逐步提高VF比,观察电流波形
- 确保加速过程无过流
- 闭环调试:
- 先调电流环,再调速度环
- HFI和SMO分开调试
7.2 常见问题排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 启动抖动 | HFI增益过大 | 降低V_inj幅度 |
| 切换振荡 | 观测器滞后 | 提高SMO带宽 |
| 高速失步 | 反电动势饱和 | 增加EMF增益 |
| 电流噪声 | 采样不同步 | 检查ADC触发时序 |
8. 工程代码结构
项目采用模块化设计,主要目录结构:
code复制├── Drivers
├── Inc
│ ├── foc_controller.h // FOC核心算法
│ ├── hfi_estimator.h // 高频注入实现
│ └── smo_observer.h // 滑膜观测器
└── Src
├── main.c // 主循环和初始化
├── stm32g4xx_it.c // 中断服务
└── user_tasks.c // 后台任务
关键宏定义配置:
c复制// 在foc_config.h中可修改的重要参数
#define HFI_VOLTAGE 5.0f // 注入电压幅值(V)
#define SMO_SLIDING_GAIN 1.5f // 滑膜增益
#define SWITCH_SPEED 0.05f // 切换速度(pu)
在移植到不同电机时,通常只需要修改foc_config.h中的参数即可快速适配。
