- Ano ang TIMER sa Embedded Electronics?
- Mga Rehistro ng Timer ng Arduino
- Nakagambala ang Arduino Timer
- Kinakailangan ang Mga Bahagi
- Diagram ng Circuit
- Programming Arduino UNO Timers
Ang Arduino Development Platform ay orihinal na binuo noong 2005 bilang isang madaling gamiting programmable na aparato para sa mga proyekto sa disenyo ng sining. Ang hangarin nito ay tulungan ang mga hindi inhinyero na gumana sa pangunahing mga electronics at microcontroller nang walang maraming kaalaman sa programa. Ngunit pagkatapos, dahil sa madaling gamitin na kalikasan sa madaling panahon ay iniakma ng mga nagsisimula ng electronics at mga libangan sa buong mundo at ngayon ay mas gusto pa ito para sa pagpapaunlad ng prototype at mga pagpapaunlad ng POC.
Habang okay lang na magsimula sa Arduino, mahalaga na dahan-dahang lumipat sa mga pangunahing microcontroller tulad ng AVR, ARM, PIC, STM atbp at i-program ito gamit ang kanilang mga katutubong application. Ito ay sapagkat ang wikang Arduino Programming ay napakadaling maunawaan dahil ang karamihan sa gawain ay ginagawa ng paunang built na mga function tulad ng digitalWrite (), AnalogWrite (), Delay () at iba pa habang ang mababang antas ng wika ng makina ay nakatago sa likuran nila. Ang mga programa ng Arduino ay hindi katulad sa iba pang naka-embed na C coding kung saan nakikipag-usap kami sa mga bitbit ng rehistro at ginagawa itong mataas o mababa batay sa lohika ng aming programa.
Mga Timer ng Arduino nang walang pagkaantala:
Samakatuwid, upang maunawaan kung ano ang nangyayari sa loob ng paunang built na mga pag-andar na kailangan namin upang maghukay sa likod ng mga katagang ito. Halimbawa kapag ginamit ang isang pagpapaandar () na pagpapaandar aktwal na nagtatakda ng mga piraso ng Timer at Counter Register ng ATmega microcontroller.
Sa arduino timer tutorial na ito ay maiiwasan namin ang paggamit ng pagpapaandar na ito () na pagpapaandar at sa halip ay talagang makitungo sa mga Registro mismo. Ang magandang bagay ay maaari mong gamitin ang parehong Arduino IDE para dito. Itatakda namin ang aming mga Timer register bit at gagamitin ang Timer Overflow Interrupt upang i-toggle ang isang LED sa tuwing magaganap ang pagkagambala. Ang preloader na halaga ng Timer bit ay maaari ding maiakma gamit ang mga pushbuttons upang makontrol ang tagal kung saan nagaganap ang pagkagambala.
Ano ang TIMER sa Embedded Electronics?
Ang timer ay medyo nakakagambala. Ito ay tulad ng isang simpleng orasan na maaaring sukatin ang agwat ng oras ng isang kaganapan. Ang bawat microcontroller ay mayroong isang orasan (oscillator), sabihin sa Arduino Uno na 16Mhz. Responsable ito para sa bilis. Mas mataas ang dalas ng orasan na mas mataas ang magiging bilis ng pagproseso. Gumagamit ang isang timer ng counter na binibilang sa tiyak na bilis depende sa dalas ng orasan. Sa Arduino Uno aabutin ng 1/16000000 segundo o 62nano segundo upang makagawa ng isang bilang. Ibig sabihin ang Arduino ay lilipat mula sa isang tagubilin patungo sa isa pang tagubilin para sa bawat 62 nano segundo.
Mga timer sa Arduino UNO:
Sa Arduino UNO mayroong tatlong mga timer na ginagamit para sa iba't ibang mga pag-andar.
Timer0:
Ito ay isang timer na 8-Bit at ginagamit sa pagpapaandar ng timer tulad ng pagkaantala (), millis ().
Timer1:
Ito ay isang 16-Bit timer at ginagamit sa servo library.
Timer2:
Ito ay isang 8-Bit Timer at ginagamit sa paggana ng tone ().
Mga Rehistro ng Timer ng Arduino
Upang baguhin ang pagsasaayos ng mga timer, ginagamit ang mga pagrehistro sa timer.
1. Mga Rehistro ng Timer / Counter Control (TCCRnA / B):
Ang rehistro na ito ay nagtataglay ng pangunahing control bits ng timer at ginagamit upang makontrol ang mga prescaler ng timer. Pinapayagan din nitong makontrol ang mode ng timer gamit ang WGM bits.
Format ng Frame:
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 |
Prescaler:
Ang CS12, CS11, CS10 na mga piraso sa TCCR1B ay nagtatakda ng prescaler na halaga. Ginagamit ang isang prescaler upang i-setup ang bilis ng orasan ng timer. Ang Arduino Uno ay mayroong mga prescaler na 1, 8, 64, 256, 1024.
CS12 | CS11 | CS10 | PAGGAMIT |
0 | 0 | 0 | Walang STOP ng Orasan |
0 | 0 | 1 | CLCK i / o / 1 Walang Prescaling |
0 | 1 | 0 | CLK i / o / 8 (Mula sa Prescaler) |
0 | 1 | 1 | CLK i / o / 64 (Mula sa Prescaler) |
1 | 0 | 0 | CLK i / o / 256 (Mula sa Prescaler) |
1 | 0 | 1 | CLK i / o / 1024 (Mula sa Prescaler) |
1 | 1 | 0 | Panlabas na mapagkukunan ng orasan sa T1 Pin. Clock sa pagbagsak ng gilid |
1 | 1 | 1 | Pinagmulan ng panlabas na Orasan sa T1 pin. Clock sa tumataas na gilid. |
2. Timer / Counter Rehistro (TCNTn)
Ginagamit ang Rehistro na ito upang makontrol ang halaga ng counter at upang magtakda ng halagang preloader.
Formula para sa halagang preloader para sa kinakailangang oras sa segundo:
TCNTn = 65535 - (16x10 10 xTime sa sec / Halaga ng Prescaler)
Upang makalkula ang preloader na halaga para sa timer1 para sa oras ng 2 Sec:
TCNT1 = 65535 - (16x10 10 x2 / 1024) = 34285
Nakagambala ang Arduino Timer
Dati naming nalaman ang tungkol sa Arduino Interrupts at nakita na ang mga Timer interrupts ay isang uri ng mga interrupts ng software. Mayroong iba't ibang mga timer na nakakagambala sa Arduino na ipinaliwanag sa ibaba.Nakagambala ang Timer Overflow:
Kailan man umabot ang timer sa maximum na halagang sabihin halimbawa (16 Bit-65535) ang Timer Overflow Interrupt ay nangyayari. Kaya, ang isang ISR makagambala na gawain na gawain ay tinatawag na kapag ang Timer Overflow Interrupt ay pinapagana ang TOIEx na naroroon sa timer makagambala mask magparehistro TIMSKx.
ISR Format:
ISR (TIMERx_OVF_vect) { }
Pagrehistro ng Paghahambing ng Output (OCRnA / B):
Dito kapag ang Output Compare Match Interrupt ay nagaganap pagkatapos ang interrupt service ISR (TIMERx_COMPy_vect) ay tinawag at ang OCFxy flag bit ay maitatakda sa rehistro ng TIFRx. Ang ISR na ito ay pinagana sa pamamagitan ng pagtatakda ng paganahin ang kaunti sa OCIExy na naroroon sa pagrehistro ng TIMSKx. Kung saan ang TIMSKx ay Timer Interrupt Mask Register.
Makunan ng Input ng Timer:
Susunod kapag ang timer Input Capture Interrupt ay nagaganap pagkatapos ang interrupt service ISR (TIMERx_CAPT_vect) ay tinawag at ang ICFx flag bit ay maitatakda sa TIFRx (Timer Interrupt Flag Register). Ang ISR na ito ay pinagana sa pamamagitan ng pagtatakda ng paganahin ang kaunti sa ICIEx na naroroon sa pagrehistro ng TIMSKx.
Kinakailangan ang Mga Bahagi
- Arduino UNO
- Mga Push Button (2)
- LED (Anumang Kulay)
- 10k Resistor (2), 2.2k (1)
- 16x2 LCD Display
Diagram ng Circuit
Mga Koneksyon sa Circuit sa pagitan ng Arduino UNO at 16x2 LCD display:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Upang potentiometer center pin para sa kontrol ng kaibahan ng LCD |
Ang RS |
8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
A |
+ 5V |
K |
GND |
Dalawang mga pindutan ng Push na may pull down resistors na 10K ay konektado sa Arduino pin 2 & 4 at isang LED ay konektado sa PIN 7 ng Arduino sa pamamagitan ng isang resistor na 2.2K.
Ang setup ay magiging hitsura ng imahe sa ibaba.
Programming Arduino UNO Timers
Sa tutorial na ito gagamitin namin ang TIMER OVERFLOW INTERRUPT at gagamitin ito upang pumikit ang LED ON at OFF para sa ilang tagal sa pamamagitan ng pagsasaayos ng preloader halaga (TCNT1) gamit ang mga pushbuttons. Ang kumpletong code para sa Arduino Timer ay ibinibigay sa dulo. Narito ipinapaliwanag namin ang linya ng code sa pamamagitan ng linya:
Tulad ng ginagamit na 16x2 LCD sa proyekto upang maipakita ang halagang preloader, kaya ginagamit ang likidong kristal na silid-aklatan.
# isama
Ang LED anode pin na konektado sa Arduino pin 7 ay tinukoy bilang ledPin .
#define ledPin 7
Susunod na bagay para sa pag-access sa klase ng Liquid Crystal ay idineklara sa mga LCD pin (RS, E, D4, D5, D6, D7) na konektado sa Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
Pagkatapos itakda ang preloader na halaga 3035 sa loob ng 4 na segundo. Suriin ang formula sa itaas upang makalkula ang halagang preloader.
float halaga = 3035;
Susunod sa walang bisa na pag-set up (), itakda muna ang LCD sa 16x2 mode at ipakita ang isang maligayang mensahe sa loob ng ilang segundo.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("ARDUINO TIMERS"); pagkaantala (2000); lcd.clear ();
Susunod na itakda ang LED pin bilang OUTPUT pin at ang mga pindutan ng Push ay itinakda bilang mga INPUT pin
pinMode (ledPin, OUTPUT); pinMode (2, INPUT); pinMode (4, INPUT);
Susunod na huwag paganahin ang lahat ng mga nakakagambala:
noInterrupts ();
Susunod na ang Timer1 ay naisugod.
TCCR1A = 0; TCCR1B = 0;
Ang halaga ng preloader timer ay nakatakda (Sa una bilang 3035).
TCNT1 = halaga;
Pagkatapos ang halaga ng Pre scaler 1024 ay nakatakda sa rehistro ng TCCR1B.
TCCR1B - = (1 << CS10) - (1 << CS12);
Ang Timer overflow interrupt ay pinagana sa pagrehistro ng Timer Interrupt Mask upang magamit ang ISR.
TIMSK1 - = (1 << TOIE1);
Sa wakas ang lahat ng mga nakakagambala ay pinagana.
nakakagambala ();
Isulat ngayon ang ISR para sa Timer Overflow Interrupt na responsable para sa pag-ON at pag-OFF ng LED gamit ang digitalWrite . Nagbabago ang estado tuwing nagaganap ang pag-overflow ng timer.
ISR (TIMER1_OVF_vect) { TCNT1 = halaga; digitalWrite (ledPin, digitalRead (ledPin) ^ 1); }
Sa void loop () ang halaga ng preloader ay nadagdagan o nabawasan sa pamamagitan ng paggamit ng mga push button input at din ang halaga ay ipinakita sa 16x2 LCD.
kung (digitalRead (2) == MATAAS) { halaga = halaga + 10; // Incement preload halaga } kung (digitalRead (4) == TAAS) { halaga = halaga-10; // Decrement preload value } lcd.setCursor (0,0); lcd.print (halaga); }
Kaya't ito ay kung paano magagamit ang isang timer upang makagawa ng pagkaantala sa programa ng Arduino. Suriin ang video sa ibaba kung saan ipinakita namin ang pagbabago ng pagkaantala sa pamamagitan ng pagdaragdag at pagbawas ng preloader na halaga gamit ang mga Push button.