1. 项目背景与核心挑战
在洗衣机直驱电机控制领域,无感FOC(磁场定向控制)技术一直是工程师们面临的重大挑战。不同于传统的有传感器方案,无感控制需要在没有机械位置传感器的情况下,仅通过电流和电压信号来估算转子位置和速度。这对于洗衣机这种需要应对偏心负载、衣物重量变化和机械共振的应用场景尤为困难。
我们团队去年量产的STM32F103方案,成功在64KB Flash和20KB RAM的资源限制下,实现了包含混合磁链观测器、偏心检测、重量感知和动态陷波等复杂算法的完整解决方案。这个方案的特别之处在于:
- 在成本敏感的消费级MCU上实现了接近DSP的性能
- 针对洗衣机特有工况做了深度优化
- 通过了二十多万台设备的量产验证
提示:无感FOC的核心难点不在于算法理论本身,而在于如何在资源受限的MCU上实现稳定可靠的实时控制。这需要工程师对电机特性、控制理论和嵌入式编程都有深刻理解。
2. 混合磁链观测器设计
2.1 电压模型与电流模型的动态融合
混合磁链观测器的核心思想是结合电压模型和电流模型的优点:
- 电压模型:在高转速时精度高,但在低速时因积分漂移问题导致估算不准
- 电流模型:在低速时表现稳定,但高速时受参数误差影响大
我们采用的动态权重混合算法如下:
c复制// 混合权重计算
uint16_t blend_factor = (rpm < 300) ? 0 : (rpm - 300)*10;
flux_observer = (current_model * blend_factor + voltage_model * (1000 - blend_factor)) / 1000;
这个实现有几个关键点:
- 300rpm以下完全使用电流模型
- 300-400rpm之间线性过渡
- 400rpm以上完全使用电压模型
- 采用Q15定点数运算保证实时性
实测表明,这种平滑过渡比直接切换减少了80%的转子位置抖动。
2.2 电压模型积分漂移处理
电压模型最大的问题是积分漂移,我们采用了抗饱和积分器设计:
c复制// 抗饱和积分器
int32_t temp = (int32_t)voltage_q * dt + flux_alpha;
if(temp > 0x3FFFFFFF) flux_alpha = 0x3FFFFFFF;
else if(temp < -0x3FFFFFFF) flux_alpha = -0x3FFFFFFF;
else flux_alpha = temp;
这种处理方式:
- 使用32位中间变量防止溢出
- 设置合理的饱和限幅(0x3FFFFFFF对应Q30格式的1.0)
- 在积分器饱和时保持最大值而非回绕
3. 洗衣机特有功能实现
3.1 偏心检测算法
洗衣机滚筒偏心会导致电机负载周期性变化,传统方法是增加机械传感器,我们通过电流谐波分析实现了无感检测:
c复制// 滑模观测器核心
sliding_surface = (current_q_obs - current_q_meas) * Kslide;
if(sliding_surface > 100) emf_est += 50;
else if(sliding_surface < -100) emf_est -= 50;
这个看似简单的算法实际上:
- 通过滑模面(sliding_surface)捕捉电流偏差
- 采用强非线性控制快速跟踪EMF变化
- 能在0.5秒内检测出超过3mm的偏心量
- 计算量极小适合低端MCU
3.2 动态陷波器设计
洗衣机电机在特定转速下会与机械结构产生共振,我们实现了实时更新的动态陷波器:
c复制// 实时更新陷波频率
notch_filter_update(¬ch, rpm*6/60); // 6极电机机械转频
关键设计要点:
- 根据电机极对数(6极)计算机械转频
- 陷波器中心频率随转速实时调整
- 采用二阶IIR滤波器实现,仅需5个乘法运算
- 深度可调(通常设置20dB衰减)
3.3 衣物重量感知
传统洗衣机需要额外称重传感器,我们利用启动特性实现了无感重量检测:
c复制// 重量检测触发条件
if(ramp_target == 50 && actual_rpm > 45) {
weight_estimate = integrate_current(0, 200); // 采集前200ms电流
}
这个方法的原理是:
- 衣物重量与启动电流积分值高度相关
- 在特定加速阶段(50rpm指令,实际45rpm时)采样
- 200ms积分时间是最佳平衡点
- 通过大量实验数据建立重量-电流模型
- 最终误差控制在±0.5kg以内
4. 量产问题与解决方案
4.1 ADC采样同步问题
量产初期发现观测器精度波动大,最终定位是ADC采样时机问题:
c复制// 正确的PWM触发采样配置
ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update);
关键改进点:
- 使用PWM中心对齐模式
- 在PWM周期中点触发ADC采样
- 确保电流采样与PWM更新同步
- 采样保持时间设置为7.5个ADC时钟周期
这种配置将电流采样误差从±10%降低到±1%以内。
4.2 参数自整定策略
为适应不同电机批次差异,我们实现了在线参数识别:
- 电阻辨识:注入直流信号测量电压电流比
- 电感辨识:高频交流注入法
- 反电势常数:空载加速测试
所有参数自动存储在Flash最后页,支持现场自动校准。
5. 性能优化技巧
5.1 定点数运算优化
在STM32F103上实现高性能运算的关键技巧:
c复制// Q15乘法最佳实践
#define Q_MUL(a,b) ((int16_t)(((int32_t)(a)*(int32_t)(b)) >> 15))
// Q15除法优化
int16_t Q_div(int16_t a, int16_t b) {
int32_t temp = (int32_t)a << 15;
return (int16_t)(temp / b);
}
5.2 中断优先级配置
正确的中断优先级设置对实时性至关重要:
code复制PWM中断(最高) > ADC中断 > 通讯中断
具体配置原则:
- PWM中断不被打断
- ADC中断在5us内响应
- 通讯类中断最低优先级
5.3 状态机设计
主控制循环采用状态机实现:
c复制enum {
STATE_IDLE,
STATE_ALIGN,
STATE_OPEN_LOOP,
STATE_CLOSED_LOOP,
STATE_FAULT
};
void FOC_Handler(void) {
static uint8_t state = STATE_IDLE;
switch(state) {
case STATE_ALIGN:
// 转子预定位
if(align_timeout) state = STATE_OPEN_LOOP;
break;
// 其他状态处理...
}
}
6. 实测性能数据
经过优化后的系统性能指标:
| 参数 | 指标 | 测试条件 |
|---|---|---|
| 速度控制精度 | ±1rpm | 空载100-1000rpm |
| 位置估算误差 | <5度 | 全速范围 |
| 启动时间 | <0.3s | 空载到100rpm |
| 重量检测误差 | ±0.5kg | 1-10kg标准负载 |
| 偏心检测灵敏度 | 3mm | 静态偏心 |
| 电流采样延迟 | <2us | PWM触发模式 |
这套方案已经稳定运行超过8000小时无故障,证明了在资源受限平台上也能实现高可靠性控制。