Muốn lập trình điều khiển Counter 1 cần phải cấp xung cho chân nào của vi điều khiển
Arduino – Timer – InterruptTrong bài viết này chúng ta sẽ tìm hiểu:
InterruptGiới thiệuTrong quá trình làm việc, bỗng nhiên bạn nhận được một yêu cầu gấp, cần phải thực hiện ngay lập tức. Lúc này, bạn buộc phải dừng công việc hiện tại để thực hiện yêu cầu đó và chỉ có thể tiếp tục công việc đang dở dang khi hoàn thành song yêu câu. Tương tự vậy, trong lập trình, chúng ta có một khái niệm, đó chính là ngắt (Interrupt). Hình 1. Ngắt Ngắt là khi một tín hiệu khẩn cấp được gửi tới bộ xử lý, yêu cầu bộ xử lý tạm dừng tức khắc các hoạt động hiện tại để nhảy đến một nơi khác thực hiện một nhiệm vụ khẩn cấp nào đó, nhiệm vụ này được gọi là trình phục vụ ngắt – ISR (Interrupt Service Routine). Sau khi kết thúc trình phục vụ ngắt – ISR, bộ đếm chương trình sẽ trả về giá trị trước đó để bộ xử lý quay về thực hiện chương trình đang dang dở. Vì sao cần sử dụng ngắt Quay trở lại ví dụ về button đã đề cập ở phần Hello world, chúng ta phải liên tục đọc trạng thái của nút nhấn bằng hàm
Điều này sẽ cực kì khó khăn khi số lượng các câu lệnh trong chương trình Điều này sẽ giúp tốc độ đáp ứng của chương trình đối với các thao tác của bạn được nhanh hơn và việc quản lý chương trình của bạn được dễ dàng và hiệu quả hơn. Vector ngắt Trong thực tế trên mỗi bộ xử lý đều có rất nhiều ngắt khác nhau, vậy điều gì sẽ xảy ra khi cùng một lúc có hai ngắt xuất hiện? Cũng như ví dụ đầu bài, nhưng bây giờ bạn nhận đến 2 yêu cầu cần thực hiện gấp, vậy bạn sẽ thực hiện yêu cầu nào? Tất nhiên là sẽ ưu tiên yêu cầu cấp thiết nhất, sau khi hoàn thành thì mới thực hiện yêu cầu tiếp theo và cuối cùng là trở lại công việc đang làm dở. Cũng như trong lập trình, mỗi ngắt đều được quy định một mức ưu tiên khác nhau, được gọi là vector ngắt (vector ngắt có giá trị càng nhỏ thì độ ưu tiên càng cao), Reset là ngắt có mức ưu tiên cao nhất. Ngắt trong Arduino Trong khuôn khổ của Arduino và mục tiêu của sách là đơn giản hóa mọi vấn đề để các bạn mới bắt đầu dễ dàng tiếp cần thì chúng ta sẽ không đi sâu vào vấn đề này. Trong Arduino, chúng ta được hỗ trợ 2 loại ngắt như sau:
Để sử dụng ngắt chúng ta cần phải kết nối nút nhấn hoặc cảm biến vào hai chân này để tạo tín hiệu ngắt cho bộ xử lý. Tùy thuộc vào vi điều khiển trên board mà mỗi dòng Arduino có số lượng các ngắt khác nhau. Bạn có thể tham khảo bảng sau: Bảng 1. Số lượng ngắt trên các Board Arduino
Arduino hỗ trợ 2 lệnh giúp ta khai báo và hủy một ngắt bất kì một cách dễ dàng đó là Lệnh attachInterrupt()
Lệnh detachInterrupt()
Ví dụYêu cầu Thiết kế hệ thống tự động bật sáng đèn khi trời tối. Linh kiện cần dùng
Cảm biến ánh sáng quang trở Hình 2. Cảm biến ánh sáng quang trở Relay Hình 3. Module Relay 5v 1 kênh. Relay là công tắc chuyển mạch (có thể đóng cắt điện áp DC và AC) được điều khiển bằng tín hiệu DC. Đây là linh kiện thụ động rất thường gặp trong các mạch điện tử. Relay có hai dạng phổ biến: Relay đóng mức thấp và đóng mức cao. Để hiểu thêm nguyên lý hoạt động của Relay, Module relay và cách sử dụng. Phân tích chương trình:
Kết nối Bảng 2. Bảng đấu nối board Arduino Uno và Relay
Hình 4. Hình ảnh kết nối cảm biến ánh sáng quang trở và Relay với board Arduino Uno Source code
Timer/CounterGiới thiệuTimer/Counter là một trong những ngoại vi hoạt động độc lập và không thể thiếu trong bất kì vi điều khiển nào. Thực chất, Timer/Counter chỉ là một bộ đếm xung clock (có thể là xung nhịp nội bên trong vi điểu khiển hoặc xung clock bên ngoài). Nó tương tự như việc đếm giờ, thay vì ngồi canh đồng hồ và đếm từng giây thì chúng ta có thể đặt báo thức và làm những công việc khác, việc đếm thời gian thì giao cho đồng hồ xử lý. Quá trình hoạt động của Timer/Counter được quản lý bởi thanh ghi, chúng gồm thanh ghi chứa giá trị Timer/Counter đếm được và thanh ghi điều khiển các hoạt động đếm của nó. Timer/Counter được sử dụng rất nhiều trong các ứng dụng định thời, đếm sự kiện, tạo xung PWM,… Timer/Counter trong Arduino Một số định nghĩa mà các bạn cần lưu ý trong khi sử dụng Timer/Counter:
Chip ATMega328p (vi điều khiển của board Arduino Uno) bao gồm các Timer/Counter sau:
Thư viện TimerOneTrên nền tảng Arduino và mục tiêu của eBook là đơn giản hóa cho những bạn mới tiếp cận, vì vậy chúng ta sẽ không điều khiển trực tiếp Timer bằng thanh ghi mà thay vào đó sẽ sử dụng thư viện TimerOne để tiếp cận với Timer/Counter. Đúng như tên gọi, thư viện sẽ sử dụng bộ Timer/Counter 1 (16 bit), ngoài ra nếu bạn muốn tìm hiểu rõ hơn về cách sử dụng cũng như quá trình hoạt động của tất cả Timer trong board Arduino Uno, bạn có thể tham khảo bài viết sau: arduino.vn/bai-viet/411-timercounter-tren-avrarduino. Các hàm cần chú ý trong thư viện:
Một số ví dụĐiều khiển LED Yêu cầu Sử dụng Timer để điều khiển LED trên board nháy sau mỗi 0,15s và hiển thị số lần LED sáng lên OLED. Linh kiện cần dùng
Phân tích:
Thư viện
Sau khi tải thư viện về, bạn mở phần mềm arduino, chọn Sketch → Import Library… → Add Library…. Sau đó chọn file .zip mà bạn vừa tải về để có thể sử dụng thư viện. Source code
Điều khiển tốc độ quạt Yêu cầu Điều khiển tốc độ quạt sử dụng băm xung PWM. Thực tế chúng ta vẫn có thể điều khiển tốc độ quạt bằng hàm Linh kiện sử dụng
Hình 5. FAN FAN nói chung hoặc quạt tản nhiệt nói riêng thông thường sẽ có 3 chân, chân (+) màu đỏ, chân GND màu đen và chân còn lại là chân điều khiển tốc độ. Kết nối
Hình 6. Hình ảnh kết nối quạt mini với board Arduino Uno Source code
Giải thích source code:
Điều khiển động cơ Servo bằng biến trở Servo là gì? Khác với những dạng động cơ thông thường chỉ quay liên tục khi cấp nguồn điện, Servo là dạng động cơ điều khiển được góc quay bằng xung PWM. Trên thị trường có rất nhiều loại động cơ Servo với kích thước, khối lượng, cấu tạo khác nhau, từ những loại Servo kích thước nhỏ gọn (dùng cho máy bay mô hình) đến những loại sỡ hữu moment xoắn cực lớn (vài chục N/m). Để điều khiển được góc quay Servo (trong khoảng từ 0o – 180o ) chúng ta sẽ dùng xung PWM như sau: Hình 7. Hình điều khiển Servo Biến trở Biến trở là linh kiện điện tử mà giá trị điện trở có thể thay đổi được. Chúng có thể được sử dụng trong các mạch điện để điều chỉnh hoạt động của mạch điện. Hình 8. Biến trở Yêu cầu
Sơ đồ kết nối Bảng 5. Bảng đấu nối board Arduino Uno với động cơ Servo
Hình 9. Hình ảnh kết nối biến trở và động cơ Servo với Arduino Uno Thư viện Trong ứng dụng này, chúng ta sẽ sử dụng thư viện servo.h Thư viện servo.h sử dụng bộ Timer/Counter 1, đóng vai trò quan trọng nếu bạn muốn làm về dự án robot. Nó cung cấp cho bạn một phương thức cực kì đơn giản để điều khiển động cơ Servo. Đồng thời, thư viện đã được tích hợp sẵn trong arduino IDE nên bạn không cần phải tải thêm thư viện khi sử dụng. Một số hàm cần chú ý như:
Source code
SummaryQua chương này, chúng ta đã tìm hiểu được những khái niệm cơ bản về ngắt (Interrupt) và Timer/counter, lý do tại sao chúng ta cần sử dụng nó trong các ứng dụng. Đồng thời chúng ta biết được thêm thư viện TimerOne giúp ta dễ dàng tiếp cận và làm chủ bộ Timer/Couter trên board Arduino Uno. Đối với những ví dụ đơn giản, khó có thể không nhận thấy sự khác biệt khi sử dụng ngắt (Interrupt) và Timer/Counter. Nhưng khi thực hiện những ví dụ phức tạp, cần khai thác tối ta khả năng xử lý của vi điều khiển thì đây sẽ là trợ thủ đắc lực cho bạn. |