Orodha ya maudhui:

Mdhibiti mdogo wa AVR. LEDs Flasher Kutumia Timer. Timers Kukatizwa. Njia ya CTC ya Timer: 6 Hatua
Mdhibiti mdogo wa AVR. LEDs Flasher Kutumia Timer. Timers Kukatizwa. Njia ya CTC ya Timer: 6 Hatua

Video: Mdhibiti mdogo wa AVR. LEDs Flasher Kutumia Timer. Timers Kukatizwa. Njia ya CTC ya Timer: 6 Hatua

Video: Mdhibiti mdogo wa AVR. LEDs Flasher Kutumia Timer. Timers Kukatizwa. Njia ya CTC ya Timer: 6 Hatua
Video: Using Digispark Attiny85 Mini Arduino boards: Lesson 108 2024, Julai
Anonim
Image
Image

Halo kila mtu!

Vipima muda ni dhana muhimu katika uwanja wa umeme. Kila sehemu ya elektroniki inafanya kazi kwa msingi wa wakati. Msingi huu wa wakati husaidia kuweka kazi zote zikiwa zimesawazishwa. Watawala wadogo wote hufanya kazi kwa masafa ya saa yaliyotanguliwa, wote wana kifungu cha kuweka vipima muda. AVR inajivunia kuwa na kipima muda ambacho ni sahihi sana, sahihi na cha kuaminika. Inatoa huduma nyingi ndani yake, na hivyo kuifanya kuwa mada kubwa. Sehemu bora ni kwamba kipima muda ni huru kabisa na CPU. Kwa hivyo, inaendana na CPU na hakuna uingiliaji wa CPU, ambayo inafanya timer kuwa sahihi kabisa. Katika sehemu hii ninaelezea dhana za kimsingi za Vipima muda vya AVR. Ninaandika programu rahisi katika msimbo wa C kudhibiti taa za LED, kwa kutumia vipima muda.

Hatua ya 1: Maelezo

Taarifa ya Tatizo 1: Wacha tuangaze LED ya kwanza (kijani) Kila Bi
Taarifa ya Tatizo 1: Wacha tuangaze LED ya kwanza (kijani) Kila Bi

Katika ATMega328 kuna aina tatu za vipima muda:

Timer / Counter0 (TC0) - ni madhumuni ya jumla moduli ya 8-bit Timer / Counter, na Units mbili za OutputCare kulinganisha, na msaada wa PWM;

Timer / Counter1 (TC1) - Kitengo cha Timer / Counter cha 16-bit kinaruhusu muda sahihi wa utekelezaji wa programu (usimamizi wa hafla), kizazi cha mawimbi, na kipimo cha muda wa ishara;

Timer / Counter2 (TC2) - ni kusudi la jumla, kituo, moduli ya Timer / Counter ya 8-bit na PWM na Operesheni ya Asynchronous;

Hatua ya 2: Kauli ya Tatizo 1: Wacha tuwe na Flash ya kwanza (kijani) Kila Bi

Taarifa ya Tatizo 1: Wacha tuangaze LED ya kwanza (kijani) Kila Bi
Taarifa ya Tatizo 1: Wacha tuangaze LED ya kwanza (kijani) Kila Bi
Taarifa ya Tatizo 1: Wacha tuangaze LED ya kwanza (kijani) Kila Bi
Taarifa ya Tatizo 1: Wacha tuangaze LED ya kwanza (kijani) Kila Bi

Mbinu:

- kutumia kiboreshaji cha Timer0 kupunguza ishara ya umeme ya masafa ya juu kwa masafa ya chini na mgawanyiko wa nambari;

- kutumia usumbufu kila wakati Timer0 inapofurika;

Timer0 (8 bit) inahesabu kutoka 0 hadi 255 baada ya hapo, hufurika, thamani hii hubadilika kwa kila saa ya saa.

F_CPU = 16MHz: Saa ya saa = 1000ms / 16000000Hz = 0.0000625ms

Hesabu ya muda = (Inahitajika Kuchelewa / Kipindi cha Saa ya Saa) -1 = (50ms / 0.0000625ms) = 799999

Saa tayari imechagua mara 799999 kutoa ucheleweshaji wa ms 50 tu!

Tunaweza kutumia mbinu ya mgawanyiko wa masafa inayoitwa prescaling kupunguza hesabu ya saa. AVR hutupatia maadili yafuatayo ya daktari ya kuchagua kutoka: 8, 64, 256 na 1024. Tazama jedwali linafupisha matokeo ya kutumia wauguzi tofauti.

Thamani ya kukanusha inapaswa kuwa nambari kila wakati. Wacha tuchague daktari mkuu 256!

Katika wadhibiti wengi wadogo, kuna kitu kinachoitwa Usumbufu. Usumbufu huu unaweza kufutwa wakati wowote hali zingine zinatimizwa. Sasa wakati wowote usumbufu unapofutwa, AVR husimama na kuokoa utekelezaji wake wa kawaida, huhudhuria simu ya kukatiza (kwa kutekeleza utaratibu maalum, unaoitwa Utaratibu wa Huduma ya Kukatiza, ISR) na mara tu utakapofanyika nayo, inarudi kwa kawaida kuu na inaendelea kuifanya.

Kwa kuwa ucheleweshaji unaohitajika (50ms) ni mkubwa kuliko ucheleweshaji unaowezekana: 4, 096ms = 1000ms / 62500Hz * 256, ni wazi kwamba saa itafurika. Na wakati wowote wakati wa kufurika, usumbufu unafutwa.

Usumbufu unapaswa kufutwa mara ngapi?

50ms / 4.096ms = 3125/256 = 12.207 Ikiwa kipima muda kimefurika mara 12, 12 * 4.096ms = 49.152ms zingepita. Katika iteration ya 13, tunahitaji ucheleweshaji wa 50ms - 49.152ms = 0.848ms.

Kwa masafa ya 62500Hz (prescaler = 256), kila kupe huchukua 0.016ms. Kwa hivyo kufikia ucheleweshaji wa 0.848ms, itahitaji 0.848ms / 0.016ms = 53 kupe. Kwa hivyo, katika iteration ya 13, tunaruhusu tu kipima muda kuhesabu hadi 53, na kisha kuiweka upya.

Anzisha Timer0 / Counter (tazama picha):

TCCR0B | = (1 << CS02) // kuweka timer na prescaler = 256 TCNT0 = 0 // kuanzisha counter TIMSK0 | = (1 << TOIE0) // kuwezesha kufurika kusumbua sei () // kuwezesha usumbufu wa ulimwengu tot_overflow = 0 // kuanzisha kutofautisha kwa kaunta ya kufurika

Hatua ya 3: Taarifa ya Tatizo 2: Wacha tuwe na Flash ya pili ya LED (bluu) kila 1s

Taarifa ya Tatizo 2: Wacha tuwe na Flash ya pili ya LED (bluu) kila 1s
Taarifa ya Tatizo 2: Wacha tuwe na Flash ya pili ya LED (bluu) kila 1s
Taarifa ya Tatizo 2: Wacha tuwe na Flash ya pili ya LED (bluu) kila 1s
Taarifa ya Tatizo 2: Wacha tuwe na Flash ya pili ya LED (bluu) kila 1s
Taarifa ya Tatizo 2: Wacha tuwe na Flash ya pili ya LED (bluu) kila 1s
Taarifa ya Tatizo 2: Wacha tuwe na Flash ya pili ya LED (bluu) kila 1s

Mbinu:

- kutumia kiboreshaji cha Timer1 kupunguza ishara ya umeme ya masafa ya juu kwa masafa ya chini na mgawanyiko wa nambari;

- kutumia Sawa ya Saa kwenye Njia ya Linganisha (CTC);

- kutumia Usumbufu na Njia ya CTC;

Timer1 (16 bit) inahesabu kutoka 0 hadi 65534 baada ya hapo, hufurika. Thamani hii inabadilika kila saa ya saa.

F_CPU = 16MHz: Saa ya saa = 1000ms / 16000000Hz = 0.0000625ms Hesabu ya saa = (Inahitajika Kuchelewa / Kipindi cha Saa ya Saa) -1 = (1000ms / 0.0000625ms) = 15999999

Saa tayari imechagua mara 15999999 kutoa ucheleweshaji wa 1s!

Tunaweza kutumia mbinu ya mgawanyiko wa masafa inaitwa prescaling kupunguza hesabu ya saa. AVR hutupatia maadili yafuatayo ya daktari ya kuchagua kutoka: 8, 64, 256 na 1024. Tazama jedwali linafupisha matokeo ya kutumia wauguzi tofauti. Thamani ya kaunta inapaswa kuwa nambari kila wakati. Wacha tuchague daktari mkuu 256!

Katika wakati wazi kwenye hali ya Linganisha (CTC), rejista ya OCR1A au ICR1 hutumiwa kudhibiti azimio la kukabiliana. Katika hali ya CTC kaunta inafutwa hadi sifuri wakati thamani ya kaunta (TCNT1) inalingana ama OCR1A au ICR1. OCR1A au ICR1 hufafanua thamani ya juu kwa kaunta, kwa hivyo pia azimio lake. Hali hii inaruhusu udhibiti mkubwa wa kulinganisha masafa ya pato la mechi Pia inarahisisha utendaji wa kuhesabu hafla za nje. Lazima tuiambie AVR ibadilishe Timer1 / Counter mara tu thamani yake itakapofikia thamani 62500, na hivyo kufikia ucheleweshaji wa 1s.

Anzisha Timer1 / Counter (tazama picha):

TCCR1B | = (1 << WGM12) | (1 << CS12) // seter timer with prescaler = 256 and CTC mode TCNT1 = 0 // initialize counter TIMSK1 | = (1 << OCIE1A) // kuwezesha kulinganisha OCR1A = 62500 // anzisha thamani ya kulinganisha

Hatua ya 4: Taarifa ya Tatizo 3: Wacha tuwe na Kiwango cha Tatu cha LED (nyekundu) Kila 16ms

Kauli ya Tatizo 3: Wacha tuwe na Kiwango cha Tatu cha LED (nyekundu) Kila 16ms
Kauli ya Tatizo 3: Wacha tuwe na Kiwango cha Tatu cha LED (nyekundu) Kila 16ms
Kauli ya Tatizo 3: Wacha tuwe na Kiwango cha Tatu cha LED (nyekundu) Kila 16ms
Kauli ya Tatizo 3: Wacha tuwe na Kiwango cha Tatu cha LED (nyekundu) Kila 16ms
Kauli ya Tatizo 3: Wacha tuwe na Kiwango cha Tatu cha LED (nyekundu) Kila 16ms
Kauli ya Tatizo 3: Wacha tuwe na Kiwango cha Tatu cha LED (nyekundu) Kila 16ms
Kauli ya Tatizo 3: Wacha tuwe na Kiwango cha Tatu cha LED (nyekundu) Kila 16ms
Kauli ya Tatizo 3: Wacha tuwe na Kiwango cha Tatu cha LED (nyekundu) Kila 16ms

Mbinu:

- kutumia prescaler ya Timer2 kupunguza ishara ya umeme ya masafa ya juu kwa masafa ya chini na mgawanyiko wa nambari;

- kutumia Futa Timer kwenye Njia ya Linganisha (CTC);

- kutumia Njia ya CTC ya vifaa bila kukatizwa;

Timer2 (8 bit) inahesabu kutoka 0 hadi 255 baada ya hapo, hufurika. Thamani hii inabadilika kila saa ya saa.

F_CPU = 16MHz: Saa ya saa = 1000ms / 16000000Hz = 0.0000625ms

Hesabu ya saa = (Inahitajika Kuchelewa / Kipindi cha Saa ya Saa) -1 = (16ms / 0.0000625ms) = 255999

Saa tayari imechukua mara 255999 kutoa ucheleweshaji wa 16ms!

Tazama jedwali linafupisha matokeo ya kutumia wauguzi tofauti. Thamani ya kukanusha inapaswa kuwa nambari kila wakati. Wacha tuchague daktari 1024!

Katika hali ya CTC kaunta inafutwa hadi sifuri wakati thamani ya kaunta (TCNT2) inalingana na OCR2A au ICR2. Pin PB3 pia ni Pato Linganisha Pini ya TIMER2 - OC2A (angalia mchoro).

Sajili ya Kudhibiti Timer / Counter2 A - TCCR2A Bit 7: 6 - COM2A1: 0 - Linganisha Njia ya Pato ya Linganisha Kitengo A. Kwa kuwa tunahitaji kugeuza LED, tunachagua chaguo: Badili OC2A kwenye Linganisha Mechi Wakati wowote kulinganisha mechi kunatokea, Pini ya OC2A imebadilishwa kiatomati. Hakuna haja ya kuangalia kidogo bendera, hakuna haja ya kuhudhuria usumbufu wowote.

Anzisha Timer2 / Counter

TCCR2A | = (1 << COM2A0) | (1 << WGM21) // weka kipima muda cha OC2A katika hali ya kugeuza na hali ya CTC TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS21) | (1 << CS20) // kuanzisha kipima muda na prescaler = 1024 TCNT2 = 0 // kuanzisha counter OCR2A = 250 // kuanzisha thamani ya kulinganisha

Hatua ya 5: Kuandika Nambari ya Programu katika C. Kupakia faili ya HEX Kwenye Kumbukumbu ya Kiwango cha Microcontroller

Kuandika Nambari ya Programu katika C. Kupakia faili ya HEX Kwenye Kumbukumbu ya Kiwango cha Microcontroller
Kuandika Nambari ya Programu katika C. Kupakia faili ya HEX Kwenye Kumbukumbu ya Kiwango cha Microcontroller
Kuandika Nambari ya Programu katika C. Kupakia faili ya HEX Kwenye Kumbukumbu ya Kiwango cha Microcontroller
Kuandika Nambari ya Programu katika C. Kupakia faili ya HEX Kwenye Kumbukumbu ya Kiwango cha Microcontroller

Kuandika na kujenga matumizi ya AVR microcontroller katika C Code ukitumia Jukwaa la Maendeleo Jumuishi - Studio ya Atmel.

F_CPU inafafanua mzunguko wa saa huko Hertz na ni kawaida katika programu zinazotumia maktaba ya avr-libc. Katika kesi hii hutumiwa na mazoea ya kuchelewesha kuamua jinsi ya kuhesabu ucheleweshaji wa wakati.

#fndef F_CPU

#fafanua F_CPU 16000000UL // kuwaambia mtiririko wa kioo cha mtawala (16 MHz AVR ATMega328P) #endif

# pamoja na kichwa // kuwezesha udhibiti wa mtiririko wa data juu ya pini. Inafafanua pini, bandari, nk.

Faili ya kwanza ni pamoja na avr-libc na itatumika katika mradi wowote wa AVR unayofanya kazi. io.h itaamua CPU unayotumia (ndio sababu unabainisha sehemu wakati unakusanya) na kwa upande wake ni pamoja na kichwa cha ufafanuzi cha IO kinachofaa kwa chip tunayotumia. Inafafanua tu msimamo wa pini zako zote, bandari, rejista maalum, nk.

# pamoja na kichwa // kuwezesha kukatiza

tete uint8_t tot_overflow; // anuwai ya ulimwengu kuhesabu idadi ya mafuriko

Mbinu ya Taarifa ya Shida: Flash ya kwanza (Kijani) LED kila ms 50

- kutumia kiboreshaji cha Timer0 kupunguza ishara ya umeme ya masafa ya juu kwa masafa ya chini na mgawanyiko wa nambari;

- kutumia usumbufu kila wakati Timer0 inapofurika;

timer timer0_init () // kuanzisha timer0, kusumbua na kutofautisha

{TCCR0B | = (1 << CS02); // kuanzisha kipima muda na prescaler = 256 TCNT0 = 0; // anzisha counter TIMSK0 | = (1 << TOIE0); // kuwezesha kufurika nterrupt sei (); // kuwezesha usumbufu wa ulimwengu tot_overflow = 0; // anzisha kutofautisha kwa kaunta}

Mbinu ya Taarifa ya Shida: Flash ya Pili ya LED (bluu) kila 1s

- kutumia kiboreshaji cha Timer1 kupunguza ishara ya umeme ya masafa ya juu kwa masafa ya chini na mgawanyiko wa nambari;

- kutumia Futa Timer kwenye Njia ya Linganisha (CTC);

- kutumia Usumbufu na Njia ya CTC;

timer timer1_init () // initialize timer1, interrupt and variable {TCCR1B | = (1 << WGM12) | (1 << CS12); // kuanzisha kipima muda na prescaler = 256 na CTC mode TCNT1 = 0; // kuanzisha kaunta OCR1A = 62500; // anzisha thamani ya kulinganisha TIMSK1 | = (1 << OCIE1A); // kuwezesha kulinganisha kukatiza}

Mbinu ya Taarifa ya Shida: Flash ya tatu ya LED (nyekundu) kila 16ms

- kutumia prescaler ya Timer2 kupunguza ishara ya umeme ya masafa ya juu kwa masafa ya chini na mgawanyiko wa nambari;

- kutumia Futa Timer kwenye Njia ya Linganisha (CTC);

- kutumia Njia ya CTC ya vifaa bila kukatizwa;

timer timer2_init () // initialize timer2 {TCCR2A | = (1 << COM2A0) | (1 << WGM21); // weka kipima muda cha OC2A katika hali ya kugeuza na hali ya CTC TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20); // kuanzisha kipima muda na prescaler = 1024 TCNT2 = 0; // kuanzisha kaunta OCR2A = 250; // anzisha thamani ya kulinganisha}

TIMER0 kufurika kukatisha utaratibu wa huduma inayoitwa wakati wowote TCNT0 inapojaa:

ISR (TIMER0_OVF_vect)

{tot_overflow ++; // kuweka wimbo wa idadi ya mafuriko}

ISR hii inafutwa wakati wowote mechi inatokea kwa hivyo, kugeuza kuongozwa hapa yenyewe:

ISR (TIMER1_COMPA_vect) {PORTC ^ = (1 << 1); // kugeuza kuongozwa hapa}

kuu (batili)

{DDRB | = (1 << 0); // unganisha 1 (kijani) imesababisha pini PB0 DDRC | = (1 << 1); // unganisha 2 (bluu) imesababisha kubandika PC1 DDRB | = (1 << 3); // unganisha 3 (nyekundu) imesababisha pini PB3 (OC2A) timer0_init (); // kuanzisha timer0 timer1_init (); // kuanzisha timer1 timer2_init (); // anzisha timer2 wakati (1) // kitanzi milele {

Ikiwa Timer0 imejaa mara 12, 12 * 4.096ms = 49.152ms ingekuwa imepita. Katika iteration ya 13, tunahitaji ucheleweshaji wa 50ms - 49.152ms = 0.848ms. Kwa hivyo, katika iteration ya 13, tunaruhusu tu kipima muda kuhesabu hadi 53, na kisha kuiweka upya.

ikiwa (tot_overflow> = 12) // angalia ikiwa hapana. ya mafuriko = 12 KUMBUKA: '> =' inatumiwa

{if (TCNT0> = 53) // angalia ikiwa hesabu ya saa imefikia 53 {PORTB ^ = (1 << 0); // inabadilisha TCNT0 iliyoongozwa = 0; // kuweka upya kaunta tot_overflow = 0; // kuweka upya kaunta ya kufurika}}}}

Inapakia faili ya HEX kwenye kumbukumbu ndogo ya microcontroller:

andika kwenye DOS haraka windows amri:

avrdude –c [jina la programu] –p m328p -u -U flash: w: [jina la faili yako ya hex] Kwa upande wangu ni: avrdude –c ISPProgv1 -p m328p -u -U flash: w: Timers.hex

Amri hii inaandika faili ya hex kwenye kumbukumbu ya microcontroller. Tazama video hiyo na maelezo ya kina ya kuwaka kumbukumbu ndogo ya microcontroller:

Kumbukumbu ndogo ya microcontroller inawaka…

Sawa! Sasa, mdhibiti mdogo hufanya kazi kulingana na maagizo ya programu yetu. Wacha tuiangalie!

Hatua ya 6: Kufanya Mzunguko wa Umeme

Kufanya Mzunguko wa Umeme
Kufanya Mzunguko wa Umeme
Kufanya Mzunguko wa Umeme
Kufanya Mzunguko wa Umeme
Kufanya Mzunguko wa Umeme
Kufanya Mzunguko wa Umeme

Unganisha vifaa kulingana na mchoro wa skimu.

Ilipendekeza: