Table of Contents
Układy czasowe
Układy te są elementem praktycznie każdego mikrokontrolera i jak sama nazwa wskazuje ich działanie związane jest z upływem czasu. Układy czasowe są jednym z najbardziej rozbudowanych peryferiów układu atmega8, co więcej układ ten zawiera 3 takie układy różniące się pewnymi właściwościami
TODO
Nazwa | Długość w [bitach] | Źródło taktowania |
---|---|---|
Timer/Counter 0 | 8 | Preskaler / Zewnętrzne |
Timer/Counter 1 | 16 | Preskaler / Zewnętrzne |
Timer/Counter 2 | 8 | Preskaler / Zewnętrzne |
Układ czasowy to w uproszczeniu rejestr zwiększający lub zmniejszający swoją wartość pod wpływem dostarczonego sygnału taktującego. Układ taki pracuje niezależnie od rdzenia mikrokontrolera i często potrafi generować sygnały lub przerwania.
Taktowanie
źródła, stabilność
Timer/Counter
Timer/Counter 0
- Single Channel Counter
- Frequency Generator
- External Event Counter
- 10-bit Clock Prescaler
Timer/Counter 1
True 16-bit Design (i.e., allows 16-bit PWM) • Two Independent Output Compare Units • Double Buffered Output Compare Registers • One Input Capture Unit • Input Capture Noise Canceler • Clear Timer on Compare Match (Auto Reload) • Glitch-free, Phase Correct Pulse Width Modulator (PWM) • Variable PWM Period • Frequency Generator • External Event Counter • Four Independent Interrupt Sources (TOV1, OCF1A, OCF1B, and ICF1)
Timer/Counter 2
Single Channel Counter • Clear Timer on Compare Match (Auto Reload) • Glitch-free, phase Correct Pulse Width Modulator (PWM) • Frequency Generator • 10-bit Clock Prescaler • Overflow and Compare Match Interrupt Sources (TOV2 and OCF2) • Allows Clocking from External 32 kHz Watch Crystal Independent of the I/O Clock
Przykłady
Przykład 1 - migająca dioda raz jeszcze
Przykład 2 - kwarc zegarkowy
Przykład 3 - PWM sterowanie serwem
Przykład wykorzystuje układ TIMER1.
- Port D zostaje ustawiony jako wyjście (pin OC1A)
- Tryb pracy timera zostaje ustawiony za pomocą rejestru TCCR1
- bit
COM1A1
zeruje pin OC1A kiedy timer jest na dnie (BOTTOM) i ustawia je kiedy wartość zliczana zostaje osiągnięta (Compare Match) - bit
WGM11
razem zWGM12
orazWGM13
ustawiają tryb pracy timera na FastPWM z:- wierzchołkiem (TOP) w ICR1
- wartością zadaną (wypełnieniem) w OCR1A
- wartością dna (BOTTOM) równą 0
- bit
CS10
razem zCS11
ustawiają prescaler na wartość $clk_{IO} /64$
- Częstotliwość pracy wyraża się wzorem ($N$-wartość preskalera; $f_{clk}$ - taktowanie układu):
$$ f_{OCR1PWM} = { {f_{clk} } \over {N \cdot (1+TOP)}}$$
- W danym przykładzie jest to typowa wartość dla serwa (przy 50 [Hz] okres T = 20 [ms]):
$$ f_{OCR1PWM} = { {16M} \over {64 \cdot (1+5000-1)} } = {50 [Hz]}$$
- W przykładzie po zainicjalizowaniu timiera w pętli cyklicznie wypełnienie jest zmieniane co sekundę.
Podsumowując:
- OCR - wypełnienie sygnału (:EN: duty cycle) PWM na wyjściu (OC1A)
- Wyjście jest w stanie wysokim dopóki timer nie osiągnie wartości OCR
- Wyjście jest resetowane do stanu wysokiego kiedy timer osiąga wartość maksymalną (ICR1), w tym samym czasie timer jest również resetowany do wartości minimalnej
</svgimage>
Kompromis rozdzielczość-częstotliwość
Zwiększanie częstotliwości pracy ogranicza rozdzielczość! Rozdzielczość można wyrazić wzorem: $$ R_{FPWM} = { {log(TOP+1)} \over {log(2)} }$$ W tym przykładzie będzie to: $$ R_{FPWM} = { {log( (5000-1) +1)} \over {log(2)} } \approx 12 [bit]$$
Zgadza się bo maksymalna wartość to 4999 (5000-1). $2^{12} = 4096$ ($2^{13} = 8192$)
Najmniejsza rozdzielność to 2 bity, natomiast największa to 16 bitów.
Kod
int main() { DDRD = 0xFF; TCCR1A |= (1<<COM1A1) | (1<< WGM11) ; // Set up timer/mode TCCR1B |= (1<< CS10) | (1<<CS11) | (1<<WGM13) | (1<<WGM12); ICR1 = 5000-1;// Uwaga! Dla kwarcu 16MHz forever { OCR1A = 500; _delay_ms(1000); OCR1A = 300; _delay_ms(1000); } }