Indholdsfortegnelse:

AVR mikrokontroller. LED'er blinker ved hjælp af timer. Timere afbryder. Timer CTC -tilstand: 6 trin
AVR mikrokontroller. LED'er blinker ved hjælp af timer. Timere afbryder. Timer CTC -tilstand: 6 trin

Video: AVR mikrokontroller. LED'er blinker ved hjælp af timer. Timere afbryder. Timer CTC -tilstand: 6 trin

Video: AVR mikrokontroller. LED'er blinker ved hjælp af timer. Timere afbryder. Timer CTC -tilstand: 6 trin
Video: LDmicro 13: HC-05 Bluetooth Phone App Control (Microcontroller PLC Ladder Programming with LDmicro) 2024, Juni
Anonim
Image
Image

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

Problemmeddelelse 1: Lad os blinke første LED (grøn) Hver 50. ms
Problemmeddelelse 1: Lad os blinke første LED (grøn) Hver 50. ms

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

Problemformulering 1: Lad os blinke første LED (grøn) Hver 50. ms
Problemformulering 1: Lad os blinke første LED (grøn) Hver 50. ms
Problemformulering 1: Lad os blinke første LED (grøn) Hver 50. ms
Problemformulering 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

Problemformulering 2: Lad os blinke anden LED (blå) hver 1
Problemformulering 2: Lad os blinke anden LED (blå) hver 1
Problemformulering 2: Lad os blinke anden LED (blå) hver 1
Problemformulering 2: Lad os blinke anden LED (blå) hver 1
Problemformulering 2: Lad os blinke anden LED (blå) hver 1
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

Problemformulering 3: Lad os blinke tredje LED (rød) hver 16. ms
Problemformulering 3: Lad os blinke tredje LED (rød) hver 16. ms
Problemformulering 3: Lad os blinke tredje LED (rød) hver 16. ms
Problemformulering 3: Lad os blinke tredje LED (rød) hver 16. ms
Problemformulering 3: Lad os blinke tredje LED (rød) hver 16. ms
Problemformulering 3: Lad os blinke tredje LED (rød) hver 16. ms
Problemformulering 3: Lad os blinke tredje LED (rød) hver 16. ms
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 af kode for et program i C. Upload af HEX -fil i mikrokontrollerens flash -hukommelse
Skrivning af kode for et program i C. Upload af HEX -fil i mikrokontrollerens flash -hukommelse
Skrivning af kode for et program i C. Upload af HEX -fil i mikrokontrollerens flash -hukommelse
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

Lav det elektriske kredsløb
Lav det elektriske kredsløb
Lav det elektriske kredsløb
Lav det elektriske kredsløb
Lav det elektriske kredsløb
Lav det elektriske kredsløb

Tilslut komponenter i henhold til skematisk diagram.

Anbefalede: