Các phương pháp chống dội nút nhấn trong STM32F103 – Lập trình STM32F103 thanh ghi

Bài viết hôm nay sẽ giới thiệu sơ qua về các “phương pháp chống dội nút nhấn trong STM32F103“. Những bài viết tiếp theo sẽ tập trung vào từng phương pháp một.

Trong hướng dẫn lập trình STM32F103, đặc biệt khi làm việc ở mức thanh ghi (register-level), việc sử dụng nút nhấn là rất phổ biến để điều khiển các chức năng của hệ thống, ví dụ: bật/tắt LED, tăng/giảm giá trị, điều hướng menu.

Tuy nhiên, khi nút nhấn được nhấn hoặc thả, tín hiệu điện từ nút không ổn định ngay lập tức mà dao động trong một khoảng thời gian ngắn. Hiện tượng này được gọi là dội nút nhấn (button bounce).

Nguyên nhân là do cơ chế cơ học của nút: các tiếp điểm kim loại bên trong không tiếp xúc đồng bộ, tạo ra nhiều xung nhiễu liên tiếp. Nếu không xử lý chống dội, hệ thống có thể:

  • Hiểu nhầm một lần nhấn thành nhiều lần nhấn
  • Gây lỗi logic (LED nhấp nháy liên tục, đếm sai số lần nhấn, lỗi giao diện người dùng)

👉 Vì vậy, chống dội nút nhấn (debounce) là bước bắt buộc trong lập trình STM32F103 thanh ghi để đảm bảo hệ thống hoạt động ổn định và chính xác.

Tại sao cần chống dội nút nhấn trong STM32F103 (Debounce Button)?

Khi nhấn hoặc thả nút cơ học, hai tiếp điểm kim loại dao động trong khoảng 5–20 ms trước khi ổn định.

Trong khoảng thời gian này, vi điều khiển STM32 sẽ nhận được nhiều tín hiệu dao động, ví dụ:

Nếu đọc trực tiếp chân GPIO:
  • Chương trình có thể tính nhiều lần nhấn dù người dùng chỉ nhấn một lần
  • Gây sai lệch cho counter, menu, UI

➡️ Giải pháp: Chống dội (debounce) – chỉ chấp nhận tín hiệu khi nó ổn định liên tục trong một khoảng thời gian xác định (thường 10–20 ms).

Các phương pháp chống dội nút nhấn trong STM32F103

Tùy vào độ phức tạp và yêu cầu hệ thống, có nhiều phương pháp chống dội nút nhấn bằng phần mềm.
Dưới đây là 4 phương pháp phổ biến, áp dụng tốt cho lập trình STM32F103 thanh ghi.

Phương pháp 1: Delay thủ công (Simple Delay Debounce)

Dao động từ nút nhấn có thể khiến hệ thống nhầm lẫn, đặc biệt khi đọc tín hiệu ngay sau khi nhấn. Độ trễ giúp “bỏ qua” thời gian dao động để chỉ phản hồi khi tín hiệu ổn định.

Lập trình stm32f103 thanh ghi- Phương pháp 1: Delay thủ công (Simple Delay Debounce)
Lập trình stm32f103 thanh ghi- Phương pháp 1: Delay thủ công (Simple Delay Debounce)

Link bài viết: Phương pháp chống dội nút nhấn bằng Delay thủ công (Simple Delay Debounce)

Phương pháp 2: Dịch bit (Bit-shift Debounce Filter)

Khi bạn nhấn nút, các tiếp điểm bên trong có thể dao động trong vài mili giây (thường 5-20ms), tạo ra tín hiệu ngắt quãng. Nếu hệ thống đọc tín hiệu này ngay lập tức mà không lọc, nó sẽ ghi nhận nhiều lần nhấn giả, gây lỗi (ví dụ: đếm sai số lần nhấn).

Lập trình stm32f103 thanh ghi- Phương pháp 2: Dịch bit (Bit-shift Debounce Filter)
Lập trình stm32f103 thanh ghi- Phương pháp 2: Dịch bit (Bit-shift Debounce Filter)

Link bài viết: Phương pháp chống dội nút nhấn bằng dịch bit (Bit-shift Debounce Filter)

Phương pháp 3: Đếm thời gian ổn định (Time-based Debounce)

Dao động từ nút nhấn có thể kéo dài khoảng 20ms. Nếu không có cơ chế chờ, hệ thống sẽ ghi nhận nhiều lần nhấn giả, dẫn đến hành động lặp đi lặp lại không mong muốn (ví dụ: LED nhấp nháy liên tục).

Lập trình stm32f103 thanh ghi- Phương pháp 3: Đếm thời gian ổn định (Time-based Debounce Counter)
Lập trình stm32f103 thanh ghi- Phương pháp 3: Đếm thời gian ổn định (Time-based Debounce Counter)

Link bài viết: Phương pháp chống dội nút nhấn bằng đếm thời gian ổn định (Time-based debounce)

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.

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)

Link bài viết: Phương pháp chống dội nút nhấn bằng Finite State Machine

So sánh các phương pháp chống dội nút nhấn trong STM32F103

Trong lập trình STM32F103 thanh ghi, chống dội nút nhấn là yếu tố không thể bỏ qua nếu muốn hệ thống hoạt động ổn định.

Tiêu chí🧭 Phương pháp 1: Delay thủ công🔁 Phương pháp 2: Dịch bit (Bit-shift)⏱️ Phương pháp 3: Đếm thời gian ổn định🧠 Phương pháp 4: FSM
Nguyên lý hoạt độngChèn delay() sau khi phát hiện tín hiệuDịch bit trạng thái nút vào bộ đệm, kiểm tra mẫu ổn địnhĐếm thời gian nút giữ trạng thái ổn định trước khi xác nhậnXử lý trạng thái nút qua các bước: nhấn, giữ, thả
Độ phức tạpRất đơn giảnTrung bìnhTrung bình đến caoCao nhất
Blocking CPUKhôngKhôngKhông
Khả năng mở rộngKémTốtTốtRất tốt
Phù hợp hệ thống real-timeKhông
Tài nguyên sử dụngÍt (chỉ cần delay)Ít (sử dụng biến/bộ đệm)Cần Timer hoặc bộ đếmCần FSM logic
Độ tin cậy chống dộiTrung bìnhTốtRất tốtRất tốt
Ứng dụng phù hợpDemo, học tập, hệ thống đơn giảnHệ thống nhúng vừa và nhỏHệ thống yêu cầu độ chính xác caoHệ thống phức tạp, đa trạng thái

👉 Lựa chọn phương pháp chống dội nút nhấn phù hợp sẽ giúp code STM32 chính xác – ổn định – dễ mở rộng.

Kết luận

Chống dội nút nhấn trong lập trình STM32F103 thanh ghi là bước không thể thiếu để đảm bảo hệ thống hoạt động chính xác và ổn định. Tùy vào độ phức tạp của ứng dụng, bạn có thể chọn phương pháp phù hợp:

  • Delay thủ công: đơn giản, dễ hiểu, phù hợp cho demo.
  • Dịch bit: hiệu quả, ít tài nguyên, phù hợp hệ thống quét nút định kỳ.
  • Đếm thời gian ổn định: kiểm soát chính xác thời gian debounce.
  • FSM: mạnh mẽ, mở rộng tốt, lý tưởng cho hệ thống đa trạng thái.

👉 Trong các bài viết tiếp theo, từng phương pháp sẽ được phân tích chi tiết kèm ví dụ thực tế để bạn dễ dàng áp dụng vào dự án STM32 của mình.

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

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