- Kas yra TIMER įterptojoje elektronikoje?
- „Arduino“ laikmačio registrai
- „Arduino“ laikmatis pertraukia
- Būtini komponentai
- Grandinės schema
- „Arduino UNO“ laikmačių programavimas
„Arduino“ plėtros platforma iš pradžių buvo sukurta 2005 m. Kaip lengvai naudojamas programuojamas prietaisas meno dizaino projektams. Jos tikslas buvo padėti ne inžinieriams dirbti su pagrindine elektronika ir mikrovaldikliais be didelių programavimo žinių. Bet tada dėl savo lengvai naudojamo pobūdžio jį greitai pritaikė elektronikos pradedantieji ir mėgėjai visame pasaulyje, o šiandien jis netgi yra pageidaujamas kuriant prototipus ir POC.
Nors gerai pradėti nuo „Arduino“, svarbu lėtai pereiti į pagrindinius mikrovaldiklius, tokius kaip AVR, ARM, PIC, STM ir kt., Ir užprogramuoti jį naudojant savo vietines programas. Taip yra todėl, kad „ Arduino“ programavimo kalbą yra labai lengva suprasti, nes didžiąją dalį darbo atlieka iš anksto sukurtos funkcijos, tokios kaip „digitalWrite“ (), „AnalogWrite“ (), „Delay“ (ir kt.), O žemo lygio mašinų kalba yra už jų. „Arduino“ programos nėra panašios į kitas „Embedded C“ kodavimo sistemas, kuriose mes dirbame su registro bitais ir, atsižvelgiant į mūsų programos logiką, padarome juos aukštus ar žemus.
„Arduino“ laikmačiai nedelsdami:
Taigi, norėdami suprasti, kas vyksta iš anksto sukurtose funkcijose, turime atsilikti nuo šių terminų. Pavyzdžiui, kai naudojama uždelsimo () funkcija, ji iš tikrųjų nustato mikrovaldiklio „ATmega“ laikmačio ir skaitiklio registro bitus.
Šioje „ arduino“ laikmačio pamokoje vengsime naudoti šią uždelsimo () funkciją ir iš tikrųjų susidorosime su pačiais registrais. Gerai tai, kad tam galite naudoti tą patį „Arduino IDE“. Mes nustatysime laikmačio registro bitus ir naudosime laikmačio perpildymo pertraukimą, kad perjungtume šviesos diodą kiekvieną kartą, kai įvyksta pertraukimas. Laikmačio bitų išankstinio įkėlimo vertę taip pat galima reguliuoti naudojant mygtukus, kad būtų galima kontroliuoti trukmę, per kurią įvyksta pertraukimas.
Kas yra TIMER įterptojoje elektronikoje?
Laikmatis yra tarsi pertraukimas. Tai tarsi paprastas laikrodis, kuris gali išmatuoti įvykio laiko intervalą. Kiekvienas mikrovaldiklis turi laikrodį (osciliatorių), tarkime, „Arduino Uno“ yra 16 MHz. Tai yra atsakinga už greitį. Didesnis laikrodžio dažnis bus didesnis apdorojimo greitis. Laikmatis naudoja skaitiklį, kuris skaičiuojamas tam tikru greičiu, priklausomai nuo laikrodžio dažnio. „Arduino Uno“ norint atlikti vieną skaičių, reikia 1/16000000 sekundžių arba 62 nanometrų. Tai reiškia, kad „Arduino“ pereina iš vienos instrukcijos į kitą kas 62 nano sekundes.
Laikmačiai „Arduino UNO“:
„Arduino UNO“ yra trys laikmačiai, naudojami skirtingoms funkcijoms.
Laikmatis0:
Tai yra 8 bitų laikmatis ir naudojamas laikmačio funkcijoms atlikti, pvz., „Delay“ (), milis ().
1 laikmatis:
Tai yra 16 bitų laikmatis ir naudojamas servo bibliotekoje.
2 laikmatis:
Tai yra 8 bitų laikmatis ir naudojamas tono () funkcijai.
„Arduino“ laikmačio registrai
Norėdami pakeisti laikmačių konfigūraciją, naudojami laikmačių registrai.
1. Laikmačio / skaitiklio valdymo registrai (TCCRnA / B):
Šis registras turi pagrindinius laikmačio valdymo bitus ir naudojamas laikmačio išankstiniams skaleriams valdyti. Tai taip pat leidžia valdyti laikmačio režimą naudojant WGM bitus.
Rėmelio formatas:
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 |
Preskaleris:
TCCR1B bitai CS12, CS11, CS10 nustato išankstinio skalerio vertę. Išankstinis skaleris naudojamas laikmačio laikrodžio greičiui nustatyti. „Arduino Uno“ turi 1, 8, 64, 256, 1024 preskalerius.
CS12 | CS11 | CS10 | NAUDOTI |
0 | 0 | 0 | Nėra laikrodžio laikmačio |
0 | 0 | 1 | CLCK i / o / 1 Nėra išankstinio skalavimo |
0 | 1 | 0 | CLK i / o / 8 (iš preskalerio) |
0 | 1 | 1 | CLK i / o / 64 (iš preskalerio) |
1 | 0 | 0 | CLK i / o / 256 (iš „Prescaler“) |
1 | 0 | 1 | CLK i / o / 1024 (iš „Prescaler“) |
1 | 1 | 0 | Išorinis laikrodžio šaltinis ant T1 kaiščio. Laikrodis ant krintančio krašto |
1 | 1 | 1 | Išorinis laikrodžio šaltinis ant T1 kaiščio. Laikrodis ant kylančio krašto. |
2. Laikmačio / skaitiklio registras (TCNTn)
Šis registras naudojamas kontroliuojant skaitiklio vertę ir nustatant išankstinio pakrovėjo vertę.
Krautuvo vertės formulė reikalingam laikui per sekundę:
TCNTn = 65535 - (16x10 10 xTime sek. / Prescaler reikšmė)
Norėdami apskaičiuoti laikmačio 1 išankstinio pakrovėjo vertę 2 sek.
TCNT1 = 65535 - (16x10 10 x2 / 1024) = 34285
„Arduino“ laikmatis pertraukia
Anksčiau mes sužinojome apie „Arduino“ pertraukimus ir matėme, kad laikmačio pertraukimai yra tam tikros programinės įrangos pertraukimai. „Arduino“ yra įvairių laikmačio pertraukimų, kurie paaiškinti toliau.Laikmačio perpildymo pertraukimas:
Kai laikmatis pasiekia maksimalią vertę, tarkime, pavyzdžiui (16 bitų-65535), įvyksta laikmačio perpildymo pertraukimas . Taigi ISR pertraukimo tarnybos rutina yra iškviečiama, kai įjungtas laikmačio perpildymo pertraukimo bitas TOIEx, esantis laikmačio pertraukimo kaukių registre TIMSKx.
ISR formatas:
ISR (TIMERx_OVF_vect) { }
Produkcijos palyginimo registras (OCRnA / B):
Čia, kai įvyksta išvesties palyginimo atitikties pertraukimas, iškviečiama pertraukimo paslauga ISR (TIMERx_COMPy_vect), taip pat TIFRx registre bus nustatytas OCFxy vėliavos bitas. Šis ISR įgalinamas nustatant įgalinimo bitą OCIExy, esančiame TIMSKx registre. Kur TIMSKx yra laikino pertraukimo kaukės registras.
Laikmačio įvesties fiksavimas:
Tada, kai įvyksta laikmačio įvesties fiksavimo pertraukimas, iškviečiama pertraukimo paslauga ISR (TIMERx_CAPT_vect), taip pat ICFx vėliavos bitai bus nustatyti TIFRx (laikmačio pertraukimo vėliavos registras). Šis ISR įgalinamas nustatant įgalinimo bitą ICIEx esančiame TIMSKx registre.
Būtini komponentai
- „Arduino UNO“
- Mygtukai (2)
- LED (bet kokios spalvos)
- 10k rezistorius (2), 2.2k (1)
- 16x2 LCD ekranas
Grandinės schema
Grandinės jungtys tarp „Arduino UNO“ ir 16x2 LCD ekrano:
16x2 LCD ekranas |
„Arduino UNO“ |
VSS |
BND |
VDD |
+ 5 V |
V0 |
Į potenciometro centrinį kaištį, skirtą valdyti LCD kontrastą |
RS |
8 |
RW |
BND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
A |
+ 5 V |
K. |
BND |
Du mygtukai su 10K pasipriešinimo rezistoriais yra sujungti su „Arduino“ kaiščiais 2 ir 4, o šviesos diodas yra prijungtas prie „Arduino“ PIN 7 per 2.2K rezistorių.
Sąranka atrodys kaip žemiau paveikslėlyje.
„Arduino UNO“ laikmačių programavimas
Šioje pamokoje naudosime TIMER OVERFLOW INTERRUPT ir naudosime ją tam tikros trukmės šviesos diodo įjungimui ir išjungimui, naudodamiesi mygtukais, pakoreguodami išankstinio kroviklio vertę (TCNT1). Pabaigoje pateikiamas visas „Arduino Timer“ kodas. Čia mes paaiškiname kodą eilutėje po eilutės:
Kadangi 16x2 skystųjų kristalų ekranas projekte naudojamas rodyti išankstinio pakrovėjo vertę, naudojama skystųjų kristalų biblioteka.
# įtraukti
LED anodo kaištis, sujungtas su „Arduino“ kaiščiu 7, apibrėžiamas kaip „ ledPin“ .
#define ledPin 7
Toliau objektas, skirtas patekti į skystųjų kristalų klasę, yra deklaruojamas su LCD kaiščiais (RS, E, D4, D5, D6, D7), kurie yra prijungti prie „Arduino UNO“.
„LiquidCrystal“ lcd (8,9,10,11,12,13);
Tada 4 sekundes nustatykite pakrovėjo vertę 3035. Patikrinkite aukščiau pateiktą formulę, kad apskaičiuotumėte išankstinio kroviklio vertę.
plūduriuojanti vertė = 3035;
Sekantis void setup (), pirmą kartą nustatyti LCD ir 16x2 režimu ir rodyti sveikinimą kelias sekundes.
lcd.prade (16,2); lcd.setCursor (0,0); lcd.print ("ARDUINO TIMERIAI"); vėlavimas (2000); lcd.clear ();
Tada nustatykite LED kaištį kaip OUTPUT kaištį, o mygtukai - kaip INPUT
pinMode (ledPin, OUTPUT); pinMode (2, INPUT); pinMode (4, INPUT);
Tada išjunkite visus pertraukimus:
noPertraukimai ();
Tada „Timer1“ yra inicijuojamas.
TCCR1A = 0; TCCR1B = 0;
Nustatoma išankstinio kroviklio laikmačio vertė (iš pradžių kaip 3035).
TCNT1 = vertė;
Tada TCCR1B registre nustatoma „Pre scaler“ reikšmė 1024.
TCCR1B - = (1 <CS10) - (1 <CS12);
Laikmačio perpildymo pertraukimas įjungtas laikmačio pertraukimo kaukės registre, kad būtų galima naudoti ISR.
TIMSK1 - = (1 << TOIE1);
Pagaliau visi pertraukimai įgalinti.
pertraukia ();
Dabar parašykite laikmačio perpildymo pertraukimo ISR, kuris yra atsakingas už šviesos diodų įjungimą ir išjungimą naudojant „ digitalWrite“ . Būsena keičiasi, kai įvyksta laikmačio perpildymo pertrauka.
ISR (TIMER1_OVF_vect) { TCNT1 = reikšmė; „digitalWrite“ („ledPin“, „digitalRead“ („ledPin“) ^ 1); }
Į void kilpos () iš išankstinio įkėlimo vertė rodantį didėjančią arba mažėjančią naudojant mygtukiniai įėjimai, taip pat vertė yra rodomas ant 16x2 LCD.
if (digitalRead (2) == HIGH) { reikšmė = reikšmė + 10; // Įtraukimo išankstinio įkrovimo vertė } if (digitalRead (4) == HIGH) { reikšmė = reikšmė-10; // Mažinti išankstinės apkrovos vertę } lcd.setCursor (0,0); lcd.print (reikšmė); }
Taigi taip galima naudoti laikmatį, kad „Arduino“ programa vėluotų. Patikrinkite toliau pateiktą vaizdo įrašą, kuriame mes parodėme vėlavimo pasikeitimą, naudodamiesi mygtukais, padidindami ir sumažindami išankstinio kroviklio vertę.