PWM-Erzeugung mit dem Atmel AVR
Die meisten CPUs aus der AVR-Serie (AT tiny und AT mega) haben folgende Timer/PWM-Peripherie: 1 8-Bit Timer mit 2 Compare-Register, die je auf einen PWM-Ausgang wirken 1 8/16-Bit Timer mit 2 16-Bit Compare-Register, die je auf einen PWM-Ausgang wirken
Ich benötige 4 PWM Signale. 8-Bit PWM könnte rein über die vorhandene Peripherie erzeugt werden mit minimalem Softwareaufwand.
Ein paar Dinge, die man über den AVR-Timer wissen sollte:
- Der Timer-Prescaler kann nur die Stufen 1:1, 1:8, 1:64, 1:256 und 1:1024
- Die CPU benötigt 12 Takte vom Auftreten eines Ereignisses bis zu Ausführen einer Interrupt-Service Routine
- Die Register mit den Vergleichswerten (OCR0A/OCR0B) sind im PWM-Modus doppelt gepuffert um eine glitch-free PWM zu bekommen!
- Die Phasenkorrekte PWM erzeugt den Timer-Overflow Interrupt immer genau in der Mitte der High-Phase (oder Low, ja nach Polarität). Das braucht man z.B. bei Brushless-Motoren zur Messung des Position (über die Induktionsspannung)
Erhöhung der Auflösung per Software
Bei niedrigen Helligkeiten sind 8-Bit Auflösung jedoch etwas wenig und so muss man per Software nachhelfen. Dafür gibt es verschiedene Möglichkeiten:
Nachladen der Compare-Register bei jedem Timer-Überlauf per TOV-Interrupt
mehr folgt demnächst
--
JoergWeinhardt - 25 Jun 2009