Công nghệ

bạn có biết bo mạch máy giặt có những khối nào-chức năng là gì? và thuật toán điều khiển của máy giặt lồng ngang hoặc lồng đứng có cấu trúc như thế nào không?Nó có được tạo ra kiểu có cấu trúc module dễ bảo trì và phân tích lỗi hay không?

Written by lbtmicr06

Có, và đây là một chủ đề rất thú vị. Thực tế, nếu bạn mở bo mạch của một máy giặt hiện đại (Panasonic, LG, Samsung, Toshiba, Electrolux…), bạn sẽ thấy cách thiết kế của nó khá giống với một hệ thống nhúng (Embedded System) chuyên nghiệp chứ không phải chỉ là một chương trình Arduino viết nối tiếp.

Một firmware máy giặt tốt thường được chia thành rất nhiều module độc lập để dễ phát triển, bảo trì và sửa lỗi.


1. Cấu trúc phần cứng của bo mạch máy giặt

Một bo mạch thường chia thành các khối sau:

             AC220V
                │
        ┌───────┴────────┐
        │Nguồn Switching │
        └───────┬────────┘
                │5V/12V
                │
      ┌─────────┴─────────┐
      │      MCU          │
      │ STM32/Renesas/... │
      └─────────┬─────────┘
                │
────────────────┼──────────────────────
                │
      INPUT MODULES

 Door Lock
 Water Level
 Temperature
 Hall Sensor
 Current Sensor
 Keypad
 LCD/LED
 Rotary Encoder

────────────────┼──────────────────────
                │
      OUTPUT MODULES

 Motor Driver
 Water Valve
 Drain Pump
 Heater
 Door Lock
 Buzzer
 Display
 WiFi

Mỗi khối gần như độc lập.


2. Các module phần mềm

Firmware không viết kiểu:

loop()
{
    mở van

    quay motor

    xả nước

    ...
}

mà thường viết như:

main()

↓

Scheduler

↓

Task

↓

Module

Ví dụ

main()

↓

Task 10ms

↓

Motor Module

↓

Motor Driver

3. Ví dụ chia module

Module nguồn

Power.c

Power_Init()

Power_Check()

Power_Shutdown()

Module bàn phím

Key.c

Key_Scan()

Key_Process()

Key_GetEvent()

Không nơi nào khác đọc chân GPIO trực tiếp.

Tất cả đều hỏi

Key_GetEvent();

Module hiển thị

Display.c

Display_ShowTime()

Display_ShowError()

Display_ShowMode()

Display_Update()

Module cảm biến mực nước

WaterLevel.c

WaterLevel_Read()

WaterLevel_Filter()

WaterLevel_GetState()

Module nhiệt độ

TempSensor.c

Temp_Read()

Temp_Filter()

Temp_GetTemp()

Module động cơ

Đây là module lớn nhất.

Motor.c

Motor_Start()

Motor_Stop()

Motor_SetRPM()

Motor_Reverse()

Motor_Brake()

Motor_PID()

Motor_DetectJam()

Module van cấp nước

Valve.c

Valve_OpenCold()

Valve_OpenHot()

Valve_Close()

Module bơm

Pump.c

Pump_Start()

Pump_Stop()

Module khóa cửa

Door.c

Door_Lock()

Door_Unlock()

Door_IsLocked()

Module báo lỗi

Error.c

Error_Set()

Error_Clear()

Error_Display()

Ví dụ

E1

Không có nước
E2

Không khóa cửa
E3

Motor quá tải

4. Module điều khiển trung tâm

Đây mới là “bộ não”.

Ví dụ

WashController.c

Nó không điều khiển relay.

Nó chỉ gọi các module.

Ví dụ

Door_Lock();

Valve_Open();

Motor_Start();

Pump_Start();

...

5. Thuật toán điều khiển

Thông thường được viết dưới dạng State Machine.

Ví dụ

POWER ON

↓

IDLE

↓

WAIT START

↓

LOCK DOOR

↓

FILL WATER

↓

HEATING

↓

WASH

↓

DRAIN

↓

RINSE

↓

SPIN

↓

END

↓

UNLOCK

Mỗi trạng thái chỉ làm đúng một việc.

Ví dụ

STATE_FILL

↓

if(level==FULL)

↓

STATE_WASH

6. Một State còn chia nhỏ

Ví dụ

STATE_WASH

↓

SubState 1

Quay thuận

↓

SubState 2

Dừng

↓

SubState 3

Quay ngược

↓

SubState 4

Dừng

↓

Lặp

Như vậy chương trình rất rõ ràng.


7. Scheduler

Máy giặt không chạy bằng delay.

Thường có timer 1ms.

Ví dụ

1ms

↓

Scheduler

↓

Task 5ms

Task 10ms

Task 50ms

Task 100ms

Task 500ms

Task 1s

Ví dụ

5ms

↓

Đọc Hall

10ms

↓

Quét bàn phím

50ms

↓

Đọc ADC

100ms

↓

Điều khiển PID

1s

↓

Cập nhật thời gian còn lại

8. Có phải dùng module để dễ sửa lỗi không?

Đúng.

Ví dụ

Motor không quay.

Bạn không cần đọc toàn bộ 100.000 dòng code.

Chỉ xem

Motor.c

và

WashController.c

Nếu hiển thị sai

chỉ xem

Display.c

Nếu báo E2

chỉ xem

Door.c

9. Máy giặt hiện đại còn có lớp trừu tượng (HAL)

Firmware tốt thường còn chia thành:

Application

↓

Control

↓

Service

↓

HAL

↓

Driver

↓

GPIO

Ví dụ

Application gọi:

Motor_Start();

Motor module không biết relay hay PWM nằm chân nào.

Nó chỉ gọi:

HAL_Motor_SetPWM();

HAL mới điều khiển:

TIM3->CCR1=500;

Nhờ vậy khi đổi vi điều khiển (ví dụ từ Renesas sang STM32), phần lớn mã điều khiển nghiệp vụ không cần thay đổi.


10. Nếu là máy giặt Inverter thì sao?

Máy giặt Inverter có cấu trúc còn phức tạp hơn. Ngoài các module trên còn có:

  • Điều khiển động cơ bằng FOC (Field-Oriented Control) hoặc điều khiển vector.
  • Điều khiển biến tần với cầu công suất IGBT hoặc MOSFET ba pha.
  • PID tốc độ và PID dòng điện.
  • Phát hiện mất pha, quá dòng, quá áp, quá nhiệt.
  • Tự nhận dạng tải (quần áo ít/nhiều).
  • Cân bằng lồng giặt trước khi vắt tốc độ cao (dựa trên tín hiệu Hall, encoder hoặc thuật toán ước lượng).
  • Quản lý năng lượng và tối ưu chu trình giặt.

Góc nhìn dành cho dự án của bạn

Dựa trên các dự án Arduino mà bạn đã thực hiện (bộ điều khiển thời gian nhiều kênh, điều khiển relay bằng IR, menu LCD, RTC…), bạn đã tiếp cận đúng hướng của lập trình nhúng theo module. Nếu muốn nâng lên một mức chuyên nghiệp hơn, mình có thể hướng dẫn bạn xây dựng một firmware máy giặt mô phỏng theo kiến trúc công nghiệp, gồm khoảng 25–40 module (Scheduler, Event Queue, State Machine, Driver, HAL, Services, Controllers…), với cấu trúc gần giống firmware thực tế của các hãng điện tử. Đây là một bài học rất tốt để rèn kỹ năng thiết kế phần mềm nhúng có khả năng mở rộng và bảo trì.

Thường thì các module bàn phím và các cảm biến có trong máy giặt được kết nối với MCU qua các chuẩn kết nối i2c,uart,hay chuẩn nào

Đây là một câu hỏi rất hay. Câu trả lời là: không có một chuẩn duy nhất. Trong máy giặt, các cảm biến và thiết bị ngoại vi được kết nối với MCU bằng nhiều chuẩn khác nhau, tùy theo tốc độ, giá thành, khả năng chống nhiễu và yêu cầu an toàn.

Có thể hình dung như sau:

                  MCU
                   │
   ┌───────────────┼────────────────┐
   │               │                │
 GPIO           ADC Input      Communication
   │               │                │
   │               │         ┌──────┴─────────┐
   │               │         │                │
 Digital      Analog Sensor  I2C/SPI/UART/CAN

1. GPIO – phổ biến nhất

Khoảng 70-80% tín hiệu trong máy giặt chỉ là GPIO.

Ví dụ:

Công tắc cửa

Door Switch

ON/OFF

↓

GPIO

MCU chỉ đọc

if(DoorSwitch == ON)

Phao chống tràn

Float Switch

↓

GPIO

Nút bấm

Button

↓

GPIO

Relay feedback

Relay Contact

↓

GPIO

2. ADC (Analog)

Các cảm biến đo liên tục thường nối vào ADC.

Ví dụ:

Cảm biến nhiệt NTC

5V

 │
NTC
 │
R
 │
GND

↓

ADC

MCU đo điện áp

↓

đổi sang nhiệt độ.


Cảm biến áp suất nước (Pressure Sensor)

Một số máy dùng

0.5V

↓

4.5V

MCU đọc bằng ADC.


Cảm biến dòng

Current Sensor

↓

ADC

3. Input Capture / Counter

Động cơ inverter thường có Hall Sensor.

Ví dụ

Hall A

Hall B

Hall C

↓

GPIO Interrupt

hoặc

Timer Capture

để đo RPM.


4. PWM

PWM chủ yếu dùng để điều khiển:

  • Motor
  • Van tỷ lệ
  • Quạt
  • Biến tần

Ví dụ

MCU PWM

↓

IGBT Driver

5. I²C

I²C được dùng khá nhiều nhưng không phải để nối tất cả cảm biến.

Thường dùng cho:

EEPROM

MCU

↓

24C02

24C04

24C64

RTC

DS1307

DS3231

LCD Driver

Ví dụ

PCF8574

↓

LCD

IO Expander

Ví dụ

PCF8575

↓

16 Input

Cảm biến thông minh

Một số cảm biến nhiệt độ số

LM75

↓

I2C

6. SPI

Ít gặp hơn I²C.

Thường dùng khi cần tốc độ cao.

Ví dụ

External Flash

↓

SPI

LCD TFT

SPI LCD

7. UART

UART chủ yếu dùng cho:

Debug

MCU

↓

TX RX

↓

PC

Trong nhà máy, kỹ sư cắm cáp UART để xem log.

Ví dụ

STATE=WASH

RPM=800

TEMP=42

LEVEL=FULL

Module WiFi

ESP8266

↓

UART

Bluetooth

HC-05

↓

UART

8. CAN

Máy giặt dân dụng ít dùng.

Nhưng máy công nghiệp có thể dùng CAN để kết nối:

  • Board điều khiển
  • Board inverter
  • Màn hình HMI

9. RS485

Một số máy giặt công nghiệp lớn dùng

MCU

↓

RS485

↓

HMI

hoặc kết nối nhiều máy.


10. Board Inverter thường giao tiếp với MCU như thế nào?

Đây là phần khá thú vị.

Máy giặt inverter thường chia thành hai board:

Main Board

↓

Communication

↓

Inverter Board

Chuẩn giao tiếp có thể là:

  • UART
  • SPI
  • I²C
  • PWM + Feedback
  • Giao thức nối tiếp độc quyền của nhà sản xuất

Ví dụ:

Main MCU

↓

UART

↓

Motor MCU

Main MCU gửi

RUN

800 RPM

CW

Motor MCU trả lời

RPM=798

CURRENT=1.4A

OK

11. Vì sao không dùng I²C cho mọi thứ?

Có ba lý do chính:

Thứ nhất: chống nhiễu. Máy giặt có động cơ, bơm, van điện từ và biến tần tạo ra rất nhiều nhiễu điện từ. Một công tắc cửa nối GPIO đơn giản thường ổn định và dễ bảo vệ hơn một cảm biến số đặt trên bus I²C.

Thứ hai: chi phí. Một công tắc cơ chỉ cần hai dây nối vào GPIO. Nếu dùng I²C, mỗi thiết bị phải có mạch điều khiển và địa chỉ riêng, làm tăng giá thành.

Thứ ba: độ tin cậy. Nếu một thiết bị trên bus I²C bị treo và giữ đường SDA hoặc SCL ở mức thấp, toàn bộ bus có thể ngừng hoạt động. Trong khi đó, nếu một công tắc nối GPIO bị hỏng, các cảm biến khác vẫn hoạt động bình thường.


12. Kiến trúc của máy giặt hiện đại

Một firmware điển hình có thể được tổ chức như sau:

                MCU
                 │
 ┌───────────────┼────────────────────┐
 │               │                    │
GPIO            ADC              Communication
 │               │                    │
 │               │          ┌─────────┼─────────┐
 │               │          │         │         │
Door         NTC Temp      I²C      UART      SPI
Level Sw     Pressure      EEPROM   WiFi      Flash
Keys         Current       RTC      Debug     LCD

                 │
          Hardware Drivers
                 │
        Sensor Abstraction Layer
                 │
          Control Algorithms
                 │
           State Machine
                 │
          Wash Program Logic

Đây cũng là cách thiết kế mà các hãng điện tử lớn áp dụng: phần cứng được trừu tượng hóa (Hardware Abstraction Layer – HAL), sau đó các thuật toán chỉ làm việc với các module như Door_IsClosed(), WaterLevel_Get(), Motor_SetRPM() mà không cần biết cảm biến đang kết nối qua GPIO, ADC hay I²C.

Theo những trao đổi trước đây về các dự án Arduino của bạn, mình nghĩ chủ đề này rất phù hợp. Nếu bạn muốn học cách viết firmware theo phong cách công nghiệp, mình có thể hướng dẫn xây dựng một firmware máy giặt mô phỏng (không điều khiển phần cứng thật) với khoảng 30 module, scheduler, state machine, HAL và driver, gần giống cách các hãng như LG, Samsung hay Electrolux tổ chức mã nguồn. Điều đó sẽ giúp bạn hiểu rõ cách một dự án nhúng lớn được thiết kế và bảo trì.

 

About the author

lbtmicr06

Leave a Comment