Tartalomjegyzék:

AVR mikrovezérlő. A LED -ek villognak az időzítő segítségével. Az időzítők megszakítanak. Időzítő CTC mód: 6 lépés
AVR mikrovezérlő. A LED -ek villognak az időzítő segítségével. Az időzítők megszakítanak. Időzítő CTC mód: 6 lépés

Videó: AVR mikrovezérlő. A LED -ek villognak az időzítő segítségével. Az időzítők megszakítanak. Időzítő CTC mód: 6 lépés

Videó: AVR mikrovezérlő. A LED -ek villognak az időzítő segítségével. Az időzítők megszakítanak. Időzítő CTC mód: 6 lépés
Videó: LDmicro 18: Ublox NEO-6M GPS Alarm Clock (Microcontroller PLC Ladder Programming with LDmicro) 2024, November
Anonim
Image
Image

Üdv mindenkinek!

Az időzítők fontos fogalom az elektronika területén. Minden elektronikus alkatrész időalapon működik. Ez az időalap segít minden munkát szinkronban tartani. Minden mikrokontroller valamilyen előre meghatározott órajel -frekvencián működik, mindegyik rendelkezik időzítő beállításával. Az AVR nagyon pontos, pontos és megbízható időzítővel büszkélkedhet. Rengeteg funkciót kínál benne, így ez egy hatalmas téma. A legjobb az egészben, hogy az időzítő teljesen független a CPU -tól. Így párhuzamosan fut a CPU -val, és nincs CPU beavatkozása, ami az időzítőt meglehetősen pontosá teszi. Ebben a részben az AVR időzítők alapfogalmait ismertetem. Egyszerű programot írok C kódban a LED villogó vezérléséhez, időzítők segítségével.

1. lépés: Leírás

1. problémajelentés: Villogjunk először LED -et (zöld) 50 másodpercenként
1. problémajelentés: Villogjunk először LED -et (zöld) 50 másodpercenként

Az ATMega328 -ban háromféle időzítő létezik:

Timer/Counter0 (TC0) - egy általános célú 8 bites időzítő/számláló modul, két független OutputCompare egységgel és PWM támogatással;

Időzítő/számláló1 (TC1) - A 16 bites időzítő/számláló egység lehetővé teszi a pontos programvégrehajtás időzítését (eseménykezelést), a hullámgenerálást és a jel időzítésének mérését;

Timer/Counter2 (TC2) -egy általános célú, csatorna, 8 bites időzítő/számláló modul PWM és aszinkron működéssel;

2. lépés: 1. problémajelentés: Villogjunk először LED -et (zöld) 50 másodpercenként

1. problémajelentés: Villogjunk először LED -et (zöld) 50 másodpercenként
1. problémajelentés: Villogjunk először LED -et (zöld) 50 másodpercenként
1. problémajelentés: Villogjunk először LED -et (zöld) 50 másodpercenként
1. problémajelentés: Villogjunk először LED -et (zöld) 50 másodpercenként

Módszertan:

- Timer0 előskálázó segítségével a nagyfrekvenciás elektromos jelet alacsonyabb frekvenciára kell csökkenteni egész elosztással;

- megszakítás használata minden alkalommal, amikor az Timer0 túlcsordul;

Timer0 (8 bit) ezután 0 -tól 255 -ig számít, túlcsordulnak, ez az érték minden óraimpulzuson változik.

F_CPU = 16MHz: Óraidő = 1000ms / 16000000Hz = 0.0000625ms

Időzítők száma = (Szükséges késleltetés / Óra időtartam) -1 = (50ms / 0.0000625ms) = 799999

Az óra már 799999 alkalommal ketyeg, hogy csak 50 ms késleltetést adjon!

Az időzítők számának csökkentésére használhatjuk a frekvenciaosztás technikáját, amelyet előskálázásnak nevezünk. Az AVR a következő előbeállítási értékeket kínálja számunkra: 8, 64, 256 és 1024. Lásd a táblázatban a különböző előbeosztók használatának eredményeit.

A számláló értékének mindig egész számnak kell lennie. Válasszunk egy előskálázót 256!

A legtöbb mikrokontrollerben van valami megszakítás. Ez a megszakítás akkor indítható, ha bizonyos feltételek teljesülnek. Most, amikor egy megszakítást aktiválnak, az AVR leáll, és elmenti a fő rutin végrehajtását, gondoskodik a megszakítási hívásról (egy speciális rutin végrehajtásával, amelyet megszakítási szolgáltatási rutinnak, ISR -nek hívnak), és ha ez megtörtént, visszatér a fő rutin, és folytatja annak végrehajtását.

Mivel a szükséges késleltetés (50 ms) nagyobb, mint a lehetséges maximális késleltetés: 4, 096 ms = 1000 ms / 62500Hz * 256, nyilvánvalóan az időzítő túlcsordul. És amikor az időzítő túlcsordul, megszakítás indul.

Hányszor kell elbocsátani a megszakítást?

50 ms / 4,096 ms = 3125 /256 = 12,207 Ha az időzítőt 12 -szer túllépték, akkor 12 * 4,096 ms = 49,152 ms telt volna el. A 13. iterációban 50 ms - 49,152 ms = 0,848 ms késleltetésre van szükségünk.

62500 Hz frekvencián (előskálázó = 256) minden kullancs 0,016 ms -ot vesz igénybe. Így a 0,848 ms késleltetés eléréséhez 0,848 ms / 0,016 ms = 53 kullancsra van szükség. Így a 13. iterációban csak azt engedélyezzük, hogy az időzítő 53 -ig számoljon, majd alaphelyzetbe állítsa.

Az időzítő0/számláló inicializálása (lásd a képen):

TCCR0B | = (1 << CS02) // időzítő beállítása előméretezővel = 256 TCNT0 = 0 // számláló inicializálása TIMSK0 | = (1 << TOIE0) // engedélyezze a túlcsordulás megszakítását sei () // globális megszakítások engedélyezése tot_overflow = 0 // inicializálja a túlcsordulás számláló változót

3. lépés: 2. problémajelentés: Villogjunk második LED -et (kék) 1 másodpercenként

2. problémajelentés: Villogjunk második LED -et (kék) 1 másodpercenként
2. problémajelentés: Villogjunk második LED -et (kék) 1 másodpercenként
2. problémajelentés: Villogjon a második LED (kék) 1 másodpercenként
2. problémajelentés: Villogjon a második LED (kék) 1 másodpercenként
2. problémajelentés: Villogjunk második LED -et (kék) 1 másodpercenként
2. problémajelentés: Villogjunk második LED -et (kék) 1 másodpercenként

Módszertan:

- egy Timer1 előskálázó segítségével a nagyfrekvenciás elektromos jelet alacsonyabb frekvenciára kell csökkenteni egész elosztással;

- Clear Timer on Compare (CTC) mód használata;

- megszakítások használata CTC módban;

Timer1 (16 bit) ez 0 -tól 65534 -ig számít, utána túlcsordulnak. Ez az érték minden óraimpulzuson változik.

F_CPU = 16MHz: Óraidő = 1000ms / 16000000Hz = 0.0000625ms

Az óra már 15999999 alkalommal ketyeg, hogy 1 másodperces késést adjon!

Az időzítők számának csökkentésére használhatjuk a frekvenciaosztás technikáját, amelyet előskálázásnak nevezünk. Az AVR a következő előbeállítási értékeket kínálja számunkra: 8, 64, 256 és 1024. Lásd a táblázatban a különböző előbeosztók használatának eredményeit. A számláló értékének mindig egész számnak kell lennie. Válasszunk egy előskálázót 256!

Az időzítő törlése összehasonlításkor (CTC) módban az OCR1A vagy az ICR1 regisztert használják a számláló felbontásának kezelésére. CTC módban a számláló nullára törlődik, ha a számláló értéke (TCNT1) megegyezik az OCR1A vagy az ICR1 értékkel. Az OCR1A vagy az ICR1 határozza meg a számláló felső értékét, tehát a felbontását is. Ez az üzemmód lehetővé teszi az összehasonlító mérkőzés kimeneti frekvenciájának nagyobb szabályozását. Egyszerűsíti a külső események számlálását is. Meg kell mondanunk az AVR -nek, hogy állítsa vissza az időzítőt/számlálót, amint értéke eléri a 62500 értéket, így elérve az 1 másodperces késleltetést.

Az időzítő1/számláló inicializálása (lásd a képen):

TCCR1B | = (1 << WGM12) | (1 << CS12) // időzítő beállítása előskálázóval = 256 és CTC üzemmód = 62500 // inicializálja az összehasonlító értéket

4. lépés: 3. problémajelentés: Villogjon a harmadik LED (piros) 16 ms -onként

3. problémajelentés: Villogjon a harmadik LED (piros) 16 ms -onként
3. problémajelentés: Villogjon a harmadik LED (piros) 16 ms -onként
3. problémajelentés: Villogjon a harmadik LED (piros) 16 ms -onként
3. problémajelentés: Villogjon a harmadik LED (piros) 16 ms -onként
3. problémajelentés: Villogjon a harmadik LED (piros) 16 ms -onként
3. problémajelentés: Villogjon a harmadik LED (piros) 16 ms -onként
3. problémajelentés: Villogjon a harmadik LED (piros) 16 ms -onként
3. problémajelentés: Villogjon a harmadik LED (piros) 16 ms -onként

Módszertan:

- egy Timer2 előskálázó segítségével a nagyfrekvenciás elektromos jelet alacsonyabb frekvenciára kell csökkenteni egész elosztással;

- Clear Timer on Compare (CTC) mód használata;

- hardver CTC mód használata megszakítások nélkül;

Timer2 (8 bit) ez után 0 -tól 255 -ig számít, túlcsordulnak. Ez az érték minden óraimpulzuson változik.

F_CPU = 16MHz: Óraidő = 1000ms / 16000000Hz = 0.0000625ms

Időzítők száma = (Szükséges késleltetés / Óra időtartam) -1 = (16 ms / 0,0000625 ms) = 255999

Az óra már 255999 alkalommal ketyeg, hogy 16 ms késést adjon!

Lásd a táblázatban a különböző előskálázók használatának eredményeit. A számláló értékének mindig egész számnak kell lennie. Válasszunk egy előskálázót 1024!

CTC módban a számláló nullára törlődik, ha a számláló értéke (TCNT2) megegyezik az OCR2A vagy az ICR2 értékkel. A PB3 érintkező a TIMER2 - OC2A kimeneti összehasonlító csapja is (lásd az ábrát).

Időzítő/Counter2 vezérlőregiszter A - TCCR2A Bit 7: 6 - COM2A1: 0 - A kimeneti mód összehasonlítása az A összehasonlító egységhez. Mivel a LED -et át kell kapcsolnunk, ezt a lehetőséget választjuk: Váltás az OC2A -ra az összehasonlítási mérkőzésen Amikor összehasonlító mérkőzés történik, Az OC2A csap automatikusan átkapcsol. Nem kell ellenőrizni a zászló biteket, nem kell foglalkozni a megszakításokkal.

Inicializálja az időzítőt2/számlálót

TCCR2A | = (1 << COM2A0) | (1 << WGM21) // az OC2A időzítő beállítása váltó és CTC módban CS20) // időzítő beállítása előskálázóval = 1024 TCNT2 = 0 // inicializáló számláló OCR2A = 250 // összehasonlító érték inicializálása

5. lépés: Kód írása programhoz C -ben. HEX fájl feltöltése a mikrokontroller flash memóriájába

Programkód írása C -ben. HEX fájl feltöltése a mikrokontroller flash memóriájába
Programkód írása C -ben. HEX fájl feltöltése a mikrokontroller flash memóriájába
Programkód írása C -ben. HEX fájl feltöltése a mikrokontroller flash memóriájába
Programkód írása C -ben. HEX fájl feltöltése a mikrokontroller flash memóriájába

Az AVR mikrokontroller alkalmazás írása és építése C kódban az Atmel Studio integrált fejlesztői platformja segítségével.

Az F_CPU határozza meg az óra frekvenciáját Hertzben, és gyakori az avr-libc könyvtárat használó programokban. Ebben az esetben a késleltetési rutinok határozzák meg, hogyan kell kiszámítani az időkéséseket.

#ifndef F_CPU

#define F_CPU 16000000UL // megmondja a vezérlő kristályfrekvenciáját (16 MHz AVR ATMega328P) #endif

#include // fejléc lehetővé teszi az adatáramlás vezérlését a csapok felett. Meghatározza a csapokat, portokat stb.

Az első include fájl az avr-libc része, és szinte minden AVR projektben használható lesz. Az io.h meghatározza az Ön által használt CPU -t (ezért adja meg az alkatrészt a fordítás során), és tartalmazza a megfelelő IO definíció fejlécet az általunk használt chiphez. Egyszerűen meghatározza az összes pin, port, speciális regiszter stb.

#include // fejléc a megszakítás engedélyezéséhez

illékony uint8_t tot_overflow; // globális változó a túlcsordulások számolásához

A problémamegoldás módszertana: Először villan (zöld) LED 50 ms -onként

- Timer0 előskálázó segítségével a nagyfrekvenciás elektromos jelet alacsonyabb frekvenciára kell csökkenteni egész elosztással;

- megszakítás használata minden alkalommal, amikor az Timer0 túlcsordul;

void timer0_init () // inicializálja az időzítőt0, megszakítás és változó

{TCCR0B | = (1 << CS02); // időzítő beállítása előskálázóval = 256 TCNT0 = 0; // inicializáló számláló TIMSK0 | = (1 << TOIE0); // túlcsordulás engedélyezése nterrupt sei (); // globális megszakítások engedélyezése tot_overflow = 0; // inicializálja a túlcsordulás számláló változót}

A problémamegoldás módszertana: Villanás Második LED (kék) 1 másodpercenként

- egy Timer1 előskálázó segítségével a nagyfrekvenciás elektromos jelet alacsonyabb frekvenciára kell csökkenteni egész elosztással;

- Clear Timer on Compare (CTC) mód használata;

- megszakítások használata CTC módban;

void timer1_init () // inicializálja az időzítőt1, megszakítás és változó {TCCR1B | = (1 << WGM12) | (1 << CS12); // időzítő beállítása prescaler = 256 és CTC módban TCNT1 = 0; // inicializáló számláló OCR1A = 62500; // inicializálja az összehasonlító érték TIMSK1 | = (1 << OCIE1A); // engedélyezze az összehasonlítás megszakítását}

A problémamegoldás módszertana: A harmadik LED (piros) villog 16 ms -onként

- egy Timer2 előskálázó segítségével a nagyfrekvenciás elektromos jelet alacsonyabb frekvenciára kell csökkenteni egész elosztással;

- Clear Timer on Compare (CTC) mód használata;

- hardver CTC mód használata megszakítások nélkül;

void timer2_init () // timer2 inicializálása {TCCR2A | = (1 << COM2A0) | (1 << WGM21); // az OC2A időzítő beállítása váltó és CTC módban TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20); // időzítő beállítása előskálázóval = 1024 TCNT2 = 0; // inicializáló számláló OCR2A = 250; // inicializálja az összehasonlító értéket}

A TIMER0 túlcsordulás megszakítás szolgáltatási rutinja meghívásra kerül, amikor a TCNT0 túlcsordul:

ISR (TIMER0_OVF_vect)

{tot_overflow ++; // nyomon követheti a túlcsordulások számát}

Ez az ISR aktiválódik, amikor egyezés következik be, ezért maga a kapcsoló ide vezet:

ISR (TIMER1_COMPA_vect) {PORTC ^= (1 << 1); // átváltás ide}

int main (void)

{DDRB | = (1 << 0); // csatlakozás 1 (zöld) a PB0 tűhöz vezetett DDRC | = (1 << 1); // csatlakozás 2 (kék) a PC1 tűhöz vezetett DDRB | = (1 << 3); // connect 3 (piros) vezetett a PB3 (OC2A) érintkezőhöz timer0_init (); // inicializálja az időzítőt0 timer1_init (); // timer1 inicializálása timer2_init (); // inicializálja az időzítőt2 while (1) // hurok örökké {

Ha az időzítő0 12 -szer túlrepült, akkor 12 * 4,096 ms = 49,152 ms telt volna el. A 13. iterációban 50 ms - 49,152 ms = 0,848 ms késleltetésre van szükségünk. Így a 13. iterációban csak azt engedélyezzük, hogy az időzítő 53 -ig számoljon, majd állítsa vissza.

if (tot_overflow> = 12) // ellenőrizze, hogy nem. of overflows = 12 MEGJEGYZÉS: '> =' használatos

{if (TCNT0> = 53) // ellenőrizze, hogy az időzítők száma eléri -e az 53 -at {PORTB ^= (1 << 0); // átkapcsolja a led TCNT0 = 0; // számláló visszaállítása tot_overflow = 0; // túlcsordulás számláló visszaállítása}}}}

HEX fájl feltöltése a mikrokontroller flash memóriájába:

írja be a DOS parancssori ablakba a következő parancsot:

avrdude –c [programozó neve] –p m328p –u –U flash: w: [a hexa fájl neve] Az én esetemben ez: avrdude –c ISPProgv1 –p m328p –u –U flash: w: Timers.hex

Ez a parancs hex fájlt ír a mikrokontroller memóriájába. Nézze meg a videót a mikrovezérlő flash memóriájának égetésének részletes leírásával:

A mikrokontroller flash memóriájának égetése…

Rendben! Most a mikrokontroller programunk utasításainak megfelelően működik. Nézzük meg!

6. lépés: Az elektromos áramkör elkészítése

Az elektromos áramkör elkészítése
Az elektromos áramkör elkészítése
Az elektromos áramkör elkészítése
Az elektromos áramkör elkészítése
Az elektromos áramkör elkészítése
Az elektromos áramkör elkészítése

Csatlakoztassa az alkatrészeket a vázlatos rajz szerint.

Ajánlott: