Programmierung: Aktivierung des Timers0 als PWM-Geber
- Über das Register TCCR0 ist es möglich für den Timer0 sowohl ein schnelles nicht Phasen-korrektes PWM-Signal zu erzeugen (Bits WGM01=0, WGM00=1), als auch ein phasen korrektes langsameres (Bits WGM01=1, WGM00=1), vergl. Datenblatt Tabelle auf Seite 78.
- Ferner kann noch bestimmt werden wie hoch die Frequenz des PWM-Signals fpwm in Bezug auf die Systemtaktrate fclock ist.
- Für die Phasen korrekte PWM-Erzeugung berechnet sich fpwm folgendermaßen:
- Für die Phasen korrekte PWM-Erzeugung berechnet sich fpwm folgendermaßen:
- fpwm=fclock/(N*510).
- In der 510 steckt das hoch und herunterzählen bis 255 drin.
- Für N lassen sich wenige Werte über die Bits CS02, CS01, CS00 in Register TCCR0 einstellen (s. Tabelle, Datenblatt S. 79/80):
|
N CS02 CS01 CS00
1 0 0 1
8 0 1 0
64 0 1 1
256 1 0 0
1024 1 0 1
Code 0-1: Einstellungen für N
- Demgemäß aktiviert der folgende Befehl das Phasen-korrekte PWM-Signal für Timer0 mit einem Teiler-Wert für N von 64:
- Das PWM-Signal von Timer0 wird auf Pin4 ausgegeben. Um das Signal durchkommen zu lassen, muß dieser Pin auf Ausgang geschaltet werden.
- Aus Sicherheitsgründen wird die Breite des PWM-Signals zunächst auf Null gesetzt.
|
TCCR0 = (0<<FOC0) | (1<<WGM00) | (1<<COM01) | (0<<COM00) | (0<<WGM01) | (0<<CS02) | (1<<CS01) | (1<<CS00);
DDRB |= (1<<PB3); //auf Ausgang setzen.
OCR0 = 0; //PWM-Breite auf Null setzen.
Code 0-2: PWM für Timer0 aktivieren
OOP
- Die folgende Klasse dient dazu, Timer0 als PWM-Geber zu verwenden:
|
Bild 0-1: Die Klasse PWMtimer0 in der Datei PWMtimer0.h
- Beispiel für ein einfaches main-Programm, das die Klasse PWMtimer0 verwendet, um ein PWM-Signal mit 50% Breite zu erzeugen:
|
#include <avr/io.h>
#include "PWMtimer0.h"
int main(void)
{
PWMtimer0 pwm0;
pwm0.start();
pwm0.setzePulsbreitePin4(127);
while(true)
{
}
return 0;
}
Code 0-3: Verwendung der Klasse PWMtimer0.