1. 项目概述
最近在研究永磁同步电机(PMSM)的无传感器控制方案时,发现某宝上有个基于STM32F103的低成本变频器方案特别有意思。这个方案移植自MD500E变频器的核心算法,采用三电阻采样实现了无感FOC控制,实测低速扭矩表现优异,启动力矩能达到额定值的200%,而整套方案的物料成本却控制得相当低。
作为电机控制领域的老手,我第一时间入手了这个方案进行研究。下面就把我的研究心得和实操经验分享给大家,特别是那些想用STM32做低成本电机控制的朋友们。这个方案最吸引我的地方在于它优化过的磁链观测器算法,在低速性能上表现突出,而且硬件设计非常精简,特别适合中小功率应用。
2. 硬件架构解析
2.1 主控选型与周边电路
这套方案的核心是STM32F103C8T6这颗经典芯片,之所以选择它主要基于几个考虑:
- 性价比极高,市场价约10元人民币
- 72MHz主频足够运行FOC算法
- 内置高级定时器TIM1,支持中心对齐PWM模式
- 3个ADC通道可满足三电阻采样需求
电源部分采用经典的LM2596降压方案,将24V母线电压降到5V,再通过LDO降到3.3V给MCU供电。这里有个设计细节值得注意:他们在5V和3.3V之间串了一个10Ω电阻,既保证了电源稳定性,又有效抑制了高频噪声。
2.2 功率驱动设计
低压版本使用MOS管作为功率开关器件,驱动芯片选用FD6288。这个选择有几个优点:
- FD6288内置死区时间控制,简化了软件设计
- 驱动能力强,峰值输出电流达1A
- 集成自举二极管,减少外围元件
自举电路的设计很关键,这里他们用了1μF/50V的陶瓷电容和1N4148快恢复二极管。实测发现,在20kHz PWM频率下,这个配置能保证高端驱动电压稳定。
2.3 电流采样电路
三电阻采样是这个方案的亮点之一。他们在下桥臂的三个采样电阻(0.05Ω/3W)后接入了OP07运放做差分放大。几个关键参数:
- 放大倍数设置为20倍
- 在运放输入端加入了RC低通滤波(1kΩ+100nF)
- 采样保持电路的时间常数设为2μs
特别注意:采样电阻的布局要尽量靠近MOS管,走线要对称,否则会引入测量误差。
3. 软件算法实现
3.1 三电阻电流重构
在中心对齐PWM模式下,电流采样的时机特别重要。他们巧妙利用了PWM周期中的特定时刻进行采样:
c复制void ADC1_2_IRQHandler(void) {
if(ADC_GetITStatus(ADC1, ADC_IT_JEOC)) {
CurrA = (int16_t)(ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1)*Current_Adj);
CurrB = (int16_t)(ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_2)*Current_Adj);
CurrC = (int16_t)(ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_3)*Current_Adj);
if(PWM_Now_State == PWM_STATE_SHUNT){
I_alpha = _IQ(CurrB - CurrC)*ONE_BY_SQRT3;
I_beta = _IQ(CurrA - _IQmpy(_IQ(0.5),(CurrB + CurrC)));
}
ADC_ClearITPendingBit(ADC1, ADC_IT_JEOC);
}
}
这段代码的关键点:
- 使用注入模式ADC采样,确保时序精确
- 只在PWM_STATE_SHUNT状态下采样,避开开关噪声
- 采用_IQ24格式进行定点数运算,保证精度
3.2 优化的磁链观测器
传统滑模观测器在低速时性能下降明显,这个方案通过引入动态补偿项改善了低速性能:
c复制void Flux_Observer_Update(void) {
Lambda_alpha += _IQmpy((U_alpha - Rs*I_alpha - w*Lambda_beta), T);
Lambda_beta += _IQmpy((U_beta - Rs*I_beta + w*Lambda_alpha), T);
// 动态补偿项
Lambda_alpha += _IQmpy(_IQ(0.02), (Lambda_alpha_prev - Lambda_alpha));
Lambda_beta += _IQmpy(_IQ(0.02), (Lambda_beta_prev - Lambda_beta));
// 限幅防饱和
Lambda_alpha = _IQsat(Lambda_alpha, Lambda_max, -Lambda_max);
Lambda_beta = _IQsat(Lambda_beta, Lambda_max, -Lambda_max);
}
这个0.02的补偿系数经过精心调校,能在突加负载时快速收敛。实测表明,在10RPM以下仍能保持稳定观测,比很多商业方案的表现更好。
4. 启动策略与状态机
4.1 启动流程设计
启动过程采用三段式设计:
- 预定位阶段:注入直流电流对齐转子
- 开环加速阶段:斜坡加速到观测器能稳定工作的速度
- 闭环运行阶段:切换到FOC闭环控制
c复制typedef enum {
MOTOR_STOP,
ALIGNMENT,
OPEN_LOOP,
CLOSE_LOOP
} MotorState;
void StartUp_Handler(void) {
switch(motorState) {
case ALIGNMENT:
SetVoltage(ALIGN_VOLTAGE, 0);
if(++alignCounter > ALIGN_TIME) {
motorState = OPEN_LOOP;
InitOpenLoop();
}
break;
case OPEN_LOOP:
OpenLoopAngle += _IQmpy(OpenLoopSpeed, T);
if(OpenLoopSpeed < TARGET_SPEED) {
OpenLoopSpeed += ACC_RAMP;
} else {
motorState = CLOSE_LOOP;
}
break;
// ...其他状态处理
}
}
4.2 参数整定技巧
根据我的调试经验,以下几个参数需要特别注意:
- 预定位电压(ALIGN_VOLTAGE):一般为额定电压的30%-50%
- 预定位时间(ALIGN_TIME):100-200ms为宜
- 开环加速度(ACC_RAMP):根据负载惯量调整,通常0.1-0.5Hz/ms
调试建议:先用电位器调速模式测试,把速度环PID的积分项调小,避免启动冲击。
5. 实测性能与优化建议
5.1 性能测试数据
在不同工况下的实测表现:
| 测试项目 | 性能指标 | 备注 |
|---|---|---|
| 启动扭矩 | 200%额定 | 持续时间<1s |
| 最低稳定转速 | 5RPM | 空载 |
| 速度响应时间 | <50ms | 10%-90%额定转速 |
| 效率 | >90% | 额定工况 |
5.2 常见问题排查
-
PWM无输出
- 检查TIM1->BDTR寄存器配置,确保MOE位已置位
- 验证死区时间设置是否合理(通常100-500ns)
-
电流采样异常
- 检查运放供电电压
- 确认ADC采样时机与PWM状态同步
- 测量采样电阻两端电压,验证信号通路
-
低速抖动
- 调整磁链观测器补偿系数
- 检查速度估算环节的滤波参数
- 验证电机参数(Rs, Ld, Lq)是否准确
5.3 硬件优化建议
-
对于更高功率应用,建议:
- 改用IGBT模块
- 增加电流传感器
- 强化散热设计
-
提升EMC性能:
- 增加X2Y电容滤波
- 优化功率回路布局
- 使用屏蔽电缆连接电机
这套方案最让我惊喜的是它的性价比和低速性能表现。经过适当调参后,在10RPM以下仍能保持稳定运行,启动力矩足以应对大多数应用场景。对于想学习无感FOC的朋友来说,这是个非常不错的参考设计。