Generování PMW signálu

Úvod
V této práci sem se zaměřil na vytvoření hardwarového modulu pro generování PWM (Pulse Width Modulation) signálu pomocí mikroprocesoru ATMega. Pro vlastní realizaci jsem použil čip ATMega162 a jeho systému časovačů/čítačů. Toto prototypové zaření je možné použít pro řízení modelářského serva. Generuje řídíci signál, který je popsán dále.
Schéma zapojení
Schéma zapojení obsahuje nezbytné součástky pro činost mikroprosesoru, tj. externí krystal a obvod napájení s lineárním stabilizátorem 7805. Pro napájení celého modulu lze tedy použít zdroj napětí v rozsahu 8 až 35V.
Obr.1.: Elektrické schéma zapojení
Požadovaný výstupní signál
Modelářské servo je řízeno PWM signálem s frekvencí 50Hz, tj. konstantní periodou T = 20ms. Amplituda impulsu je obvykle 5V a šířka impulsu v rozmezí 1 až 2ms. Pro udržení požadované polohy je třeba signál přívádět na vstup serva kontinuálně.

Šířka impulsu určuje natočení hřídele serva:
1.0ms ~ 0°
1.5ms ~ 45°
2.0ms ~ 90°

Popis časovačů

Pro generování požadovaného PWM signálu můžeme použít režimu označovaného v katalogovém listu[3] jako "Phase Correct PWM Mode". V tomto režimu časovač opakovaně načítá od nuly až do hodnoty definované v registru ICRn (n.. číslo čítače). Pro určení hodnoty registru ICRn potřebujeme znát následující parametry. Frekvenci krystalu f = 16MHz a frekvenci čítače n, ta je odvozena v děliči kmitočtu. Což můžeme nastavit v registru TCCRn, pomécí bitů CSn2:0 viz obr.2.

Obr.2.: Registr TCCRn

Na obr.3 je tabulka uvádějící prehled možných nastavení děliče kmitočtu.

Obr.3.: Nastavení jednotlivých bitů pro dělič kmitočtu

Pro výpočet požadované frekvence výstupního PWM signálu použijeme následnujécí vzorec

clkIO .. je frekvence krystalu
N .. je nastavení děliče kmitočtu

Nastavíme dělič kmitočtu na 8, protože tato volba dovoluje nastavit registr OCRxn v mezích 1000 až 2000. Tímto získáme možnost měnit výstupní impuls PWM signálu v rozmezí 1ms až 2ms.

Obr.4.: Princip generování PWM signálu

V registru ICRn definujeme 50Hz PWM signál. Registr OCRxn definuje aktuální šířku impulsu. V dalším registru TCNTn časovače/čítače běží přičítání stavu, začíná na nule až do hodnoty definované v registru ICRn. Pak nasleduje odčítaní zpět do nuly.

PWM signál je přivedáděn na výstupní pin mikroprocesoru, v programu jej označujeme OC1A (obecně ho můžeme označit OCnx). Napěťová úroveň log. 1 nebo log.0 se mění podle následijících podmínek, viz obr.4. Pokud TCNT1 odpovídá OCR1A (Output Compare Register 1A) při čítání nahoru, je výstupní pin OC1A nastaven na log. 1. Pokud TCNT1 odpovídá OCR1A při čítání dolů, je výstupní pin OC1A nastaven na log. 0.

Kód programu
Pro snadnou implemntaci kódu jsem použil programového vybavení firmy Atmel software CodeVision. Tento software poskytuje intuitivní pruvodce "Wizard" pro sadné vytvoření kostry programu pro mikroprocesor. Výsledkem toho průvodce jsou základní definice funcke main{} a přiřazení hodnot vybraným registrům.
void main(void) { // Port D initialization // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=Out Func6=In Func7=In // State0=T State1=T State2=T State3=T State4=T State5=0 State6=T State7=T PORTD=0x00; DDRD=0x20; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 1000,000 kHz // Mode: Ph. correct PWM top=01FFh // OC1A output: Non-Inv. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge TCCR1A=0x82; TCCR1B=0x02; TCNT1H=0x00; TCNT1L=0x00; ICR1H= 0x4e; ICR1L= 0x20; OCR1A = 1000; OCR1BH=0x00; OCR1BL=0x00; while (1) { // Place your code here OCR1A = 1000; delay_ms(6000); OCR1A = 2000; delay_ms(6000); }; }
Literatura a odkazy

[1] L78S00 SERIES
[2] Serva Hi-Tech
[3] ATMEL 8-bit Microcontroller with 16K Bytes In-System Programmable Flash - ATmega162, katalogový list fy Atmel