Matt Kucia

Cloud, software, hardware


/projects/avrc/art/0x06

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ść clkIO/64
  • Częstotliwość pracy wyraża się wzorem (N-wartość preskalera; fclk - taktowanie układu): fOCR1PWM=fclkN(1+TOP)
  • W danym przykładzie jest to typowa wartość dla serwa (przy 50 [Hz] okres T = 20 [ms]): fOCR1PWM=16M64(1+50001)=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

alt

Kompromis rozdzielczość-częstotliwość

Zwiększanie częstotliwości pracy ogranicza rozdzielczość! Rozdzielczość można wyrazić wzorem:

RFPWM=log(TOP+1)log(2)

W tym przykładzie będzie to:

RFPWM=log((50001)+1)log(2)12[bit]

Zgadza się bo maksymalna wartość to 4999 (5000-1). 212=4096 (213=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);
	}
}