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
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 z ''WGM12'' oraz ''WGM13'' 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 z ''CS11'' ustawiają prescaler na wartość
- Częstotliwość pracy wyraża się wzorem (
-wartość preskalera; - taktowanie układu): - W danym przykładzie jest to typowa wartość dla serwa (przy 50 [Hz] okres T = 20 [ms]):
- 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
Kompromis rozdzielczość-częstotliwość
Zwiększanie częstotliwości pracy ogranicza rozdzielczość! Rozdzielczość można wyrazić wzorem:
W tym przykładzie będzie to:
Zgadza się bo maksymalna wartość to 4999 (5000-1).
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);
}
}