Arduino Timer: chơi với thời gian trong các dự án của bạn

Hẹn giờ Arduino UNO

Cách đây một thời gian, chúng tôi đã công bố thêm thông tin về hàm millis () de ArduinoBây giờ chúng ta sẽ nghiên cứu sâu hơn về Bộ hẹn giờ Arduino, để bắt đầu với tính năng này cho tính năng, hãy hiểu cách bảng này quản lý thời gian với MCU, cũng như các chức năng khác ngoài mili ().

Bộ hẹn giờ Arduino là gì?

bộ đếm thời gian arduino

El Bộ đếm thời gian Arduino hoặc bộ đếm thời gian, là một chức năng được thực hiện bởi phần cứng (trong bộ vi điều khiển, với sự trợ giúp của tinh thể thạch anh tạo ra các xung đồng hồ và thiết lập "nhịp điệu", mà không cần phần cứng bên ngoài hoặc IC 555) cho phép điều khiển các sự kiện tạm thời nhờ đồng hồ Nội bộ. Ví dụ, thực hiện một nhiệm vụ xảy ra theo từng khoảng thời gian, thực hiện các phép đo thời gian chính xác, v.v., độc lập với mã phác thảo.

Como Arduino UNO Nó có một chip MCU hoạt động ở tốc độ 16 Mhz, 16.000.000 có thể được thực thi mỗi giây. Các lệnh cần X chu kỳ để thực thi, không phải tất cả chúng đều thực thi trong cùng một chu kỳ đồng hồ, ví dụ, các lệnh 16 bit cần nhiều chu kỳ hơn trong kiến ​​trúc AVR này.

Hãy tưởng tượng rằng bạn sử dụng hàm delay (), điều này sẽ chặn thực thi trên MCU Arduino cho đến khi hết thời gian quy định và sau đó tiếp tục với chương trình, nhưng bộ hẹn giờ sẽ không chặn. Nó sẽ tính thời gian khi MCU tiếp tục thực hiện các lệnh khác đồng thời. Đó là lợi thế lớn.

Bộ đếm thời gian liên quan đến sự gián đoạn của Arduino, vì chúng sẽ được thực thi thông qua chúng để tham gia một số nhiệm vụ cụ thể. Nói cách khác, Arduino Timer là một chức năng được kích hoạt tại một thời điểm nhất định, thực hiện một chức năng ngắt. Đó là lý do tại sao điều quan trọng là phải biết về những gián đoạn này.

Phương thức

Bộ hẹn giờ Arduino có 2 chế độ hoạt động, có thể sử dụng nó trong:

  • Tín hiệu PWM: Bạn có thể kiểm soát Chân Arduino (~).
  • CTC (Xóa bộ đếm thời gian khi so sánh trận đấu): đếm thời gian bên trong bộ đếm và khi nó đạt đến giá trị được chỉ định trong thanh ghi của bộ định thời, thì ngắt được thực hiện.

Nó có bao nhiêu bộ hẹn giờ? Các loại bộ hẹn giờ

Arduino UNO hàm mili

đó 3 bộ hẹn giờ trên đĩa Arduino UNO, mặc dù có thể có nhiều hơn trên các tấm hàng đầu khác:

  • Hẹn giờ 0: 8-bit, có thể đếm từ 0 đến 255 (256 giá trị có thể). Được sử dụng bởi các hàm như delay (), millis () và micros (). Việc sửa đổi nó không được khuyến khích để không làm thay đổi chương trình.
  • Hẹn giờ 1: bằng Timer 0. Được sử dụng bởi thư viện Servo trong UNO (Timer 5 cho MEGA).
  • Hẹn giờ 2: 16-bit và có thể nằm trong khoảng từ 0 đến 65.525 (65.536 giá trị có thể). Được sử dụng cho chức năng tone (), nếu không được sử dụng, nó có thể được sử dụng tùy ý cho ứng dụng của bạn.
  • Bộ hẹn giờ 3, 4, 5 (chỉ trên Arduino MEGA): tất cả 16-bit.

Bộ hẹn giờ Arduino hoạt động như thế nào?

bộ tính giờ, bộ hẹn giờ

Để làm việc với Bộ hẹn giờ Arduino, điều quan trọng là phải biết tất cả điều này hoạt động điện tử như thế nào trong MCU của hội đồng phát triển này:

  • Tần số đồng hồ: là số chu kỳ mỗi giây mà nó có khả năng phát triển, trong trường hợp của Arduino là 16 Mhz, hoặc tương tự, tín hiệu đồng hồ dao động 16.000.000 lần trong một giây (chu kỳ).
  • Thời gian: được biểu thị bằng chữ T, và được đo bằng giây, và là nghịch đảo của các chu kỳ. Ví dụ: T = 1 / C, sẽ dẫn đến 1/16000000 = 0.0000000625, thời gian cần để mỗi chu kỳ hoàn thành. Và tần số là nghịch đảo của chu kỳ, do đó f = 1 / T.
  • Chu kỳ: là mỗi một trong những lần lặp lại của tín hiệu xảy ra trên một đơn vị thời gian. Trên Arduino, tốc độ sẽ là 16 triệu trong một giây. Hoặc tương tự, trong trường hợp này, khi 16 triệu chu kỳ đã trôi qua, một giây đã trôi qua. Do đó, một chu kỳ có thể được cho là mất 625 ns.
  • cạnh của một tín hiệu: Tín hiệu đồng hồ là hình vuông và các cạnh có thể tăng hoặc giảm. Một cạnh là đường thẳng của tín hiệu khi nó thay đổi từ:
    • 0 (thấp) đến 1 (cao): cạnh tăng.
    • 1 (cao) đến 0 (thấp): cạnh rơi.

Các cạnh rất quan trọng vì các bộ định thời Arduino đo chu kỳ từ các cạnh tín hiệu. A) Có contador nó tăng dần theo từng chu kỳ và khi nó đạt đến giá trị thanh ghi, ngắt được thực hiện.

Do đó, một khi bạn biết điều này, nếu bạn có 16Mhz trên Arduino MCUvà Bộ định thời 8 bit được sử dụng, có thể nói rằng ngắt sẽ xảy ra sau mỗi 16 μs (256/16000000) hoặc 4 ms cho 16 bit (65536/16000000). Vì vậy, nếu bạn đặt thanh ghi bộ đếm 16 bit ở mức tối đa, với giá trị 65535, thì ngắt sẽ xảy ra ở 4 ms để thực hiện bất kỳ tác vụ nào.

Khi bộ đếm đạt đến giá trị lớn nhất có thể, nó sẽ trở lại 0 một lần nữa. Tức là xảy ra hiện tượng tràn và nó sẽ tính lại từ đầu.

Để kiểm soát tốc độ tăng của bộ đếm thời gian, bạn cũng có thể sử dụng một người định sẵn, nhận các giá trị 1, 8, 64, 256 và 1024 và thay đổi thời gian như thế này:

Tốc độ hẹn giờ (Hz) = Tần số xung nhịp của Arduino / Prescaler

Nếu là 1, bộ điều khiển sẽ tăng lên 16 Mhz, nếu là 8 đến 2 Mhz, nếu là 64 đến 250 kHz, v.v. Hãy nhớ rằng sẽ có một bộ so sánh trạng thái của bộ đếm thời gian để so sánh giá trị của bộ đếm và bộ đếm trước cho đến khi chúng bằng nhau và sau đó thực hiện một hành động. Cho nên, tần số gián đoạn được đưa ra bởi công thức:

+1 là do thanh ghi bộ đếm được lập chỉ mục ở 0, tức là nó không bắt đầu đếm ở 1 mà là 0.

Tốc độ ngắt (Hz) = Tần số đồng hồ Arduino / Prescaler (giá trị thanh ghi so sánh + 1)

May mắn thay, chúng ta không sửa đổi hồ sơ của Bộ hẹn giờ Arduino, vì nó sẽ được quản lý bởi các thư viện mà chúng tôi sử dụng trong mã. Nhưng nếu chúng không được sử dụng, chúng nên được cấu hình.

Ví dụ trong Arduino IDE

Arduino IDE, kiểu dữ liệu, lập trình

Để hiểu rõ hơn về tất cả những điều này, ở đây tôi đưa ra hai mã phác thảo cho Arduino IDE mà bạn có thể có được để trải nghiệm việc sử dụng bộ hẹn giờ. Đầu tiên là mã sẽ nhấp nháy đèn LED được kết nối với chân 8 của Arduino mỗi giây:

#define ledPin 8
void setup()
{
  pinMode(ledPin, OUTPUT);
  // Configurar Timer1
  TCCR1A = 0;                        //Registro control A a 0, pines OC1A y OC1B deshabilitados
  TCCR1B = 0;                        //Limpia el registrador
  TCCR1B |= (1<<CS10)|(1 << CS12);   //Configura prescaler a 1024: CS12 = 1 y CS10 = 1
  TCNT1 = 0xC2F8;                    //Iniciar timer para desbordamiento a 1 segundo
                                     //65536-(16MHz/1024/1Hz - 1) = 49912 = 0xC2F8 en hexadecimal
  
  TIMSK1 |= (1 << TOIE1);           //Habilitar interrupción para Timer1
}
void loop()
{
}
ISR(TIMER1_OVF_vect)                              //Interrupción del TIMER1 
{
  TCNT1 = 0xC2F7;                                 // Reniciar Timer1
  digitalWrite(ledPin, digitalRead(ledPin) ^ 1); //Invierte el estado del LED
}

Lập trình nhấp nháy hoặc nhấp nháy của đèn LED, như trong trường hợp trước mỗi giây, nhưng lần này sử dụng CTC tức là so sánh:

#define ledPin 8
void setup()
{
  pinMode(ledPin, OUTPUT);
  
  // Configuración Timer1
  TCCR1A = 0;                //Registro de control A a 0
  TCCR1B = 0;                //Limpiar registro
  TCNT1  = 0;                //Inicializar el temporizador
  OCR1A = 0x3D08;            //Carga el valor del registro de comparación: 16MHz/1024/1Hz -1 = 15624 = 0X3D08
  TCCR1B |= (1 << WGM12)|(1<<CS10)|(1 << CS12);   //Modo CTC, prescaler de 1024: CS12 = 1 y CS10 = 1  
  TIMSK1 |= (1 << OCIE1A);  //Habilita interrupción por igualdad de comparación
}
void loop()
{
}
ISR(TIMER1_COMPA_vect)          //Interrupción por igualdad de comparación en TIMER1
{
  digitalWrite(ledPin, digitalRead(ledPin) ^ 1);   //Invierte el estado del LED
}

Tìm hiểu thêm về lập trình Arduino

mua một cái đĩa Arduino UNO tái bản3

Hãy là người đầu tiên nhận xét

Để lại bình luận của bạn

địa chỉ email của bạn sẽ không được công bố. Các trường bắt buộc được đánh dấu bằng *

*

*

  1. Chịu trách nhiệm về dữ liệu: Miguel Ángel Gatón
  2. Mục đích của dữ liệu: Kiểm soát SPAM, quản lý bình luận.
  3. Hợp pháp: Sự đồng ý của bạn
  4. Truyền thông dữ liệu: Dữ liệu sẽ không được thông báo cho các bên thứ ba trừ khi có nghĩa vụ pháp lý.
  5. Lưu trữ dữ liệu: Cơ sở dữ liệu do Occentus Networks (EU) lưu trữ
  6. Quyền: Bất cứ lúc nào bạn có thể giới hạn, khôi phục và xóa thông tin của mình.