Indholdsfortegnelse:
- Trin 1: Beskrivelse
- Trin 2: Problemmeddelelse 1: Lad os blinke første LED (grøn) Hver 50. ms
- Trin 3: Problemformulering 2: Lad os blinke anden LED (blå) hver 1
- Trin 4: Problemformulering 3: Lad os blinke tredje LED (rød) hver 16. ms
- Trin 5: Skrivning af kode for et program i C. Upload af HEX -fil i mikrokontrollerens flash -hukommelse
- Trin 6: Lav det elektriske kredsløb
Video: AVR mikrokontroller. LED'er blinker ved hjælp af timer. Timere afbryder. Timer CTC -tilstand: 6 trin
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:28
Hej allesammen!
Timere er et vigtigt begreb inden for elektronik. Hver elektronisk komponent fungerer på et tidsgrundlag. Denne tidsbase hjælper med at holde alt arbejdet synkroniseret. Alle mikrokontrollerne arbejder med en foruddefineret urfrekvens, de har alle en bestemmelse til at konfigurere timere. AVR kan prale af at have en timer, der er meget præcis, præcis og pålidelig. Det tilbyder masser af funktioner i det, hvilket gør det til et stort emne. Den bedste del er, at timeren er helt uafhængig af CPU'en. Således kører den parallelt med CPU'en, og der er ingen CPU's intervention, hvilket gør timeren ret præcis. I dette afsnit forklarer jeg de grundlæggende begreber for AVR -timere. Jeg skriver et enkelt program i C -kode til styring af LED -blink, ved hjælp af timere.
Trin 1: Beskrivelse
I ATMega328 er der tre typer af timere:
Timer/Counter0 (TC0) - er et generelt 8 -bit Timer/Counter -modul med to uafhængige OutputCompare Units og PWM -understøttelse;
Timer/Counter1 (TC1) - 16 -bit Timer/Counter -enheden tillader præcis programkørselstiming (hændelsesstyring), bølgegenerering og signaltiming;
Timer/Counter2 (TC2) -er et generelt formål, kanal, 8 -bit Timer/Counter -modul med PWM og asynkron drift;
Trin 2: Problemmeddelelse 1: Lad os blinke første LED (grøn) Hver 50. ms
Metode:
- brug af en Timer0 -forkalkningsmaskine til at reducere et højfrekvent elektrisk signal til en lavere frekvens ved heltal division;
- ved hjælp af en afbrydelse hver gang Timer0 flyder over;
Timer0 (8 bit) det tæller fra 0 til 255 efter det, de flyder over, denne værdi ændres ved hver urpuls.
F_CPU = 16MHz: Urperiode = 1000ms / 16000000Hz = 0.0000625ms
Timerantal = (Påkrævet forsinkelse / urperiode) -1 = (50ms / 0.0000625ms) = 799999
Uret har allerede tikket 799999 gange for at give en forsinkelse på kun 50 ms!
Vi kan bruge teknikken til frekvensdeling kaldes forskalering for at reducere timertallet. AVR'en tilbyder os følgende prescaler -værdier at vælge imellem: 8, 64, 256 og 1024. Se tabellen opsummerer resultaterne af brug af forskellige prescalers.
Tællerværdien skal altid være et heltal. Lad os vælge en prescaler 256!
I de fleste mikrokontrollere er der noget, der hedder Afbrydelse. Denne afbrydelse kan affyres, når visse betingelser er opfyldt. Nu når en afbrydelse udløses, stopper AVR'en og gemmer dens udførelse af hovedrutinen, tager sig af afbrydelsesopkaldet (ved at udføre en særlig rutine, kaldet Interrupt Service Routine, ISR), og når den er færdig med den, vender den tilbage til hovedrutine og fortsætter med at udføre den.
Da den nødvendige forsinkelse (50 ms) er større end den maksimalt mulige forsinkelse: 4, 096 ms = 1000 ms / 62500Hz * 256, vil timeren naturligvis flyde over. Og når timeren flyder over, affyres en afbrydelse.
Hvor mange gange skal afbrydelsen affyres?
50ms / 4.096ms = 3125 /256 = 12.207 Hvis timeren er overløbet 12 gange, ville 12 * 4.096ms = 49.152ms være gået. I den 13. iteration har vi brug for en forsinkelse på 50ms - 49,152ms = 0,848ms.
Ved en frekvens på 62500Hz (prescaler = 256) tager hvert kryds 0,016 ms. For at opnå en forsinkelse på 0,848 ms ville det derfor kræve 0,848 ms / 0,016 ms = 53 flåter. I den 13. iteration tillader vi således kun timeren at tælle op til 53 og derefter nulstille den.
Initialiser timer 0/tæller (se billede):
TCCR0B | = (1 << CS02) // opsætningstimer med prescaler = 256 TCNT0 = 0 // initialiser tæller TIMSK0 | = (1 << TOIE0) // aktiver overløbsafbrydelse sei () // aktiver globale afbrydelser tot_overflow = 0 // initialiser overløbstællervariabel
Trin 3: Problemformulering 2: Lad os blinke anden LED (blå) hver 1
Metode:
- brug af en Timer1 -forkalkningsmaskine til at reducere et højfrekvent elektrisk signal til en lavere frekvens ved heltalsdeling;
- brug af Clear Timer i sammenligningstilstand (CTC);
- brug af afbrydelser med CTC -tilstand;
Timer1 (16 bit) det tæller fra 0 til 65534 efter det flyder de over. Denne værdi ændres ved hver urpuls.
F_CPU = 16MHz: Urperiode = 1000ms / 16000000Hz = 0.0000625msTimerantal = (Påkrævet forsinkelse / urperiode) -1 = (1000ms / 0.0000625ms) = 15999999
Uret har allerede tikket 15999999 gange for at give en forsinkelse på 1s!
Vi kan bruge teknikken til frekvensdeling kaldes forskalering for at reducere timertallet. AVR'en tilbyder os følgende prescaler -værdier at vælge imellem: 8, 64, 256 og 1024. Se tabellen opsummerer resultaterne af brug af forskellige prescalers. Tællerværdien skal altid være et heltal. Lad os vælge en prescaler 256!
I Clear timer i sammenligningstilstanden (CTC) bruges OCR1A eller ICR1 -registret til at manipulere tælleropløsningen. I CTC -tilstand slettes tælleren til nul, når tællerværdien (TCNT1) matcher enten OCR1A eller ICR1. OCR1A eller ICR1 definerer topværdien for tælleren, derfor også dens opløsning. Denne tilstand tillader større kontrol af sammenligningsudgangsfrekvensen. Det forenkler også betjeningen af optælling af eksterne hændelser. Vi skal fortælle AVR'en at nulstille Timer1/Counter, så snart dens værdi når værdi 62500, og dermed opnå en forsinkelse på 1s.
Initialiser Timer1/Tæller (se billede):
TCCR1B | = (1 << WGM12) | (1 << CS12) // opsætningstimer med prescaler = 256 og CTC -tilstand TCNT1 = 0 // initialiser tæller TIMSK1 | = (1 << OCIE1A) // aktiver sammenligne afbryd OCR1A = 62500 // initialiser sammenligningsværdi
Trin 4: Problemformulering 3: Lad os blinke tredje LED (rød) hver 16. ms
Metode:
- brug af en Timer2 -forkalkningsmaskine til at reducere et højfrekvent elektrisk signal til en lavere frekvens ved heltalsdeling;
- brug af Clear Timer i sammenligningstilstand (CTC);
- brug af hardware CTC -tilstand uden afbrydelser;
Timer2 (8 bit) det tæller fra 0 til 255 efter det, de flyder over. Denne værdi ændres ved hver urpuls.
F_CPU = 16MHz: Urperiode = 1000ms / 16000000Hz = 0.0000625ms
Timerantal = (Påkrævet forsinkelse / urperiode) -1 = (16ms / 0.0000625ms) = 255999
Uret har allerede tikket 255999 gange for at give en forsinkelse på 16ms!
Se tabellen opsummerer resultaterne af brug af forskellige prescalers. Tællerværdien skal altid være et helt tal. Lad os vælge en prescaler 1024!
I CTC -tilstand slettes tælleren til nul, når tællerværdien (TCNT2) matcher enten OCR2A eller ICR2. Pin PB3 er også Output Compare pin af TIMER2 - OC2A (se diagram).
Timer/Counter2 kontrolregister A - TCCR2A Bit 7: 6 - COM2A1: 0 - Sammenlign udgangstilstand for sammenligningsenhed A. Da vi skal skifte lysdioden, vælger vi indstillingen: Skift OC2A til sammenligning af match Når en sammenligning finder sted, vil OC2A -pin skiftes automatisk. Ingen grund til at kontrollere nogen flagbit, ingen grund til at tage sig af eventuelle afbrydelser.
Initialiser Timer2/Tæller
TCCR2A | = (1 << COM2A0) | (1 << WGM21) // opsætning af timer OC2A -pin i skiftemodus og CTC -tilstand TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20) // opsætningstimer med prescaler = 1024 TCNT2 = 0 // initialiseringstæller OCR2A = 250 // initialiser sammenligningsværdi
Trin 5: Skrivning af kode for et program i C. Upload af HEX -fil i mikrokontrollerens flash -hukommelse
Skrivning og opbygning af AVR -mikrokontrollerprogrammet i C -kode ved hjælp af den integrerede udviklingsplatform - Atmel Studio.
F_CPU definerer urfrekvensen i Hertz og er almindelig i programmer, der bruger avr-libc-biblioteket. I dette tilfælde bruges det af forsinkelsesrutinerne til at bestemme, hvordan man beregner forsinkelser.
#ifndef F_CPU
#define F_CPU 16000000UL // fortæller controller krystalfrekvens (16 MHz AVR ATMega328P) #endif
#include // header for at aktivere dataflowkontrol over pins. Definerer stifter, porte osv.
Den første include-fil er en del af avr-libc og vil blive brugt i stort set ethvert AVR-projekt, du arbejder på. io.h bestemmer den CPU, du bruger (derfor angiver du delen, når du kompilerer) og inkluderer igen det relevante IO -definitionsoverskrift til den chip, vi bruger. Det definerer simpelthen konstanterne for alle dine pins, porte, specielle registre osv.
#include // header for at aktivere afbrydelse
flygtig uint8_t tot_overflow; // global variabel til at tælle antallet af overløb
Metode til problemformulering: Flash First (grøn) LED hver 50 ms
- brug af en Timer0 -forkalkningsmaskine til at reducere et højfrekvent elektrisk signal til en lavere frekvens ved heltal division;
- ved hjælp af en afbrydelse hver gang Timer0 flyder over;
ugyldig timer0_init () // initialiser timer0, afbrydelse og variabel
{TCCR0B | = (1 << CS02); // opsætningstimer med prescaler = 256 TCNT0 = 0; // initialiser tæller TIMSK0 | = (1 << TOIE0); // aktiver overløb nterrupt sei (); // aktiver globale afbrydelser tot_overflow = 0; // initialiser overløbstællervariabel}
Metode til problemformulering: Flash -anden LED (blå) hver 1. sekund
- brug af en Timer1 -forkalkningsmaskine til at reducere et højfrekvent elektrisk signal til en lavere frekvens ved heltalsdeling;
- brug af Clear Timer i sammenligningstilstand (CTC);
- brug af afbrydelser med CTC -tilstand;
ugyldig timer1_init () // initialiser timer1, afbrydelse og variabel {TCCR1B | = (1 << WGM12) | (1 << CS12); // opsætningstimer med prescaler = 256 og CTC -tilstand TCNT1 = 0; // initialiser tæller OCR1A = 62500; // initialiser sammenligningsværdien TIMSK1 | = (1 << OCIE1A); // aktiver sammenligningsafbrydelse}
Metode til problemformulering: Flash tredje LED (rød) hver 16. ms
- brug af en Timer2 -forkalkningsmaskine til at reducere et højfrekvent elektrisk signal til en lavere frekvens ved heltalsdeling;
- brug af Clear Timer i sammenligningstilstand (CTC);
- brug af hardware CTC -tilstand uden afbrydelser;
ugyldig timer2_init () // initialiser timer2 {TCCR2A | = (1 << COM2A0) | (1 << WGM21); // konfigurer timer OC2A -pin i skiftemodus og CTC -tilstand TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20); // opsætningstimer med prescaler = 1024 TCNT2 = 0; // initialiser tæller OCR2A = 250; // initialiser sammenligningsværdi}
TIMER0 overløbsafbrydelsesrutine kaldes, når TCNT0 flyder over:
ISR (TIMER0_OVF_vect)
{tot_overflow ++; // holde styr på antallet af overløb}
Denne ISR affyres, hver gang der opstår en kamp, og skiften førte her til sig selv:
ISR (TIMER1_COMPA_vect) {PORTC ^= (1 << 1); // skift mellem her}
int main (tomrum)
{DDRB | = (1 << 0); // tilslut 1 (grøn) førte til pin PB0 DDRC | = (1 << 1); // tilslut 2 (blå) førte til pin PC1 DDRB | = (1 << 3); // tilslut 3 (rød) til pin PB3 (OC2A) timer0_init (); // initialiser timer0 timer1_init (); // initialiser timer1 timer2_init (); // initialiser timer2, mens (1) // loop for altid {
Hvis Timer0 er overløbet 12 gange, ville 12 * 4.096ms = 49.152ms være gået. I den 13. iteration har vi brug for en forsinkelse på 50ms - 49,152ms = 0,848ms. I den 13. iteration tillader vi således kun timeren at tælle op til 53 og derefter nulstille den.
hvis (tot_overflow> = 12) // tjek om nej. af overløb = 12 BEMÆRK: '> =' bruges
{if (TCNT0> = 53) // kontrollere om timertallet når 53 {PORTB ^= (1 << 0); // skifter LED TCNT0 = 0; // nulstil tæller tot_overflow = 0; // nulstil overløbstæller}}}}
Upload af HEX -fil i mikrokontrollerens flash -hukommelse:
skriv kommandoen i DOS -promptvinduet:
avrdude –c [navn på programmør] –p m328p –u –U flash: w: [navn på din hex -fil] I mit tilfælde er det: avrdude –c ISPProgv1 –p m328p –u –U flash: w: Timers.hex
Denne kommando skriver hex -fil til mikrokontrollerens hukommelse. Se videoen med en detaljeret beskrivelse af mikrokontrollerens flash -hukommelse, der brænder:
Mikrokontroller flash -hukommelse brænder …
Okay! Nu fungerer mikrokontrolleren i overensstemmelse med instruktionerne i vores program. Lad os tjekke det ud!
Trin 6: Lav det elektriske kredsløb
Tilslut komponenter i henhold til skematisk diagram.
Anbefalede:
DIY -- Sådan laver du en edderkoprobot, der kan kontrolleres ved hjælp af smartphone ved hjælp af Arduino Uno: 6 trin
DIY || Sådan laver du en edderkoprobot, der kan styres ved hjælp af smartphone Brug af Arduino Uno: Mens du laver en edderkoprobot, kan man lære så mange ting om robotik. Ligesom at lave robotter er underholdende såvel som udfordrende. I denne video vil vi vise dig, hvordan du laver en Spider -robot, som vi kan betjene ved hjælp af vores smartphone (Androi
Kontrol ledt over hele verden ved hjælp af internet ved hjælp af Arduino: 4 trin
Kontrol ledt over hele verden ved hjælp af internet ved hjælp af Arduino: Hej, jeg er Rithik. Vi kommer til at lave en internetstyret LED ved hjælp af din telefon. Vi kommer til at bruge software som Arduino IDE og Blynk.Det er enkelt, og hvis det lykkedes dig, kan du styre så mange elektroniske komponenter, du ønskerTing We Need: Hardware:
Sådan laver du en drone ved hjælp af Arduino UNO - Lav en quadcopter ved hjælp af mikrokontroller: 8 trin (med billeder)
Sådan laver du en drone ved hjælp af Arduino UNO | Lav en Quadcopter ved hjælp af mikrokontroller: Introduktion Besøg min Youtube -kanal En Drone er en meget dyr gadget (produkt) at købe. I dette indlæg vil jeg diskutere, hvordan jeg gør det billigt ?? Og hvordan kan du lave din egen sådan til en billig pris … Nå i Indien alle materialer (motorer, ESC'er
AVR mikrokontroller. Skift LED'er ved hjælp af en trykknapkontakt. Push Button Debouncing .: 4 trin
AVR mikrokontroller. Skift LED'er ved hjælp af en trykknapkontakt. Push Button Debouncing .: I dette afsnit lærer vi, hvordan man laver program C -kode til ATMega328PU for at skifte status for de tre lysdioder i henhold til input fra en knapkontakt. Vi har også undersøgt en løsning på problemet med 'Switch Bounce'. Som normalt vil vi
Konfiguration af AVR -mikrokontroller -sikringsbits. Oprettelse og upload i Flash -hukommelsen af mikrokontroller LED -blinkende program .: 5 trin
Konfiguration af AVR -mikrokontroller -sikringsbits. Oprettelse og upload i Flash -hukommelsen til mikrokontrolleren LED -blinkende program .: I dette tilfælde opretter vi et enkelt program i C -kode og brænder det ind i hukommelsen til mikrokontrolleren. Vi vil skrive vores eget program og kompilere hex -filen ved hjælp af Atmel Studio som den integrerede udviklingsplatform. Vi konfigurerer sikring bi