- Hva er TIMER i innebygd elektronikk?
- Arduino Timer Registers
- Arduino Timer avbryter
- Komponenter kreves
- Kretsdiagram
- Programmering av Arduino UNO-timere
Arduino Development Platform ble opprinnelig utviklet i 2005 som en brukervennlig programmerbar enhet for kunstdesignprosjekter. Hensikten var å hjelpe ikke-ingeniører til å jobbe med grunnleggende elektronikk og mikrokontrollere uten mye programmeringskunnskap. Men på grunn av den brukervennlige naturen ble den snart tilpasset av elektronikkbegynnere og hobbyister over hele verden, og i dag er den til og med foretrukket for utvikling av prototype og POC-utvikling.
Selv om det er greit å begynne med Arduino, er det viktig å sakte bevege seg inn i kjernemikrokontrollere som AVR, ARM, PIC, STM osv. Og programmere den ved hjelp av de opprinnelige applikasjonene. Dette er fordi Arduino-programmeringsspråket er veldig lett å forstå, da det meste av arbeidet gjøres av forhåndsbygde funksjoner som digitalWrite (), AnalogWrite (), Delay () etc. mens maskinspråket på lavt nivå er skjult bak dem. Arduino-programmene ligner ikke på andre Embedded C-kodinger der vi håndterer registerbiter og gjør dem høye eller lave basert på logikken til programmet vårt.
Arduino-tidtakere uten forsinkelse:
Derfor, for å forstå hva som skjer i de forhåndsbygde funksjonene, trenger vi å grave bak disse vilkårene. For eksempel når en forsinkelsesfunksjon () brukes, setter den faktisk timer og tellerregisterbitene til ATmega-mikrokontrolleren.
I denne arduino timeropplæringen skal vi unngå bruk av denne delay () -funksjonen og i stedet faktisk håndtere registerene selv. Det gode er at du kan bruke den samme Arduino IDE til dette. Vi stiller inn timer-registerbitene våre og bruker Timer Overflow Interrupt for å slå på en LED hver gang avbruddet oppstår. Forlasterverdien til Timer-biten kan også justeres ved hjelp av trykknapper for å kontrollere varigheten avbruddet oppstår.
Hva er TIMER i innebygd elektronikk?
Timer er litt avbrutt. Det er som en enkel klokke som kan måle tidsintervallet til en hendelse. Hver mikrokontroller har en klokke (oscillator), si i Arduino Uno det er 16Mhz. Dette er ansvarlig for hastighet. Høyere klokkefrekvens høyere vil være behandlingshastigheten. En tidtaker bruker teller som teller med en viss hastighet avhengig av klokkefrekvensen. I Arduino Uno tar det 1/16000000 sekunder eller 62 nano sekunder å gjøre en enkelt telling. Betydning Arduino beveger seg fra en instruksjon til en annen instruksjon for hvert 62 nano-sekund.
Tidtakere i Arduino UNO:
I Arduino UNO er det tre tidtakere som brukes til forskjellige funksjoner.
Tidtaker0:
Det er en 8-bits tidtaker og brukes i timerfunksjonen som forsinkelse (), millis ().
Tidtaker1:
Det er en 16-bit timer og brukes i servobiblioteket.
Timer2:
Det er en 8-bit timer og brukes i tone () -funksjonen.
Arduino Timer Registers
For å endre konfigurasjonen av tidtakerne, brukes tidtakerregistre.
1. Timer / Counter Control Registers (TCCRnA / B):
Dette registeret inneholder de viktigste kontrollbitene til tidtakeren og brukes til å styre prescalers av tidtakeren. Det gjør det også mulig å kontrollere timeren ved hjelp av WGM-bitene.
Rammeformat:
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:
CS12-, CS11-, CS10-bitene i TCCR1B angir prescaler-verdien. En prescaler brukes til å stille inn klokkehastigheten til tidtakeren. Arduino Uno har prescalers på 1, 8, 64, 256, 1024.
CS12 | CS11 | CS10 | BRUK |
0 | 0 | 0 | Ingen tidtaker STOPP |
0 | 0 | 1 | CLCK i / o / 1 Ingen forhåndsskalering |
0 | 1 | 0 | CLK i / o / 8 (fra prescaler) |
0 | 1 | 1 | CLK i / o / 64 (fra prescaler) |
1 | 0 | 0 | CLK i / o / 256 (fra prescaler) |
1 | 0 | 1 | CLK i / o / 1024 (fra prescaler) |
1 | 1 | 0 | Ekstern klokkilde på T1 Pin. Klokke på fallende kant |
1 | 1 | 1 | Ekstern klokkilde på T1-pin. Klokke på stigende kant. |
2. Timer / Counter Register (TCNTn)
Dette registeret brukes til å kontrollere tellerverdien og til å sette en forhåndslasterverdi.
Formel for forhåndslasterverdi for ønsket tid i sekund:
TCNTn = 65535 - (16x10 10 xTime in sec / Prescaler Value)
Slik beregner du forhåndslasterverdien for timer1 for tiden på 2 sekunder:
TCNT1 = 65535 - (16x10 10 x2 / 1024) = 34285
Arduino Timer avbryter
Vi har tidligere lært om Arduino Interrupts og har sett at Timer interrupts er slags programvareavbrudd. Det er forskjellige timeravbrudd i Arduino som er forklart nedenfor.Timer Overflow Interrupt:
Når timeren når sin maksimale verdi, for eksempel (16 bit-65535), oppstår Timer Overflow Interrupt . Så kalles en ISR-avbruddsrutiner når Timer Overflow Interrupt-bit aktivert i TOIEx til stede i timer-avbruddsmaskregister TIMSKx.
ISR-format:
ISR (TIMERx_OVF_vect) { }
Output Compare Register (OCRnA / B):
Her når Output Compare Match Interrupt oppstår, blir avbruddstjenesten ISR (TIMERx_COMPy_vect) kalt, og OCFxy-flaggbit vil også bli satt i TIFRx-registeret. Denne ISR er aktivert ved å sette aktiveringsbit i OCIExy til stede i TIMSKx-registeret. Hvor TIMSKx er Timer Interrupt Mask Register.
Fange timerinngang:
Når timeren Input Capture Interrupt oppstår, blir avbruddstjenesten ISR (TIMERx_CAPT_vect) kalt, og ICFx-flaggbiten vil også bli satt i TIFRx (Timer Interrupt Flag Register). Denne ISR aktiveres ved å sette aktiveringsbiten i ICIEx til stede i TIMSKx-registeret.
Komponenter kreves
- Arduino UNO
- Trykknapper (2)
- LED (hvilken som helst farge)
- 10k motstand (2), 2.2k (1)
- 16x2 LCD-skjerm
Kretsdiagram
Kretsforbindelser mellom Arduino UNO og 16x2 LCD-skjerm:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Til potensiometer senterstift for kontrastkontroll av LCD |
RS |
8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
1. 3 |
EN |
+ 5V |
K |
GND |
To trykknapper med nedtrekkbare motstander på 10K er koblet til Arduino-pinnene 2 og 4, og en LED er koblet til PIN 7 på Arduino gjennom en 2,2K motstand.
Oppsettet vil se ut som under bildet.
Programmering av Arduino UNO-timere
I denne opplæringen vil vi bruke TIMER OVERFLOW INTERRUPT og bruke den til å blinke LED PÅ og AV i en viss periode ved å justere forhåndslasterverdien (TCNT1) ved hjelp av trykknapper. Komplett kode for Arduino Timer er gitt på slutten. Her forklarer vi koden linje for linje:
Ettersom 16x2 LCD brukes i prosjektet for å vise forhåndslasterverdien, brukes derfor flytende krystallbibliotek.
#inkludere
LED- anodepinnen som er koblet til Arduino pin 7 er definert som ledPin .
#define ledPin 7
Deretter blir objektet for tilgang til flytende krystallklasse erklært med LCD-pinnene (RS, E, D4, D5, D6, D7) som er koblet til Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
Still deretter inn forhåndslasterverdien 3035 i 4 sekunder. Sjekk formelen ovenfor for å beregne forhåndslasterverdien.
flyteverdi = 3035;
Neste i ugyldig oppsett (), sett først LCD-skjermen i 16x2-modus og vis en velkomstmelding i noen sekunder.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("ARDUINO TIMERS"); forsinkelse (2000); lcd.clear ();
Sett deretter LED-pinnen som OUTPUT-pinne, og trykknappene er angitt som INPUT-pinner
pinMode (ledPin, OUTPUT); pinMode (2, INPUT); pinMode (4, INPUT);
Deaktiver deretter alle avbruddene:
noInterrupts ();
Deretter initialiseres Timer1.
TCCR1A = 0; TCCR1B = 0;
Verdien til forhåndslasterens tid er satt (opprinnelig som 3035).
TCNT1 = verdi;
Deretter blir Pre scaler-verdien 1024 satt i TCCR1B-registeret.
TCCR1B - = (1 << CS10) - (1 << CS12);
Timer overflow interrupt er aktivert i Timer Interrupt Mask registeret slik at ISR kan brukes.
TIMSK1 - = (1 << TOIE1);
Til slutt er alle avbrudd aktivert.
avbryter ();
Skriv nå ISR for Timer Overflow Interrupt som er ansvarlig for å slå LED PÅ og AV ved hjelp av digitalWrite . Tilstanden endres hver gang avbrudd for tidtakeroverløp oppstår.
ISR (TIMER1_OVF_vect) { TCNT1 = verdi; digitalWrite (ledPin, digitalRead (ledPin) ^ 1); }
I tomgangssløyfen () økes eller reduseres verdien til forhåndslaster ved å bruke trykknappinngangene, og verdien vises også på 16x2 LCD.
hvis (digitalRead (2) == HIGH) { verdi = verdi + 10; // Incement preload value } if (digitalRead (4) == HIGH) { value = value-10; // Reduser forhåndsbelastningsverdi } lcd.setCursor (0,0); lcd.print (verdi); }
Så dette er hvordan en timer kan brukes til å produsere forsinkelse i Arduino-programmet. Sjekk videoen nedenfor der vi har demonstrert endringen i forsinkelse ved å øke og redusere forhåndslasterverdien ved hjelp av trykknapper.