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
Topic revision: r2 - 25 Jun 2009, JoergWeinhardt
This site is powered by FoswikiCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding Foswiki? Send feedback