Der Timer1 des ATMEGA 8 bietet hier sehr viele Möglichkeiten eine PWM zu realisieren.
Die entscheidenden Register sind die WGM Bits die je nach dem gewünschten PWM Modus eingestellt werden müssen.
Die Vergleichswerte (PWM Pulsbreiten) müssen dann im OCR1A bzw. OCR1B eingestellt werden. Die Pulse kommen dann am OC1A bzw. OC1B raus. Die PWM Erzeugung läuft grundsätzlich ohne Interrupts.
Das Updaten der Register OCR1A/B würd ich aber im Overflow Interrupt des Timers 1 machen um keine ungewollten Phasensprünge zu bekommen.
Die Ports OC1A und B müssen als Ausgänge geschaltet sein (DDR- Register).
Lass dir bei dem Datenblatt von jemanden mit guten Englischkenntnissen helfen - du wirst das Datenblatt noch öfter brauchen.
Code:
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Start
// Mode: PWM Phase Correct top=03FFh
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xA3;
TCCR1B=0x01;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
Dieser Beispielcode generiert bei einem 8MHz Quarz eine PWM Frequenz von ca. 7,5 kHz für beide PWM Ausgänge des Timers 1.
Die Konfiguration ist zur Zeit nur im Simulator getestet, die Schaltung dazu muss ich noch aufbauen.
Lesezeichen