- Vad är TIMER i inbyggd elektronik?
- Arduino timerregister
- Arduino Timer avbryter
- Komponenter krävs
- Kretsschema
- Programmering av Arduino UNO-timer
Arduino Development Platform utvecklades ursprungligen 2005 som en lättanvänd programmerbar enhet för konstdesignprojekt. Dess avsikt var att hjälpa icke-ingenjörer att arbeta med grundläggande elektronik och mikrokontroller utan mycket programmeringskunskap. Men på grund av dess lättanvända natur anpassades den snart av elektroniknybörjare och hobbyister runt om i världen och idag är den till och med föredragen för utveckling av prototyp och POC-utveckling.
Även om det är okej att börja med Arduino, är det viktigt att du sakta går in i kärnmikrokontrollerna som AVR, ARM, PIC, STM etc och programmerar den med hjälp av sina egna applikationer. Detta beror på att Arduino-programmeringsspråket är väldigt lätt att förstå eftersom det mesta av arbetet utförs av förbyggda funktioner som digitalWrite (), AnalogWrite (), Delay () etc. medan maskinens språk på låg nivå är dold bakom dem. Arduino-programmen liknar inte andra Embedded C-kodning där vi hanterar registerbitar och gör dem höga eller låga baserat på logiken i vårt program.
Arduino Timers utan dröjsmål:
Därför, för att förstå vad som händer i de förbyggda funktionerna måste vi gräva bakom dessa termer. Till exempel när en fördröjning () -funktion används ställer den faktiskt in timer- och motregisterbitarna för ATmega-mikrokontrollern.
I den här handboken för arduino-timer kommer vi att undvika att använda denna delay () -funktion och istället faktiskt hantera registren själva. Det bra är att du kan använda samma Arduino IDE för detta. Vi ställer in våra timerregisterbitar och använder Timer Overflow Interrupt för att växla en LED varje gång avbrottet inträffar. Förladdningsvärdet för timerbiten kan också justeras med hjälp av tryckknappar för att styra varaktigheten under vilken avbrottet inträffar.
Vad är TIMER i inbyggd elektronik?
Timern är typ av avbrott. Det är som en enkel klocka som kan mäta tidsintervallet för en händelse. Varje mikrokontroller har en klocka (oscillator), säg i Arduino Uno att den är 16Mhz. Detta är ansvaret för hastigheten. Högre klockfrekvens högre blir bearbetningshastigheten. En timer använder räknare som räknas med viss hastighet beroende på klockfrekvensen. I Arduino Uno tar det 1/16000000 sekunder eller 62 nano sekunder att göra en enda räkning. Betydelse Arduino går från en instruktion till en annan instruktion för varje 62 nano-sekund.
Timers i Arduino UNO:
I Arduino UNO finns det tre timers som används för olika funktioner.
Timer0:
Det är en 8-bitars timer och används i timerfunktion som fördröjning (), millis ().
Timer1:
Det är en 16-bitars timer och används i servobiblioteket.
Timer2:
Det är en 8-bitars timer och används i tonfunktionen ().
Arduino timerregister
För att ändra konfigurationen av timrarna används timerregister.
1. Timer / Counter Control Registers (TCCRnA / B):
Detta register innehåller timerns huvudsakliga kontrollbitar och används för att styra timerns förskalare. Det gör det också möjligt att styra timerläget med hjälp av WGM-bitarna.
Ramformat:
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 |
Förskalare:
CS12-, CS11-, CS10-bitarna i TCCR1B ställer in förskalningsvärdet. En förkalkare används för att ställa in klockhastigheten för timern. Arduino Uno har förskalare på 1, 8, 64, 256, 1024.
CS12 | CS11 | CS10 | ANVÄNDA SIG AV |
0 | 0 | 0 | Ingen klocktimer STOPP |
0 | 0 | 1 | CLCK i / o / 1 Ingen förskalning |
0 | 1 | 0 | CLK i / o / 8 (från prescaler) |
0 | 1 | 1 | CLK i / o / 64 (från prescaler) |
1 | 0 | 0 | CLK i / o / 256 (från prescaler) |
1 | 0 | 1 | CLK i / o / 1024 (Från prescaler) |
1 | 1 | 0 | Extern klockkälla på T1-stift. Klocka på fallande kant |
1 | 1 | 1 | Extern klockkälla på T1-stift. Klocka på stigande kant. |
2. Timer / Counter Register (TCNTn)
Detta register används för att styra räknarvärdet och för att ställa in ett förladdningsvärde.
Formel för förladdningsvärde för erforderlig tid i sekund:
TCNTn = 65535 - (16x10 10 xTime in sec / Prescaler Value)
Så här beräknar du förladdningsvärdet för timer1 för tiden på 2 sekunder:
TCNT1 = 65535 - (16x10 10 x2 / 1024) = 34285
Arduino Timer avbryter
Vi har tidigare lärt oss om Arduino Interrupts och har sett att Timer-interrupt är typ av programavbrott. Det finns olika timeravbrott i Arduino som förklaras nedan.Timer Overflow Interrupt:
När timern når sitt maximala värde, säg till exempel (16 Bit-65535), inträffar Timer Overflow Interrupt . Så kallas en ISR-avbrottsrutin när Timer Overflow Interrupt-bit aktiverad i TOIEx närvarande i timeravbrottsmaskregistret TIMSKx.
ISR-format:
ISR (TIMERx_OVF_vect) { }
Output Compare Register (OCRnA / B):
Här när Output Compare Match Interrupt inträffar så kallas avbrottstjänsten ISR (TIMERx_COMPy_vect) och OCFxy-flaggbiten kommer att ställas in i TIFRx-registret. Denna ISR aktiveras genom att ställa in aktiveringsbit i OCIExy närvarande i TIMSKx-registret. Där TIMSKx är Timer Interrupt Mask Register.
Inspelning av timerinmatning:
Därefter när timern Input Capture Interrupt inträffar anropas avbrottstjänsten ISR (TIMERx_CAPT_vect) och ICFx-flaggbiten ställs in i TIFRx (Timer Interrupt Flag Register). Denna ISR aktiveras genom att ställa in aktiveringsbiten i ICIEx som finns i TIMSKx-registret.
Komponenter krävs
- Arduino UNO
- Tryckknappar (2)
- LED (valfri färg)
- 10k motstånd (2), 2.2k (1)
- 16x2 LCD-skärm
Kretsschema
Kretsförbindelser mellan Arduino UNO och 16x2 LCD-skärm:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Till potentiometer mittstift för kontraststyrning av LCD |
RS |
8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
A |
+ 5V |
K |
GND |
Två tryckknappar med nedåtriktade motstånd på 10K är anslutna till Arduino-stiften 2 & 4 och en LED är ansluten till PIN 7 i Arduino via ett 2,2K-motstånd.
Installationen kommer att se ut som på bilden nedan.
Programmering av Arduino UNO-timer
I denna handledning kommer vi att använda TIMER OVERFLOW INTERRUPT och använda den för att blinka lysdioden PÅ och AV under en viss tid genom att justera förladdningsvärdet (TCNT1) med tryckknappar. Komplett kod för Arduino Timer ges i slutet. Här förklarar vi koden rad för rad:
Eftersom 16x2 LCD används i projektet för att visa förladdningsvärdet så används flytande kristallbibliotek.
#omfatta
LED-anodstiftet som är anslutet till Arduino-stift 7 definieras som ledPin .
#define ledPin 7
Därefter förklaras objektet för åtkomst till flytande kristallklass med LCD-stiften (RS, E, D4, D5, D6, D7) som är anslutna till Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
Ställ sedan in förladdningsvärdet 3035 i 4 sekunder. Kontrollera formeln ovan för att beräkna förladdarens värde.
flottörvärde = 3035;
Nästa i ogiltig installation (), ställ först LCD-skärmen i 16x2-läge och visa ett välkomstmeddelande i några sekunder.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("ARDUINO TIMERS"); fördröjning (2000); lcd.clear ();
Ställ sedan in LED-stiftet som OUTPUT-stift och tryckknapparna ställs in som INPUT-stift
pinMode (ledPin, OUTPUT); pinMode (2, INPUT); pinMode (4, INPUT);
Nästa inaktivera alla avbrott:
noInterrupts ();
Därefter initialiseras Timer1.
TCCR1A = 0; TCCR1B = 0;
Förladdarens timervärde är inställt (initialt som 3035).
TCNT1 = värde;
Därefter ställs Pre scaler-värdet 1024 in i TCCR1B-registret.
TCCR1B - = (1 << CS10) - (1 << CS12);
Timeröverskridningsavbrottet är aktiverat i Timer Interrupt Mask-registret så att ISR kan användas.
TIMSK1 - = (1 << TOIE1);
Äntligen är alla avbrott aktiverade.
avbryter ()
Skriv nu ISR för Timer Overflow Interrupt som är ansvarig för att tända och stänga av LED med digitalWrite . Tillståndet ändras varje gång avbrottet för timeröverflödet uppstår.
ISR (TIMER1_OVF_vect) { TCNT1 = värde; digitalWrite (ledPin, digitalRead (ledPin) ^ 1); }
I tomrumsslingan () ökas eller minskas värdet på förladdaren med hjälp av tryckknappsingångarna och värdet visas också på 16x2 LCD.
om (digitalRead (2) == HÖG) { värde = värde + 10; // Förlängningsvärde för incement } om (digitalRead (4) == HIGH) { value = value-10; // Minska förspänningsvärde } lcd.setCursor (0,0); lcd.print (värde); }
Så detta är hur en timer kan användas för att producera fördröjning i Arduino-programmet. Kontrollera videon nedan där vi har visat förändringen i fördröjning genom att öka och minska förladdarens värde med hjälp av tryckknappar.