kramann.info
© Guido Kramann

Login: Passwort:










4.4 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 4.4-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 4.4-2: PWM für Timer0 aktivieren

OOP

  • Die folgende Klasse dient dazu, Timer0 als PWM-Geber zu verwenden:
BILDBESCHREIBUNG

Bild 4.4-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 4.4-3: Verwendung der Klasse PWMtimer0.