User Tools

Site Tools


pl: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

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 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ść $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
inline-svg@pl:avrc:art:0x06

</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);
	}
}
pl/avrc/art/0x06.txt · Last modified: 2012/09/29 13:46 by mkucia