kramann.info
© Guido Kramann

Login: Passwort:










Mikrocontroller
1 Einfuehrung
..1.1 Entwicklungsgeschichtliches
..1.2 Maschinensprache
..1.3 Assemblerbeispiel
..1.4 Sprachwahl
..1.5 Praxis
....1.5.1 Digital_IO
....1.5.2 Byteoperationen
....1.5.3 AVR_Studio
....1.5.4 Testboard
....1.5.5 Aufgaben
....1.5.6 Do_it_yourself
......1.5.6.1 Ampel
......1.5.6.2 Programmierer
..1.6 Literatur
..1.7 Programmierer
....1.7.1 Bauverlauf
....1.7.2 KurzreferenzLow
....1.7.2 Kurzreferenz_16PU
..1.8 Uebung1
..1.9 BoardAtHome
....1.9.1 Software
....1.9.2 Hardware
....1.9.3 Knoppix
....1.9.4 Aufbau
....1.9.5 LED
2 Oszillator
..2.1 Assembler
..2.2 Interner_RC
..2.3 Quarz
..2.4 Taktgenerator
3 DigitalIO
..3.1 Elektrische_Eigenschaften
..3.2 Pullup_Widerstaende
..3.3 Bitmasken_Eingang
..3.4 Bitmasken_Ausgang
..3.5 Tic_Tac_Toe
....3.5.1 DuoLEDs
....3.5.2 Schaltplan
....3.5.3 Spielfeld
....3.5.4 Anwahl
....3.5.5 Kontrolle
..3.6 Laboruebung2
..3.7 Laboruebung2_alt
4 PWM
..4.1 Prinzip
..4.2 Nutzen
..4.3 Generierung
..4.4 Programmierung
..4.5 Servos
..4.7 Laboruebung3
..4.8 LoesungUE3
..4.9 Uebung6
5 LichtKlangKugeln
..5.1 LED
..5.2 RGB
..5.3 Sensoren
..5.4 lautsprecher
..5.5 tonerzeugung
6 UART
..6.1 Bussysteme
..6.2 UART
..6.3 RS232
..6.4 Hardware
..6.5 Senden
..6.6 Hyperterminal
..6.7 Empfangen
..6.8 Broadcast
..6.9 Uebung4
7 Infrarot
..7.1 schalten
..7.2 seriell
..7.3 Uebung
8 OOP
..8.1 Probleme
..8.2 Konzept
..8.3 Statisch
..8.4 Datentypen
..8.5 RS232
....8.5.1 Prozedural
....8.5.2 Analyse
....8.5.3 Umsetzung
....8.5.4 Vererbung
....8.5.5 Statisch
....8.5.6 Performance
..8.6 Fahrzeug
9 ADW
..9.1 ADW
..9.2 Zaehler
10 Peripherie
..10.1 RS232Menue
..10.2 ASCIIDisplay
..10.3 Tastenmatrix
..10.4 Schrittmotor
..10.5 Zaehler
..10.6 Uebung7
11 SPI
..11.1 Testanordnung
..11.2 Register
..11.3 Test1
..11.4 Test2_Interrupt
..11.5 Test3_2Slaves
..11.6 Laboruebung
12 EEPROM
13 I2C
..13.1 MasterSendByte
..13.2 MasterSend2Bytes
..13.3 MasterReceiveByte
..13.4 MasterReceive2Bytes
14 Anwendungen
..14.1 Mechatroniklabor
....14.1.1 Biegelinie
....14.1.2 Ausbruchsicherung
....14.1.3 Einachser
....14.1.4 AV
....14.1.5 Vierradlenkung
....14.1.6 Kommunikation
..14.2 Sinuserzeugung
....14.2.1 Variante1
....14.2.2 Variante2
....14.2.3 Variante3
....14.2.4 Variante4
..14.3 Laboruebung8
..14.4 Loesung_Ue8
..14.5 SPI_Nachtrag
20 Xubuntu

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.