1. 智能洗衣机控制系统概述
作为一名家电控制领域的工程师,我最近参与了一个滚筒洗衣机控制系统的开发项目。这个看似普通的家电产品,其内部控制系统远比大多数人想象的复杂得多。现代智能洗衣机已经发展成为一个集成了多种传感器、执行器和复杂算法的机电一体化系统。
洗衣机控制系统的主要功能是根据用户选择的洗涤程序,自动完成进水、洗涤、漂洗、脱水等一系列操作。系统需要实时监测水位、温度、衣物重量等参数,并精确控制电机转速、加热功率、阀门开关等执行机构。整个过程涉及到信号采集、数据处理、状态机控制、安全保护等多个技术环节。
2. 系统整体架构设计
2.1 硬件架构组成
典型的智能洗衣机控制系统采用分层架构设计,主要包含以下几个部分:
-
用户交互层:包括触摸屏/LED显示屏、旋钮按键、WiFi/蓝牙模块等,负责与用户进行交互。
-
主控MCU:通常采用STM32或ESP32等微控制器,作为系统的"大脑",负责运行控制算法、处理传感器数据、驱动执行机构。
-
传感器层:包含水位传感器、温度传感器、称重传感器、门锁检测等,用于实时监测洗衣机的工作状态。
-
执行器层:包括变频电机、进水阀、排水泵、加热器等,负责执行具体的洗涤动作。
-
电源管理:提供系统所需的电源转换、过流保护等功能。
2.2 典型硬件配置
以10kg滚筒洗衣机为例,常见的硬件配置如下:
- 主控芯片:STM32F103或ESP32
- 电机:BLDC变频电机,转速范围300-1400rpm
- 加热器:1800-2000W PTC或电热管
- 进水阀:2个电磁阀(冷水和热水)
- 排水泵:30-40W
- 水位传感器:气压式
- 温度传感器:NTC 10K热敏电阻
3. 传感器系统详解
3.1 水位检测系统
3.1.1 气压式水位传感器原理
洗衣机中最常用的水位传感器是气压式传感器,其工作原理如下:
- 传感器通过一根气管与洗衣桶底部相连
- 随着水位上升,气管内的气压增大
- 压力传感器检测气压变化并转换为电信号
- 主控MCU通过ADC采样获取水位信息
这种设计避免了传感器与水直接接触,提高了可靠性和使用寿命。
3.1.2 水位检测软件实现
水位检测的软件实现主要包括以下几个部分:
-
ADC采样:通过STM32的ADC模块读取传感器输出的模拟电压
-
数字滤波:采用滑动平均滤波算法消除噪声干扰
c复制// 滑动平均滤波实现
uint16_t water_level_read_filtered(void)
{
// 读取ADC原始值
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 10);
uint16_t adc_value = HAL_ADC_GetValue(&hadc1);
// 更新滤波缓冲区
water_state.adc_buffer[water_state.buffer_index] = adc_value;
water_state.buffer_index = (water_state.buffer_index + 1) % water_config.filter_samples;
// 计算平均值
uint32_t sum = 0;
for (int i = 0; i < water_config.filter_samples; i++) {
sum += water_state.adc_buffer[i];
}
water_state.filtered_adc = sum / water_config.filter_samples;
return water_state.filtered_adc;
}
- 线性映射:将ADC值转换为实际水位高度
c复制uint16_t water_level_get_mm(void)
{
uint16_t adc = water_level_read_filtered();
// 线性映射计算
if (adc <= water_config.adc_min) {
water_state.water_level_mm = 0;
} else if (adc >= water_config.adc_max) {
water_state.water_level_mm = WATER_LEVEL_FULL;
} else {
water_state.water_level_mm = (uint16_t)(
(adc - water_config.adc_min) * WATER_LEVEL_FULL /
(water_config.adc_max - water_config.adc_min)
);
}
return water_state.water_level_mm;
}
- 水量计算:根据水位高度计算实际水量
c复制float water_level_get_volume(void)
{
uint16_t level_mm = water_level_get_mm();
const float drum_radius = 0.24f; // 内筒半径240mm
const float drum_length = 0.45f; // 内筒深度450mm
float h = level_mm / 1000.0f; // 转换为米
float R = drum_radius;
float L = drum_length;
if (h <= 0) return 0;
if (h >= 2 * R) h = 2 * R;
float ratio = (R - h) / R;
if (ratio > 1) ratio = 1;
if (ratio < -1) ratio = -1;
// 圆柱形水量计算公式
float area = R * R * acosf(ratio) - (R - h) * sqrtf(2 * R * h - h * h);
float volume = area * L * 1000; // 转换为升
water_state.water_volume_L = volume;
return volume;
}
3.1.3 水位检测注意事项
-
校准问题:每次安装新传感器或维修后都需要进行空桶和满水校准
-
气管维护:气管必须保持干燥、无折弯,否则会影响检测精度
-
滤波参数:滤波采样数需要根据实际情况调整,过多会导致响应迟钝,过少会降低抗干扰能力
-
溢出检测:必须设置溢出阈值,防止水位过高导致漏水
3.2 温度检测系统
3.2.1 NTC温度传感器原理
洗衣机中通常使用NTC(负温度系数)热敏电阻来检测水温,其特点如下:
- 电阻值随温度升高而降低
- 典型参数:25°C时10KΩ,B值3950
- 精度较高,成本低,适合家电应用
3.2.2 温度检测软件实现
温度检测的软件实现主要包括以下步骤:
-
ADC采样:读取NTC分压电路的输出电压
-
电阻值计算:
c复制// 计算NTC电阻值
if (voltage >= config->vref - 0.01f) {
ntc->resistance = 1000000; // 开路
} else if (voltage <= 0.01f) {
ntc->resistance = 0; // 短路
} else {
ntc->resistance = config->r_series * voltage / (config->vref - voltage);
}
- 温度转换:使用Steinhart-Hart方程将电阻值转换为温度
c复制// Steinhart-Hart方程温度计算
if (ntc->resistance > 0) {
float ln_ratio = logf(ntc->resistance / config->r_ref);
float inv_t = 1.0f / config->t_ref + ln_ratio / config->beta;
ntc->temperature = (1.0f / inv_t) - 273.15f; // 转摄氏度
} else {
ntc->temperature = 150.0f; // 异常高温
}
- 数字滤波:采用一阶低通滤波消除噪声
c复制// 一阶低通滤波
static float alpha = 0.1f;
ntc->filtered_temp = ntc->filtered_temp * (1 - alpha) + ntc->temperature * alpha;
3.2.3 温度检测注意事项
-
NTC选型:要根据实际温度范围选择合适的B值和R25值
-
分压电阻:串联电阻值应与NTC在中间温度时的阻值相近
-
滤波参数:α值需要根据温度变化速度调整,加热过程中可以适当减小
-
故障检测:需要检测开路和短路情况,防止传感器失效导致系统异常
3.3 称重系统
3.3.1 称重传感器原理
现代洗衣机通常配备称重功能,用于:
- 自动判断衣物重量
- 智能推荐水位和洗涤时间
- 平衡检测(脱水阶段)
常见的实现方式是使用应变片+HX711 ADC的方案。
3.3.2 称重软件实现
称重功能的软件实现主要包括:
- HX711驱动:读取24位ADC原始值
c复制int32_t hx711_read_raw(void)
{
// 等待数据准备好
while (HAL_GPIO_ReadPin(hx711_config.dout_port, hx711_config.dout_pin));
int32_t value = 0;
// 读取24位数据
for (int i = 0; i < 24; i++) {
HAL_GPIO_WritePin(hx711_config.sck_port, hx711_config.sck_pin, GPIO_PIN_SET);
value = value << 1;
HAL_GPIO_WritePin(hx711_config.sck_port, hx711_config.sck_pin, GPIO_PIN_RESET);
if (HAL_GPIO_ReadPin(hx711_config.dout_port, hx711_config.dout_pin)) {
value++;
}
}
// 符号扩展
if (value & 0x800000) {
value |= 0xFF000000;
}
return value;
}
- 重量计算:将ADC值转换为实际重量
c复制float weight_read_kg(void)
{
// 多次采样取平均
int32_t sum = 0;
const int samples = 10;
for (int i = 0; i < samples; i++) {
sum += hx711_read_raw();
HAL_Delay(10);
}
weight_state.raw_value = sum / samples;
weight_state.weight_g = (weight_state.raw_value - hx711_config.offset) * hx711_config.scale;
weight_state.weight_kg = weight_state.weight_g / 1000.0f;
// 稳定性判断
static float last_weight = 0;
weight_state.stable = (fabsf(weight_state.weight_kg - last_weight) < 0.1f);
last_weight = weight_state.weight_kg;
return weight_state.weight_kg;
}
- 水位推荐:根据衣物重量自动推荐合适水位
c复制WaterLevel_t weight_recommend_water_level(float weight_kg)
{
if (weight_kg < 2.0f) {
return WATER_LEVEL_LOW;
} else if (weight_kg < 4.0f) {
return WATER_LEVEL_MEDIUM;
} else if (weight_kg < 6.0f) {
return WATER_LEVEL_HIGH;
} else {
return WATER_LEVEL_FULL;
}
}
3.3.3 称重系统注意事项
-
校准问题:必须定期进行零点校准和量程校准
-
安装位置:传感器安装位置要合理,确保受力均匀
-
振动干扰:洗涤过程中会产生振动,需要在静止状态下称重
-
防潮处理:传感器要做好防水防潮处理
3.4 门锁检测系统
3.4.1 门锁系统组成
洗衣机门锁系统通常包括:
- 门开关检测(微动开关)
- 电磁门锁机构
- 锁舌到位检测开关
3.4.2 门锁控制实现
门锁状态的检测和控制逻辑:
c复制DoorState_t door_get_state(void)
{
// 读取门开关
door_state.switch_closed = !HAL_GPIO_ReadPin(
door_config.switch_port, door_config.switch_pin
);
// 读取锁舌状态
door_state.lock_engaged = !HAL_GPIO_ReadPin(
door_config.feedback_port, door_config.feedback_pin
);
if (!door_state.switch_closed) {
door_state.state = DOOR_STATE_OPEN;
} else if (door_state.lock_engaged) {
door_state.state = DOOR_STATE_LOCKED;
} else {
door_state.state = DOOR_STATE_CLOSED;
}
return door_state.state;
}
int door_lock(void)
{
// 检查门是否关闭
if (!door_state.switch_closed) {
return -1; // 门未关
}
// 启动电磁锁
HAL_GPIO_WritePin(door_config.lock_port, door_config.lock_pin, GPIO_PIN_SET);
door_state.lock_time = HAL_GetTick();
// 等待锁舌到位 (最多3秒)
while (!door_state.lock_engaged &&
(HAL_GetTick() - door_state.lock_time) < 3000) {
door_get_state();
HAL_Delay(100);
}
if (!door_state.lock_engaged) {
// 锁定失败
HAL_GPIO_WritePin(door_config.lock_port, door_config.lock_pin, GPIO_PIN_RESET);
door_state.lock_failed = 1;
return -2;
}
door_state.state = DOOR_STATE_LOCKED;
return 0;
}
3.4.3 门锁安全注意事项
-
高温保护:水温高于55°C时禁止解锁
-
旋转保护:电机运转时禁止解锁
-
超时保护:锁定操作要在规定时间内完成
-
断电保护:断电后应能手动解锁
4. 执行器控制系统
4.1 变频电机驱动
4.1.1 BLDC电机控制原理
滚筒洗衣机通常采用BLDC(无刷直流)电机,具有以下特点:
- 高效率、低噪音
- 宽转速范围(30-1400rpm)
- 需要专门的驱动电路和算法
4.1.2 电机控制软件实现
电机控制的主要功能包括:
- 转速检测:通过霍尔传感器计算实际转速
c复制uint16_t motor_read_rpm(void)
{
// 读取霍尔脉冲频率
uint32_t hall_freq = __HAL_TIM_GET_COUNTER(motor_config.htim_hall);
__HAL_TIM_SET_COUNTER(motor_config.htim_hall, 0);
// 频率转RPM
if (hall_freq > 0) {
motor_state.actual_rpm = (hall_freq * 60) / (motor_config.pole_pairs * 6);
} else {
motor_state.actual_rpm = 0;
}
return motor_state.actual_rpm;
}
- PID控制:实现转速闭环控制
c复制float motor_pid_control(uint16_t target_rpm, uint16_t actual_rpm, float dt)
{
float error = (float)target_rpm - (float)actual_rpm;
// 比例项
float p_term = motor_config.kp * error;
// 积分项 (带限幅)
motor_state.integral += error * dt;
if (motor_state.integral > 100) motor_state.integral = 100;
if (motor_state.integral < -100) motor_state.integral = -100;
float i_term = motor_config.ki * motor_state.integral;
// 微分项
float d_term = motor_config.kd * (error - motor_state.last_error) / dt;
motor_state.last_error = error;
// 输出
float output = p_term + i_term + d_term;
// 限幅
if (output > 100) output = 100;
if (output < 0) output = 0;
return output;
}
- 软启动:通过加速度限制实现平稳启动
c复制// 加速度限制 (软启动)
static uint16_t ramped_target = 0;
float max_delta = motor_config.max_accel * dt;
if (motor_state.target_rpm > ramped_target) {
ramped_target += (uint16_t)max_delta;
if (ramped_target > motor_state.target_rpm) {
ramped_target = motor_state.target_rpm;
}
} else if (motor_state.target_rpm < ramped_target) {
if (ramped_target > max_delta) {
ramped_target -= (uint16_t)max_delta;
} else {
ramped_target = 0;
}
}
4.1.3 电机控制注意事项
-
PID参数整定:需要根据实际电机特性调整KP、KI、KD参数
-
加速度限制:洗涤和脱水阶段的加速度限制值不同
-
堵转检测:要检测电机堵转情况并及时停机保护
-
过流保护:需要监测电机电流,防止过载损坏
4.2 加热控制系统
4.2.1 加热控制原理
洗衣机加热系统通常采用PTC加热器或电热管,控制方式包括:
- 继电器开关控制(低成本方案)
- 可控硅相位控制(精确控温)
4.2.2 温度控制实现
温度控制的主要逻辑:
c复制void heater_control_loop(void)
{
// 读取温度
heater_state.current_temp = get_water_temperature();
heater_state.heater_temp = get_heater_temperature();
// 过热保护检查
if (heater_state.heater_temp > heater_config.temp_threshold_high) {
heater_state.overtemp = 1;
heater_set(0);
return;
}
// 过热恢复
if (heater_state.overtemp &&
heater_state.heater_temp < heater_config.temp_threshold_low) {
heater_state.overtemp = 0;
}
if (!heater_state.enabled) {
heater_set(0);
return;
}
// 滞环控制
float hysteresis = 2.0f; // 2度滞环
if (heater_state.current_temp < heater_state.target_temp - hysteresis) {
heater_set(1);
} else if (heater_state.current_temp > heater_state.target_temp + hysteresis) {
heater_set(0);
}
}
4.2.3 加热控制注意事项
-
温度梯度:加热速度不宜过快,防止局部过热
-
干烧保护:必须在水位足够时才能启动加热
-
热惯性补偿:加热器关闭后仍有残余热量,需要提前控制
-
节能考虑:可以根据衣物量调整加热功率
4.3 进水排水控制
4.3.1 进水控制实现
进水控制的主要功能:
c复制int fill_water_to_level(WaterLevel_t target, uint32_t timeout_ms)
{
uint32_t start = HAL_GetTick();
inlet_valve_set(INLET_VALVE_COLD);
while (!water_level_reached(target)) {
// 超时检查
if (HAL_GetTick() - start > timeout_ms) {
inlet_valve_set(INLET_VALVE_NONE);
return -1; // 进水超时
}
// 溢出检查
if (water_level_overflow()) {
inlet_valve_set(INLET_VALVE_NONE);
return -2; // 溢出
}
HAL_Delay(100);
}
inlet_valve_set(INLET_VALVE_NONE);
return 0;
}
4.3.2 排水控制实现
排水控制的主要功能:
c复制int drain_water(uint32_t timeout_ms)
{
uint32_t start = HAL_GetTick();
drain_pump_set(1);
while (water_level_get_mm() > 10) { // 允许少量残留
if (HAL_GetTick() - start > timeout_ms) {
drain_pump_set(0);
return -1; // 排水超时
}
HAL_Delay(100);
}
// 多排几秒确保排干
HAL_Delay(5000);
drain_pump_set(0);
return 0;
}
4.3.3 进水排水注意事项
-
阀门寿命:电磁阀有动作次数限制,不宜频繁开关
-
水压影响:进水速度受水压影响,超时时间要合理设置
-
排水堵塞:要检测排水泵是否正常工作,防止堵塞
-
节能考虑:可以根据衣物量调整进水量
5. 洗涤模式设计与实现
5.1 洗涤模式参数定义
洗涤程序通常由多个阶段组成,每个阶段的参数定义如下:
c复制typedef struct {
WashPhase_t phase; // 阶段类型
WaterLevel_t water_level; // 水位
float water_temp; // 水温
uint16_t motor_rpm; // 电机转速
uint16_t rotate_time_ms; // 旋转时间
uint16_t pause_time_ms; // 暂停时间
uint32_t duration_ms; // 阶段持续时间
uint8_t drain_after; // 结束后排水
uint8_t add_detergent; // 是否投放洗涤剂
uint8_t gentle_mode; // 轻柔模式
} WashPhaseConfig_t;
5.2 标准洗涤模式示例
以下是一个标准洗涤模式的配置示例:
c复制static const WashProgram_t PROGRAM_STANDARD = {
.name = "标准洗",
.num_phases = 5,
.phases = {
// 预洗
{
.phase = WASH_PHASE_PREWASH,
.water_level = WATER_LEVEL_MEDIUM,
.water_temp = 0, // 冷水
.motor_rpm = 45,
.rotate_time_ms = 10000,
.pause_time_ms = 3000,
.duration_ms = 5 * 60 * 1000,
.drain_after = 1,
.add_detergent = 0,
.gentle_mode = 0
},
// 主洗
{
.phase = WASH_PHASE_MAIN_WASH,
.water_level = WATER_LEVEL_MEDIUM,
.water_temp = 40, // 40度
.motor_rpm = 50,
.rotate_time_ms = 15000,
.pause_time_ms = 5000,
.duration_ms = 15 * 60 * 1000,
.drain_after = 1,
.add_detergent = 1,
.gentle_mode = 0
},
// 漂洗1
{
.phase = WASH_PHASE_RINSE,
.water_level = WATER_LEVEL_HIGH,
.water_temp = 0,
.motor_rpm = 45,
.rotate_time_ms = 10000,
.pause_time_ms = 3000,
.duration_ms = 8 * 60 * 1000,
.drain_after = 1,
.add_detergent = 0,
.gentle_mode = 0
},
// 漂洗2
{
.phase = WASH_PHASE_RINSE,
.water_level = WATER_LEVEL_HIGH,
.water_temp = 0,
.motor_rpm = 45,
.rotate_time_ms = 10000,
.pause_time_ms = 3000,
.duration_ms = 8 * 60 * 1000,
.drain_after = 1,
.add_detergent = 0,
.gentle_mode = 0
},
// 脱水
{
.phase = WASH_PHASE_SPIN,
.water_level = WATER_LEVEL_EMPTY,
.water_temp = 0,
.motor_rpm = 1000,
.rotate_time_ms = 0,
.pause_time_ms = 0,
.duration_ms = 5 * 60 * 1000,
.drain_after = 0,
.add_detergent = 0,
.gentle_mode = 0
}
},
.spin_rpm = 1000,
.spin_duration_ms = 5 * 60 * 1000,
.rinse_count = 2,
.estimated_time_min = 45,
.suitable_for = "棉质、亚麻等普通衣物",
.allow_pause = 1,
.night_mode = 0,
.eco_mode = 0
};
5.3 洗涤状态机实现
洗涤程序的控制通常采用状态机实现,基本流程如下:
- 初始化阶段:检测门锁、称重、推荐水位
- 进水阶段:根据推荐水位进水
- 洗涤阶段:按照设定的转速和时间运行电机
- 排水阶段:排空洗涤水
- 漂洗阶段:重复进水-洗涤-排水过程
- 脱水阶段:高速旋转去除水分
- 结束阶段:解锁门锁、发出提示音
6. 常见问题与解决方案
6.1 水位检测异常
问题现象:
- 水位检测不准确
- 水位显示波动大
- 无法检测到水位变化
可能原因:
- 气管漏气或堵塞
- 传感器校准参数错误
- 滤波参数设置不合理
- ADC参考电压不稳定
解决方案:
- 检查气管连接是否牢固,有无折弯
- 重新进行空桶和满水校准
- 调整滤波采样数和滤波算法
- 检查电源稳定性,必要时增加参考电压基准
6.2 电机控制问题
问题现象:
- 电机启动困难
- 转速不稳定
- 脱水时振动大
可能原因:
- PID参数设置不当
- 霍尔传感器故障
- 电机驱动电路问题
- 负载不平衡
解决方案:
- 重新整定PID参数
- 检查霍尔传感器连接和信号
- 测试驱动电路各点波形
- 增加脱水前的平衡检测过程
6.3 温度控制异常
问题现象:
- 水温达不到设定值
- 温度波动大
- 过热保护频繁触发
可能原因:
- 加热器功率不足
- NTC传感器故障
- 控制算法参数不当
- 水位不足导致干烧
解决方案:
- 检查加热器电阻值是否符合规格
- 校准或更换NTC传感器
- 调整滞环控制参数
- 确保水位足够后再启动加热
6.4 通信故障
问题现象:
- 触摸屏无响应
- WiFi连接不稳定
- 显示信息错误
可能原因:
- 通信线路接触不良
- 电磁干扰
- 协议解析错误
- 电源噪声
解决方案:
- 检查各连接器是否牢固
- 增加通信线屏蔽措施
- 检查通信协议实现
- 优化电源滤波电路
7. 开发经验分享
在实际开发洗衣机控制系统的过程中,我积累了一些有价值的经验:
-
传感器校准:所有传感器都必须设计校准流程,并在生产线上执行。特别是水位传感器,每个机器的特性可能略有不同。
-
安全优先:家电产品必须把安全性放在第一位。门锁、过热、过流等保护功能要设计完善,并通过各种异常测试。
-
状态机设计:洗涤程序的状态机要设计清晰,状态转换条件明确,并考虑各种异常情况的处理。
-
功耗优化:洗衣机通常有节能要求,可以通过优化电机控制算法、加热策略等降低能耗。
-
用户体验:操作界面要简洁明了,程序选择要符合用户习惯,提示信息要明确有用。
-
生产测试:要开发完善的生产测试程序,确保每个出厂产品都经过严格测试。
-
故障诊断:设计完善的故障诊断系统,便于售后维修。可以记录历史故障代码,提供详细的故障信息。
-
EMC设计:洗衣机电机功率大,电磁干扰强,PCB设计时要特别注意EMC问题。