Tartalomjegyzék:
- 1. lépés: Leírás
- 2. lépés: 1. problémajelentés: Villogjunk először LED -et (zöld) 50 másodpercenként
- 3. lépés: 2. problémajelentés: Villogjunk második LED -et (kék) 1 másodpercenként
- 4. lépés: 3. problémajelentés: Villogjon a harmadik LED (piros) 16 ms -onként
- 5. lépés: Kód írása programhoz C -ben. HEX fájl feltöltése a mikrokontroller flash memóriájába
- 6. lépés: Az elektromos áramkör elkészítése
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
2024 Szerző: John Day | [email protected]. Utoljára módosítva: 2024-01-30 09:42
Ü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
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
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
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
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
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
Csatlakoztassa az alkatrészeket a vázlatos rajz szerint.
Ajánlott:
Arduino időzítők: 8 projekt: 10 lépés (képekkel)
Arduino időzítők: 8 projekt: Az Arduino Uno vagy Nano pontos digitális jeleket tud generálni hat dedikált érintkezőn a három beépített időzítő használatával. Csak néhány parancsra van szükségük a beállításhoz, és nem kell CPU -ciklusokat futtatniuk! Az időzítők használata megfélemlítő lehet, ha
AVR mikrovezérlő. Ultrahangos távolságérzékelő. HC-SR04 az NOKIA 5110 LCD-n: 4 lépés
AVR mikrovezérlő. Ultrahangos távolságérzékelő. HC-SR04 az LCD-n NOKIA 5110: Üdv mindenkinek! Ebben a részben egyszerű elektronikus eszközt készítek a távolság érzékelésére, és ezek a paraméterek megjelennek az LCD NOKIA 5110-en. A paraméterek diagramként és számként jelennek meg. A készülék az AVR ATMEG mikrokontrollerre épül
AVR mikrovezérlő. Kapcsolja be a LED -eket nyomógombos kapcsolóval. Nyomógomb kikapcsolása: 4 lépés
AVR mikrovezérlő. Kapcsolja be a LED -eket nyomógombos kapcsolóval. Nyomógombos kikapcsolás: Ebben a részben megtanuljuk, hogyan kell C programprogramot készíteni az ATMega328PU számára, hogy a három LED állapotát a gombkapcsoló bemenete szerint változtassa meg. Ezenkívül megvizsgáltunk egy megoldást a „Switch Bounce” problémára. Mint általában, mi
AVR mikrovezérlő. Impulzus szélesség moduláció. Az egyenáramú motor és a LED -fényerősség vezérlője: 6 lépés
AVR mikrovezérlő. Impulzus szélesség moduláció. Az egyenáramú motor és a LED -fényerősség vezérlője: Üdv mindenkinek! Az impulzusszélesség -moduláció (PWM) egy nagyon gyakori technika a távközlésben és a teljesítményszabályozásban. általánosan használják az elektromos készülékek áramellátásának szabályozására, legyen az motor, LED, hangszórók stb. Alapvetően modul
5 LDR áramkör: reteszelés, időzítők, világos és sötét érzékelők: 3 lépés
5 LDR áramkör: reteszelés, időzítők, világos és sötét érzékelők: A fényfüggő ellenállás, más néven LDR, egy olyan összetevő, amelynek (változó) ellenállása van, és változik a rá eső fényintenzitással. Ez lehetővé teszi, hogy fényérzékelő áramkörökben használják őket. Itt mutattam be öt egyszerű áramkört, amelyek