1. 项目概述
最近完成了一个基于STM32F103的智能洗衣机控制项目,特别之处在于这个设计不需要水位检测传感器。对于很多刚接触家电控制开发的工程师来说,水位检测往往是个头疼的问题 - 传感器成本高、安装复杂、还容易出故障。我这个方案通过时间控制替代水位检测,在保证基本洗衣功能的同时,大幅降低了硬件成本和系统复杂度。
这个方案特别适合预算有限的学生项目、小型家电厂商的入门级产品,或者作为传统洗衣机的简化版控制系统。虽然省去了水位检测,但依然完整实现了标准洗衣流程的所有核心功能:多种洗涤模式选择、电机正反转控制、温度调节、异常保护等。整个系统硬件成本可以控制在50元以内,软件部分采用模块化设计,方便后续功能扩展。
2. 硬件设计详解
2.1 主控芯片选型
选择STM32F103C8T6作为主控芯片主要基于以下几点考虑:
- 72MHz主频完全满足洗衣控制的实时性要求
- 内置64KB Flash和20KB SRAM,足够存储控制程序和运行数据
- 丰富的外设接口:多达3个USART、2个SPI、2个I2C、1个USB和7个定时器
- 价格低廉(约10元/片),供货稳定
实际使用中发现,STM32F103的GPIO驱动能力足够直接驱动小型继电器,但建议在驱动大功率继电器或H桥时还是加上三极管放大电路。
2.2 电机驱动方案
根据负载功率不同,我测试了两种电机驱动方案:
方案一:继电器控制(适合<200W电机)
- 优点:电路简单,成本低(约5元)
- 缺点:机械寿命有限(约10万次),切换时有火花干扰
- 典型接线:STM32 GPIO → 1K电阻 → S8050三极管 → 继电器线圈
方案二:H桥驱动(适合>200W电机)
- 使用L298N模块(约15元)或分立MOS管搭建
- 支持PWM调速,可实现更精细的电机控制
- 需要额外设计隔离电路防止电机干扰MCU
2.3 温度检测实现
采用DS18B20数字温度传感器优势明显:
- 单总线接口节省GPIO资源
- ±0.5℃的精度完全满足洗衣需求
- 防水封装可直接接触洗涤水
- 典型电路:3.3V → 4.7K上拉电阻 → DS18B20 → GND
实测中发现,单总线对走线长度敏感,建议传感器到MCU距离不超过3米,否则需降低通信速率。
2.4 用户交互设计
低成本方案可采用:
- 4×4矩阵键盘(约3元)
- 1602 LCD显示屏(约8元)
- 5mm LED状态指示灯
进阶方案可选用:
- 电阻式触摸屏(约25元)
- OLED显示屏(约15元)
- 旋转编码器替代部分按键
3. 软件架构设计
3.1 主程序流程
c复制int main(void) {
HAL_Init(); // 硬件抽象层初始化
SystemClock_Config(); // 系统时钟配置
MX_GPIO_Init(); // GPIO初始化
MX_TIM1_Init(); // 定时器初始化
MX_USART1_UART_Init(); // 串口初始化
LCD_Init(); // 显示屏初始化
DS18B20_Init(); // 温度传感器初始化
while (1) {
Wash_Mode_Select(); // 模式选择
Wash_Process_Control(); // 洗衣流程控制
Fault_Detection(); // 故障检测
}
}
3.2 状态机设计
洗衣流程分解为6个状态:
- IDLE:待机状态
- FILLING:进水阶段(时间控制)
- WASHING:洗涤阶段
- RINSING:漂洗阶段
- SPINNING:脱水阶段
- FAULT:故障状态
状态转换通过事件触发,典型事件包括:
- 定时器超时
- 用户按键中断
- 故障信号触发
3.3 定时控制实现
使用STM32的基本定时器(TIM6/TIM7)实现各阶段时间控制:
c复制// 设置10ms定时器中断
HAL_TIM_Base_Start_IT(&htim6);
// 中断服务程序中计数
void TIM6_IRQHandler(void) {
static uint32_t wash_timer = 0;
if (current_state == WASHING) {
wash_timer++;
if (wash_timer >= wash_time) {
Change_State(RINSING);
}
}
// 其他状态处理...
}
4. 关键功能实现
4.1 无水位检测的进水控制
传统方案依赖水位传感器,本设计采用时间估算:
- 根据洗衣机容量计算理论进水时间
- 示例:5kg容量,进水阀流量6L/min → 约50秒
- 实际测试调整补偿值
- 考虑水压波动,增加20%安全余量
- 程序实现固定时间控制
c复制#define FILL_TIME 60 // 单位:秒
void Water_Fill_Control(void) {
HAL_GPIO_WritePin(WATER_VALVE_GPIO, GPIO_PIN_SET); // 打开进水阀
osDelay(FILL_TIME * 1000); // 延时
HAL_GPIO_WritePin(WATER_VALVE_GPIO, GPIO_PIN_RESET); // 关闭进水阀
}
4.2 电机控制算法
标准洗衣流程需要电机周期性正反转:
- 正转10秒 → 暂停3秒 → 反转10秒 → 暂停3秒(循环)
使用PWM实现调速(以L298N为例):
c复制// 设置PWM频率为1kHz,占空比70%
__HAL_TIM_SET_PRESCALER(&htim1, 71); // 72MHz/(72*1000)=1kHz
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 700); // 70%占空比
// 正转
HAL_GPIO_WritePin(IN1_GPIO, GPIO_PIN_SET);
HAL_GPIO_WritePin(IN2_GPIO, GPIO_PIN_RESET);
// 反转
HAL_GPIO_WritePin(IN1_GPIO, GPIO_PIN_RESET);
HAL_GPIO_WritePin(IN2_GPIO, GPIO_PIN_SET);
4.3 温度PID控制
加热控制采用位置式PID算法:
c复制typedef struct {
float Kp, Ki, Kd;
float error, last_error, integral;
} PID_Controller;
float PID_Calculate(PID_Controller* pid, float setpoint, float actual) {
pid->error = setpoint - actual;
pid->integral += pid->error;
float derivative = pid->error - pid->last_error;
pid->last_error = pid->error;
return pid->Kp * pid->error +
pid->Ki * pid->integral +
pid->Kd * derivative;
}
// 应用示例
PID_Controller temp_pid = {2.0, 0.5, 1.0};
float output = PID_Calculate(&temp_pid, 40.0, current_temp);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, (uint32_t)(output * 10));
5. 洗涤模式实现
5.1 标准模式参数
| 阶段 | 时间(min) | 温度(℃) | 电机转速(RPM) |
|---|---|---|---|
| 洗涤 | 15 | 40 | 50 |
| 漂洗 | 5×2次 | 常温 | 60 |
| 脱水 | 3 | - | 1000 |
5.2 快洗模式优化
通过以下调整缩短总时长:
- 减少洗涤时间至8分钟
- 取消加热环节
- 单次漂洗3分钟
- 脱水时间缩短至2分钟
5.3 特殊面料模式
羊毛模式:
- 降低转速至30RPM
- 温度不超过30℃
- 取消脱水或仅低速脱水
强力去污模式:
- 延长洗涤至25分钟
- 提高温度至60℃
- 增加预浸泡环节
6. 异常处理机制
6.1 常见故障检测
- 门未关检测
- 使用微动开关检测门状态
- 门未关时禁止启动
c复制if (HAL_GPIO_ReadPin(DOOR_SW_GPIO) == GPIO_PIN_RESET) {
Trigger_Fault(DOOR_OPEN_FAULT);
}
-
电机堵转检测
- 监测电机电流(通过采样电阻+ADC)
- 或检测霍尔传感器信号是否变化
-
温度异常检测
- DS18B20读数超过安全阈值(如>80℃)
- 加热过程中温度上升过慢(可能加热管故障)
6.2 故障代码显示
设计4位LED数码管显示错误代码:
| 代码 | 含义 | 处理建议 |
|---|---|---|
| E001 | 门未关 | 检查门是否关紧 |
| E002 | 电机堵转 | 检查衣物是否卡住 |
| E003 | 温度传感器故障 | 检查传感器连接 |
| E004 | 进水超时 | 检查水压和进水阀 |
7. 通信接口设计
7.1 UART通信协议
定义简单ASCII协议与上位机通信:
code复制[命令格式]
$<CMD>,<PARAM1>,<PARAM2>*
[示例]
$MODE,1* // 设置模式1
$START* // 开始洗衣
$STATUS?* // 查询状态
7.2 WiFi模块集成
使用ESP-01S模块实现联网功能:
- 通过AT指令配置
- 与STM32通过UART通信
- 实现手机APP控制
典型接线:
code复制ESP-01S STM32
VCC → 3.3V
GND → GND
TX → PA3(RX)
RX → PA2(TX)
8. 系统优化技巧
8.1 电源管理优化
- 采用低功耗模式:
- 待机时进入STOP模式
- 通过RTC或外部中断唤醒
- 继电器电源控制:
- 不使用时切断继电器供电
- 减少待机功耗
8.2 软件滤波处理
- 按键消抖:
c复制// 延时50ms再次检测
if (HAL_GPIO_ReadPin(KEY_GPIO) == GPIO_PIN_RESET) {
HAL_Delay(50);
if (HAL_GPIO_ReadPin(KEY_GPIO) == GPIO_PIN_RESET) {
// 确认按键按下
}
}
- 温度采样滤波:
c复制#define SAMPLE_NUM 5
float temp_samples[SAMPLE_NUM];
float Get_Filtered_Temp(void) {
float sum = 0;
for (int i=0; i<SAMPLE_NUM-1; i++) {
temp_samples[i] = temp_samples[i+1];
sum += temp_samples[i];
}
temp_samples[SAMPLE_NUM-1] = DS18B20_ReadTemp();
sum += temp_samples[SAMPLE_NUM-1];
return sum / SAMPLE_NUM;
}
8.3 生产测试建议
- 自动化测试接口:
- 预留测试点连接治具
- 通过UART发送测试命令
- 老化测试项目:
- 连续运行24小时标准模式
- 模拟电网波动测试
- 高温高湿环境测试
9. 常见问题解决
9.1 电机干扰导致死机
现象:电机启动时MCU复位或程序跑飞
解决方案:
- 加强电源滤波:
- 电机电源与MCU电源完全隔离
- 增加大容量电解电容(如2200μF)
- 优化PCB布局:
- 电机驱动线路远离MCU
- 保证良好接地
9.2 温度读数不稳定
现象:DS18B20偶尔返回错误温度
排查步骤:
- 检查上拉电阻(4.7K必须准确)
- 缩短传感器导线长度
- 添加软件CRC校验
- 在初始化时检测传感器是否存在
9.3 通信中断问题
现象:WiFi模块经常断开连接
优化措施:
- 增加硬件流控(CTS/RTS)
- 降低波特率(从115200改为9600)
- 添加看门狗和重连机制
- 电源处增加100μF电容
10. 项目扩展方向
- 增加模糊控制算法:根据衣物重量(通过电机电流估算)自动调整水量和时间
- 添加语音交互功能:集成LD3320等语音识别芯片
- 开发节能模式:学习用户习惯,优化洗涤参数
- 实现OTA升级:通过WiFi远程更新固件
这个项目最让我满意的就是通过时间控制巧妙避开了水位检测的难题,实测表明在家庭环境下完全可行。当然,如果是商用洗衣机,还是建议增加水位检测以提高可靠性。整个开发过程中,最耗时的部分是PID参数的整定和抗干扰设计,这部分需要耐心反复测试。