140 likes | 252 Views
Microcontroller Programmeren in C. MICPRG Les 6. Pulse generator. Veel signalen in de buitenwereld zijn pulsvormig . Veel actoren kunnen met een pulsvormig signaal worden aangestuurd: Lamp. Motor. Telefoonkiezer.(Puls en toon!) Luidspreker. enz...
E N D
Microcontroller Programmeren in C MICPRG Les 6
Pulse generator • Veel signalen in de buitenwereld zijn pulsvormig. • Veel actoren kunnen met een pulsvormig signaal worden aangestuurd: • Lamp. • Motor. • Telefoonkiezer.(Puls en toon!) • Luidspreker. • enz... • Om deze signalen te kunnen opwekken hebben veel µC’s een ingebouwde pulse generator.
Timer/Counter0 • Timer/Counter0 kan een pulsvormig signaal opwekken op pin OC0 = PB3. • Output Compare eventueel in CTC mode = Clear Timer on Compare match (50% duty-cycle). • Fast PWM (instelbare duty-cycle). PWM = Pulse Width Modulation. • Fase correct PWM (instelbare duty-cycle). • Timer/Counter1 kan pulsvormige signalen op-wekken op pinnen OC1A = PD5 en OC1B = PD4. • Timer/Counter2 kan een pulsvormig signaal opwekken op pin OC2 = PD7
7 0 Output compare 7 0 TCNT0 count-ingang 0x06 0x07 0x08 comparator = COM0/1 0x07 OCR0 OC0PB3 Outputcontrol TIMER0_COMP_vectinterrupt 0 1 FOC0 OCIE0 =1 =0 OCF0
T/C0 Output Compare • OCF0 = Output Compare Flag 0. • OCIE0 = Output Compare Interrupt Enable 0. • FOC0 = Force Output Compare 0. FOC0 = 1 Actie op pin OC0 = PB3, die bij compare match wordt uitgevoerd, wordt nu meteen uitgevoerd!
7 0 CTC Clear Timer on Compare Match 7 0 TCNT0 reset count-ingang 0x06 0x07 0x00 comparator = COM0/1 0x07 OCR0 OC0PB3 Outputcontrol TIMER0_COMP_vectinterrupt 0 1 FOC0 OCIE0 =1 =0 OCF0
Opdracht • Zie AVR boek pagina 44 t/m 46. • 1 seconde wachten bij FCLK = 2.4576 MHz. • Maak een variant van dit programma met behulp van T/C0 Output Compare in CTC mode. void wacht1sec() { uint8_t i; TCCR0 &= ~(1<<COM01 | 1<<COM00 | 1<<WGM00 | 1<<CS01); TCCR0 |= 1<<WGM01 | 1<<CS02 | 1<<CS00; OCR0 = 239; TCNT0 = 0; for (i = 0; i < 10; i++) { TIFR = 1<<OCF0; while (~TIFR & 1<<OCF0); } TCCR0 &= ~(1<<CS02 | 1<<CS01 | 1<<CS00); } ? WaaromTIFR = 1<<OCF0en nietTIFR |= 1<<OCF0
Opdracht • Stel: Er is een luidspreker aangesloten op pin OC0 = PB3. De frequentie van de µC = 8 MHz. • Schrijf een programma om een kamertoon op de luidspreker te genereren. • De kamertoon, in de muziektheorie a' genoemd terwijl de wetenschappelijke benaming A4 is wordt veel gebruikt voor het stemmen van muziek-instrumenten. De kamertoon hoort een frequentie van 440 Hz te hebben. De meeste stemvorken worden dan ook op 440 Hz gemaakt.
Uitwerking • 440Hz => periode tijd = 1/440 = sec. • PD3 elke 1/880 sec inverteren (toggle). • fCPU = 8 MHz. Prescaler zo laag mogelijk (nauwkeuriger). • Prescaler=1 => 1 tick T/C0 = 1/8000000 sec. OCR0+1 = 8000000/880 = 9091 Past niet! • Benodigde prescaler 9091/256 = 36. Kies 64. • Prescaler=64 => 1 tick T/C0 = 64/8000000 sec. OCR0+1 = 8000000/(880*64) = 142. • Opgewekte freq = 8000000/(64*142*2) = 440,14
Uitwerking #include <avr/io.h> int main(void) { OCR0 = 141; TCCR0 = 0x1B; DDRB |= 1<<3; while (1); return 0; }
Huiswerk • Bestudeer AVR Boekpagina 121. • Bestudeer AVR datasheets hoofdstuk over T/C0 (18 pagina’s).