Chống dội nút nhấn bằng Finite State Machine trong STM32F103 – Lập trình STM32F103 thanh ghi

Phương pháp Finite State Machine (FSM) giúp mô hình hóa nút nhấn thành các trạng thái rõ ràng: IDLE → PRESSING → PRESSED → RELEASING → RELEASED, mỗi trạng thái có thời gian debounce riêng (thường 20ms) để xác nhận tín hiệu ổn định.

Trong lập trình vi điều khiển STM32F103 bằng thanh ghi, xử lý hiện tượng dội nút nhấn (button bounce) là một bước quan trọng để đảm bảo hệ thống nhận đúng sự kiện. Dao động cơ học khi nhấn hoặc thả nút có thể gây ra nhiều lần nhấn giả, dẫn đến lỗi như đếm sai hoặc LED nhấp nháy liên tục.

Phương pháp 4: Máy trạng thái hữu hạn (Finite State Machine – FSM)

Dao động từ nút nhấn có thể gây nhầm lẫn giữa các lần nhấn thực sự và nhiễu. State Machine giúp hệ thống phân biệt rõ ràng từng giai đoạn (nhấn, giữ, thả), tránh lỗi khi xử lý các sự kiện liên quan đến nút.

Nguyên lý hoạt động và sơ đồ chống dội nút nhấn bằng Finite State Machine

Nguyên lý

Dưới đây là các trạng thái máy trong phương pháp chống dội nút nhấn dùng State Machine:

  • STATE_IDLE: Nút chưa được nhấn. Khi tín hiệu = 1 → chuyển sang PRESSING.
  • STATE_PRESSING: Nếu tín hiệu vẫn = 1 → giảm bộ đếm. Khi hết thời gian → chuyển sang PRESSED.
  • STATE_PRESSED: Khi tín hiệu = 0 → chuyển sang RELEASING.
  • STATE_RELEASING: Nếu tín hiệu vẫn = 0 → giảm bộ đếm. Khi hết thời gian → chuyển sang RELEASED.
  • STATE_RELEASED: Quay lại IDLE, sẵn sàng chu kỳ mới.

Mỗi trạng thái có thời gian debounce riêng (20 ms) để xác nhận tín hiệu.

Sơ đồ (flow chart) phương pháp chống dội nút nhấn bằng Finite State Machine

Lập trình stm32f103 thanh ghi- Phương pháp 4: Máy trạng thái hữu hạn (Finite State Machine – FSM)
Lập trình stm32f103 thanh ghi- Phương pháp 4: Máy trạng thái hữu hạn (Finite State Machine – FSM)

Cách triển khai trong STM32F103

Sử dụng struct để lưu trạng thái nút, thời gian debounce và trạng thái logic.

Hàm ProcesButton() xử lý chuyển trạng thái theo tín hiệu đầu vào.

Chương trình main chống dội nút nhấn bằng Finite State machine

Trong main(), kiểm tra sự thay đổi trạng thái để xử lý hành động (ví dụ: LED_Toggle()).

Chương trình chống dội nút nhấn bằng phương pháp State Machine hoạt động như sau:

  • STATE_IDLE: Nút chưa được nhấn. Khi tín hiệu = 1, chuyển sang PRESSING và khởi động bộ đếm 20ms.
  • STATE_PRESSING: Nếu tín hiệu vẫn = 1, giảm bộ đếm. Khi bộ đếm = 0, chuyển sang PRESSED và gán keyState = 1. Nếu tín hiệu = 0, quay lại IDLE.
  • STATE_PRESSED: Khi tín hiệu = 0, chuyển sang RELEASING với bộ đếm 20ms.
  • STATE_RELEASING: Nếu tín hiệu = 0 và bộ đếm = 0, chuyển sang RELEASED, gán keyState = 0. Nếu tín hiệu = 1, quay lại PRESSED.
  • STATE_RELEASED: Quay lại IDLE, sẵn sàng chu kỳ mới.
  • Ví dụ: Khi nhấn nút, hệ thống chờ 20ms để xác nhận PRESSED, sau đó chờ thêm 20ms khi thả để xác nhận RELEASED, bỏ qua dao động trong quá trình.

Link Github: Download chương trình chống dội nút nhấn bằng Finite State Machine

Ưu điểm phương pháp chống dội nút nhấn bằng Finite State machine

  • Chính xác cao → loại bỏ nhiễu hiệu quả.
  • Dễ mở rộng → hỗ trợ nhấn giữ, nhấn đôi, auto-repeat.
  • Phù hợp hệ thống phức tạp → dễ tích hợp vào FSM tổng thể.

Nhược điểm phương pháp chống dội nút nhấn bằng Finite State machine

  • Code phức tạp hơn → cần quản lý nhiều trạng thái.
  • Tốn RAM và CPU hơn → do lưu biến trạng thái và bộ đếm.

So sánh: FSM vs. Đếm thời gian ổn định

Tiêu chí⏱️ Đếm thời gian ổn định (Time-based)🔁 Máy trạng thái hữu hạn (FSM)
Nguyên lý hoạt độngĐếm thời gian tín hiệu không thay đổiMô hình hóa nút nhấn thành các trạng thái
Độ chính xácTốtRất cao
Khả năng mở rộngHạn chế (khó xử lý nhấn giữ, nhấn đôi)Dễ dàng mở rộng nhiều kiểu nhấn
Phù hợp hệ thống phức tạpTrung bìnhRất phù hợp
Tài nguyên sử dụngÍt hơnNhiều hơn (RAM, CPU)
Độ phức tạp codeTrung bìnhCao hơn
Điều chỉnh thời gian debounceDễ dàng bằng giá trị đếmLinh hoạt theo từng trạng thái
Ứng dụng phù hợpThiết bị đơn giản, không yêu cầu đa trạng tháiThiết bị công nghiệp, giao diện người dùng

Kết luận

Phương pháp chống dội nút nhấn bằng Finite State Machine (FSM) trong hướng dẫn lập trình STM32F103 thanh ghi là giải pháp mạnh mẽ và chính xác nhất trong các kỹ thuật phần mềm xử lý nút nhấn. Bằng cách mô hình hóa từng giai đoạn của nút nhấn thành các trạng thái riêng biệt, FSM giúp hệ thống phân biệt rõ ràng giữa nhấn, giữ và thả, đồng thời loại bỏ nhiễu một cách hiệu quả.

Dù có độ phức tạp cao hơn và tiêu tốn tài nguyên hơn so với các phương pháp đơn giản như delay hay đếm thời gian ổn định, FSM lại vượt trội về khả năng mở rộng và độ tin cậy. Đây là lựa chọn lý tưởng cho các hệ thống nhúng phức tạp, giao diện người dùng, hoặc ứng dụng công nghiệp yêu cầu xử lý đa trạng thái như nhấn giữ, nhấn đôi, auto-repeat.

👉 Nếu bạn đang phát triển một hệ thống có nhiều nút chức năng hoặc yêu cầu phản hồi chính xác, FSM là phương pháp chống dội đáng cân nhắc nhất.

Viết một bình luận

This site uses Akismet to reduce spam. Learn how your comment data is processed.