Nội Dung Bài Viết
Trong chuỗi bài viết về các phương pháp chống dội nút nhấn, hôm nay chúng ta sẽ tìm hiểu Phương pháp 3: Chống dội nút nhấn bằng đếm thời gian ổn định trong STM32F103 (Time-based Debounce) – một kỹ thuật phần mềm giúp kiểm soát chính xác thời gian ổn định của tín hiệu trước khi xác nhận sự kiện.
Trong quá trình 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 hoạt động chính xác. Khi người dùng nhấn hoặc thả nút, các tiếp điểm cơ học thường dao động trong khoảng 5–20ms, tạo ra tín hiệu không ổn định. Nếu không có cơ chế lọc, hệ thống có thể ghi nhận nhiều lần nhấn giả, gây lỗi như LED nhấp nháy liên tục hoặc đếm sai số lần nhấn.
Phương pháp 3: Đếm thời gian ổn định (Time-based Debounce) trong STM32F103
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).
Nguyên lý hoạt động và sơ đồ chống dội bằng đếm thời gian ổn định (Time-based Debounce)
Nguyên lý
Khi trạng thái nút thay đổi → reset bộ đếm
Chỉ khi tín hiệu ổn định đủ 20 ms → xác nhận
Sơ đồ (flow chart) phương pháp chống dội nút nhấn bằng đếm thời gian ổn định

Cách hoạt động phương pháp chống dội bằng đếm thời gian ổn định (Time-based Debounce)
Hàm ButtonDebounce thực hiện phương pháp này:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | void ButtonDebounce(GPIO_TypeDef* port, uint32_t pin, uint32_t* ButtonState) { static uint32_t ButtonDebounceTime = 0; static uint32_t lastButtonState = 0; uint32_t currentButtonState = ((port->IDR.reg >> pin) & 1U); if (currentButtonState != lastButtonState) { ButtonDebounceTime = 1000*20; } else { if ((--ButtonDebounceTime) <= 0) { ButtonDebounceTime = 1; *ButtonState = currentButtonState; } } lastButtonState = currentButtonState; } |
Chương trình main chống dội nút nhấn bằng đếm thời gian ổn định (Time-based Debounce)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | int main(void) { SystemClock_Config(); // Initialize system clock GPIO_LED_Config(); GPIO_Button_Config(); uint32_t lastKeyState = 0; while (1) { uint32_t ButtonState = 1; ButtonDebounce(GPIOC,1, &ButtonState); if ((!ButtonState) && (lastKeyState == 1)) { LED_Toggle(); } lastKeyState = ButtonState; } } |
Chương trình chống dội nút nhấn bằng phương pháp đếm thời gian ổn định hoạt động như sau:
- Bước 1: Đọc trạng thái hiện tại (currentButtonState) từ GPIO.
- Bước 2: So sánh với trạng thái trước (lastButtonState). Nếu khác, đặt lại bộ đếm thành 20ms.
- Bước 3: Nếu trạng thái không đổi, giảm bộ đếm. Khi bộ đếm về 0, gán trạng thái hiện tại vào *ButtonState (xác nhận sự kiện).
- Ví dụ: Khi nhấn nút, nếu dao động xảy ra, bộ đếm sẽ được đặt lại nhiều lần. Chỉ khi tín hiệu ổn định 20ms, *ButtonState mới thay đổi.
Link Github: Download chương trình chống dội nút nhấn bằng thời gian ổn định (Time-based Debounce)
Ưu điểm chống dội bằng đếm thời gian ổn định (Time-based Debounce)
- Kiểm soát chính xác thời gian debounce → dễ điều chỉnh theo yêu cầu hệ thống.
- Hoạt động ổn định, dễ hiểu → phù hợp cho các ứng dụng cần độ tin cậy cao.
- Không gây blocking CPU → hệ thống vẫn xử lý các tác vụ khác trong khi chờ tín hiệu ổn định.
- Phù hợp cho hệ thống real-time nếu được tối ưu đúng cách.
Nhược điểm chống dội bằng đếm thời gian ổn định (Time-based Debounce)
- Tốn tài nguyên hơn → cần thêm biến đếm và logic kiểm tra trạng thái.
- Khó mở rộng cho nhấn đôi, nhấn giữ → cần bổ sung FSM hoặc logic phức tạp hơn.
- Phụ thuộc vào độ chính xác của bộ đếm hoặc timer → nếu không chuẩn, có thể gây sai lệch thời gian debounce.
So sánh: Dịch bit vs. Đếm thời gian ổn định
| Tiêu chí | 🔁 Dịch bit (Bit-shift Filter) | ⏱️ Đếm thời gian ổn định (Time-based Debounce) |
|---|---|---|
| Nguyên lý hoạt động | Dịch trạng thái nút vào bộ đệm, kiểm tra mẫu ổn định | Đếm thời gian tín hiệu không thay đổi trước khi xác nhận |
| Độ phức tạp | Trung bình | Trung bình đến cao |
| Blocking CPU | Không | Không |
| Cần timer hoặc bộ đếm | Không | Có (biến đếm hoặc timer) |
| Khả năng mở rộng | Tốt | Tốt |
| Điều chỉnh thời gian debounce | Gián tiếp qua số bit và tần suất quét | Trực tiếp, dễ kiểm soát bằng giá trị đếm |
| Độ tin cậy chống dội | Tốt nếu quét đều | Rất tốt, ổn định hơn |
| Phù hợp hệ thống real-time | Có | Có |
| Ứng dụng phù hợp | Hệ thống quét nút định kỳ | Hệ thống yêu cầu độ chính xác cao |
Kết luận
Phương pháp chống dội nút nhấn bằng đếm thời gian ổn định (Time-based Debounce) trong lập trình STM32F103 bằng thanh ghi là một kỹ thuật phần mềm mạnh mẽ, giúp xác nhận chính xác trạng thái nút sau khi tín hiệu ổn định trong một khoảng thời gian nhất định. Dù tốn thêm tài nguyên và logic xử lý, phương pháp này phù hợp cho các hệ thống yêu cầu độ tin cậy cao, hoạt động ổn định và có khả năng mở rộng.
