- TIMER trong Điện tử nhúng là gì?
- Thanh ghi bộ hẹn giờ Arduino
- Arduino Hẹn giờ ngắt
- Thành phần bắt buộc
- Sơ đồ mạch
- Lập trình bộ hẹn giờ Arduino UNO
Nền tảng phát triển Arduino ban đầu được phát triển vào năm 2005 như một thiết bị có thể lập trình dễ sử dụng cho các dự án thiết kế nghệ thuật. Mục đích của nó là giúp những người không phải là kỹ sư làm việc với các thiết bị điện tử và vi điều khiển cơ bản mà không cần nhiều kiến thức về lập trình. Nhưng sau đó, do tính chất dễ sử dụng, nó đã sớm được những người mới bắt đầu và những người yêu thích thiết bị điện tử trên khắp thế giới thích nghi và ngày nay nó thậm chí còn được ưa thích để phát triển nguyên mẫu và phát triển POC.
Mặc dù bắt đầu với Arduino là điều quan trọng, nhưng điều quan trọng là phải từ từ chuyển sang các bộ vi điều khiển cốt lõi như AVR, ARM, PIC, STM, v.v. và lập trình nó bằng các ứng dụng gốc của chúng. Điều này là do ngôn ngữ Lập trình Arduino rất dễ hiểu vì hầu hết công việc được thực hiện bởi các hàm được tạo sẵn như digitalWrite (), AnalogWrite (), Delay (), v.v. trong khi ngôn ngữ máy cấp thấp được ẩn đằng sau chúng. Các chương trình Arduino không tương tự như mã hóa C nhúng khác, nơi chúng tôi xử lý các bit thanh ghi và làm cho chúng cao hoặc thấp dựa trên logic của chương trình của chúng tôi.
Bộ đếm thời gian Arduino không có độ trễ:
Do đó, để hiểu những gì đang xảy ra bên trong các chức năng được tạo sẵn, chúng ta cần tìm hiểu kỹ các thuật ngữ này. Ví dụ, khi một hàm delay () được sử dụng, nó thực sự thiết lập các bit của Thanh ghi Bộ định thời và Bộ đếm của vi điều khiển ATmega.
Trong hướng dẫn hẹn giờ arduino này, chúng ta sẽ tránh việc sử dụng hàm delay () này và thay vào đó thực sự xử lý chính các thanh ghi. Điều tốt là bạn có thể sử dụng cùng một IDE Arduino cho việc này. Chúng tôi sẽ đặt các bit thanh ghi Bộ hẹn giờ của mình và sử dụng Ngắt Tràn Bộ hẹn giờ để chuyển đổi đèn LED mỗi khi ngắt xảy ra. Giá trị bộ tải trước của bit Bộ định thời cũng có thể được điều chỉnh bằng cách sử dụng các nút bấm để kiểm soát khoảng thời gian xảy ra ngắt.
TIMER trong Điện tử nhúng là gì?
Hẹn giờ là loại ngắt. Nó giống như một chiếc đồng hồ đơn giản có thể đo khoảng thời gian của một sự kiện. Mọi vi điều khiển đều có xung nhịp (bộ dao động), ví dụ trong Arduino Uno, nó là 16Mhz. Điều này chịu trách nhiệm về tốc độ. Cao hơn tần số xung nhịp cao hơn sẽ là tốc độ xử lý. Bộ đếm thời gian sử dụng bộ đếm đếm ở tốc độ nhất định tùy thuộc vào tần số đồng hồ. Trong Arduino Uno, mất 1/16000000 giây hoặc 62nano giây để thực hiện một lần đếm. Có nghĩa là Arduino chuyển từ lệnh này sang lệnh khác trong mỗi 62 nano giây.
Bộ hẹn giờ trong Arduino UNO:
Trong Arduino UNO có ba bộ định thời được sử dụng cho các chức năng khác nhau.
Hẹn giờ0:
Nó là một bộ định thời 8 Bit và được sử dụng trong chức năng hẹn giờ như delay (), millis ().
Hẹn giờ1:
Nó là một bộ định thời 16-Bit và được sử dụng trong thư viện servo.
Hẹn giờ 2:
Nó là một bộ định thời 8 bit và được sử dụng trong hàm tone ().
Thanh ghi bộ hẹn giờ Arduino
Để thay đổi cấu hình của bộ định thời, các thanh ghi bộ định thời được sử dụng.
1. Thanh ghi điều khiển bộ định thời / bộ đếm (TCCRnA / B):
Thanh ghi này giữ các bit điều khiển chính của bộ định thời và được sử dụng để điều khiển các bộ định vị sẵn của bộ định thời. Nó cũng cho phép điều khiển chế độ hẹn giờ bằng cách sử dụng các bit WGM.
Định dạng khung:
TCCR1A | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
COM1A1 | COM1A0 | COM1B1 | COM1B0 | COM1C1 | COM1C0 | WGM11 | WGM10 |
TCCR1B | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
ICNC1 | ICES1 | - | WGM13 | WGM12 | CS12 | CS11 | CS10 |
Bộ định mức:
Các bit CS12, CS11, CS10 trong TCCR1B đặt giá trị bộ định hạng trước. Bộ đếm trước được sử dụng để thiết lập tốc độ đồng hồ của bộ đếm thời gian. Arduino Uno có các bộ đếm trước là 1, 8, 64, 256, 1024.
CS12 | CS11 | CS10 | SỬ DỤNG |
0 | 0 | 0 | Không có đồng hồ hẹn giờ DỪNG |
0 | 0 | 1 | CLCK i / o / 1 Không đặt trước |
0 | 1 | 0 | CLK i / o / 8 (Từ Prescaler) |
0 | 1 | 1 | CLK i / o / 64 (Từ Prescaler) |
1 | 0 | 0 | CLK i / o / 256 (Từ Prescaler) |
1 | 0 | 1 | CLK i / o / 1024 (Từ Prescaler) |
1 | 1 | 0 | Nguồn xung nhịp ngoài trên Chân T1. Đồng hồ trên cạnh rơi |
1 | 1 | 1 | Nguồn Clock ngoài trên chân T1. Đồng hồ trên cạnh tăng. |
2. Thanh ghi bộ định thời / bộ đếm (TCNTn)
Thanh ghi này được sử dụng để kiểm soát giá trị bộ đếm và để đặt giá trị bộ tải trước.
Công thức cho giá trị trình tải trước cho thời gian yêu cầu tính bằng giây:
TCNTn = 65535 - (16 x 10 x Thời gian tính bằng giây / Giá trị bộ đặt trước)
Để tính toán giá trị trình tải trước cho timer1 trong thời gian 2 Giây:
TCNT1 = 65535 - (16x10 10 x2 / 1024) = 34285
Arduino Hẹn giờ ngắt
Trước đây chúng ta đã tìm hiểu về ngắt Arduino và đã thấy rằng ngắt Timer là một loại ngắt phần mềm. Có nhiều ngắt hẹn giờ khác nhau trong Arduino được giải thích bên dưới.Ngắt tràn bộ hẹn giờ:
Bất cứ khi nào bộ đếm thời gian đạt đến giá trị tối đa, chẳng hạn như (16 Bit-65535) thì Ngắt Tràn Bộ hẹn giờ xảy ra. Vì vậy, một quy trình dịch vụ ngắt ISR được gọi khi bit Ngắt dòng tràn bộ định thời được kích hoạt trong TOIEx hiện diện trong thanh ghi mặt nạ ngắt bộ định thời TIMSKx.
Định dạng ISR:
ISR (TIMERx_OVF_vect) { }
Thanh ghi so sánh đầu ra (OCRnA / B):
Ở đây khi Ngắt So sánh Đầu ra xảy ra thì dịch vụ ngắt ISR (TIMERx_COMPy_vect) được gọi và bit cờ OCFxy cũng sẽ được thiết lập trong thanh ghi TIFRx. ISR này được kích hoạt bằng cách đặt bit cho phép trong OCIExy có trong thanh ghi TIMSKx. Trong đó TIMSKx là thanh ghi mặt nạ ngắt bộ định thời.
Chụp đầu vào hẹn giờ:
Tiếp theo khi Ngắt bắt đầu vào của bộ định thời xảy ra thì dịch vụ ngắt ISR (TIMERx_CAPT_vect) được gọi và bit cờ ICFx sẽ được đặt trong TIFRx (Thanh ghi cờ ngắt bộ định thời). ISR này được kích hoạt bằng cách đặt bit kích hoạt trong ICIEx có trong thanh ghi TIMSKx.
Thành phần bắt buộc
- Arduino UNO
- Nút đẩy (2)
- LED (Bất kỳ màu nào)
- Điện trở 10k (2), 2,2k (1)
- Màn hình LCD 16x2
Sơ đồ mạch
Kết nối mạch giữa Arduino UNO và màn hình LCD 16x2:
LCD 16x2 |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Đến chân trung tâm chiết áp để điều khiển độ tương phản của LCD |
RS |
số 8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
A |
+ 5V |
K |
GND |
Hai nút Đẩy có điện trở kéo xuống 10K được kết nối với chân Arduino 2 & 4 và một đèn LED được kết nối với mã PIN 7 của Arduino thông qua điện trở 2,2K.
Thiết lập sẽ giống như hình ảnh dưới đây.
Lập trình bộ hẹn giờ Arduino UNO
Trong hướng dẫn này, chúng tôi sẽ sử dụng TIMER OVERFLOW INTERRUPT và sử dụng nó để nhấp nháy đèn LED BẬT và TẮT trong một khoảng thời gian nhất định bằng cách điều chỉnh giá trị trình tải trước (TCNT1) bằng các nút nhấn. Mã hoàn chỉnh cho Bộ hẹn giờ Arduino được đưa ra ở cuối. Ở đây chúng tôi đang giải thích từng dòng mã:
Vì LCD 16x2 được sử dụng trong dự án để hiển thị giá trị trình tải trước, vì vậy thư viện tinh thể lỏng được sử dụng.
#include
Chân cực dương của LED được kết nối với chân 7 của Arduino được xác định là ledPin .
#define ledPin 7
Tiếp theo, đối tượng để truy cập lớp Liquid Crystal được khai báo với các chân LCD (RS, E, D4, D5, D6, D7) được kết nối với Arduino UNO.
Màn hình LCD LiquidCrystal (8,9,10,11,12,13);
Sau đó, đặt giá trị trình tải trước 3035 trong 4 giây. Kiểm tra công thức ở trên để tính toán giá trị trình tải trước.
giá trị float = 3035;
Tiếp theo trong void setup (), trước tiên hãy đặt màn hình LCD ở chế độ 16x2 và hiển thị thông báo chào mừng trong vài giây.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("ARDUINO TIMERS"); chậm trễ (2000); lcd.clear ();
Tiếp theo đặt chân LED làm chân OUTPUT và các nút Đẩy được đặt làm chân INPUT
pinMode (ledPin, OUTPUT); pinMode (2, INPUT); pinMode (4, INPUT);
Tiếp theo vô hiệu hóa tất cả các ngắt:
noInterrupts ();
Tiếp theo Timer1 được khởi tạo.
TCCR1A = 0; TCCR1B = 0;
Giá trị hẹn giờ của trình tải trước được đặt (Ban đầu là 3035).
TCNT1 = giá trị;
Sau đó, giá trị Pre scaler 1024 được đặt trong thanh ghi TCCR1B.
TCCR1B - = (1 << CS10) - (1 << CS12);
Ngắt tràn bộ định thời được kích hoạt trong thanh ghi Mặt nạ ngắt bộ định thời để ISR có thể được sử dụng.
TIMSK1 - = (1 << TOIE1);
Cuối cùng thì tất cả các ngắt đều được kích hoạt.
ngắt ();
Bây giờ hãy viết ISR cho Ngắt tràn bộ hẹn giờ chịu trách nhiệm BẬT và TẮT LED bằng cách sử dụng digitalWrite . Trạng thái thay đổi bất cứ khi nào xảy ra ngắt tràn bộ định thời.
ISR (TIMER1_OVF_vect) { TCNT1 = giá trị; digitalWrite (ledPin, digitalRead (ledPin) ^ 1); }
Trong vòng lặp void () giá trị của trình tải trước được tăng hoặc giảm bằng cách sử dụng các đầu vào nút nhấn và giá trị cũng được hiển thị trên màn hình LCD 16x2.
if (digitalRead (2) == HIGH) { value = value + 10; // Giá trị tải trước thực thi } if (digitalRead (4) == HIGH) { value = value-10; // Giảm giá trị tải trước } lcd.setCursor (0,0); lcd.print (giá trị); }
Vì vậy, đây là cách một bộ đếm thời gian có thể được sử dụng để tạo ra độ trễ trong chương trình Arduino. Kiểm tra video bên dưới, nơi chúng tôi đã chứng minh sự thay đổi về độ trễ bằng cách tăng và giảm giá trị trình tải trước bằng các nút Đẩy.