ATmega8 Timer1 Phase Correct PWM

dieses Programm betreibt den Timer1 im Phase Correct PWM Mode und zeigt Overflow und Compare Zeitpunkte an.

electroicsplanet home electroicsplanet pagetree Sourcecode Examples electroicsplanet pagetree ATmega8 electroicsplanet pagetree Timer1 electroicsplanet pagetree Phase Correct PWM

Beschreibung

Dieser Code für den ATmega8 Timer1 PWM arbeitet mit dem Phase correct PWM Mode. Der Ausgang PC0 zeigt die Zeitpunkte des Overflows an, der Ausgang PC1 die Zeitpunkte der Compare Matches, wo das PWM signal umschaltet. Diese bieden Ausgänge werden in ihren Interruptroutinen umgeschaltet. Das PWM Signal selber ist am Ausgang PB1 (OC1A) ist das PWM Signal abgreifbar.

Buchtippp:


AVR Mikrocontroller
In C programmieren

C Sourcecode

#include <avr/io.h>
#include <avr/interrupt.h>

int main(void)
{

    DDRB = 0x02;                         // Setup PB1 as output
    DDRC = 0x03;                         // Setup PC0 and PC1 as output

    ICR1 = 1000;                         // Set TOP to 10000
    OCR1A = 100;                         // Set Dutycycle to 10%

    
    
    TCCR1A = (1<<WGM11)|(1<<COM1A1);     // Set Timer1 in Phase Correct Mode
                                         // with ICR1 as TOP value. Set OC1A
    TCCR1B = (1<<WGM13)|(1<<CS10);       // on compare match and clear OC1A
                                         // on BOTTOM. Clock Prescaler is 1024
              
              
    TIMSK |= (1<<TOIE1) | (1<<OCIE1A);   // Enable Timer 1 Overflow
                                         // and Compare interrupt
    sei();                               // Set the I-bit in SREG

    for(;;);                             // Endless loop
                                         // main() will never be left

    return 0;                            // This line will never be executed
}

// Interrupt subroutine timer 1 overflow
 ISR(TIMER1_OVF_vect)
{
     PORTC ^= 0x01;                       // Toggle Pc0
     PORTC ^= 0x01;                       // Toggle PC0
}

// Interrupt subroutine timer 1 compare A match
 ISR(TIMER1_COMPA_vect)
{
     PORTC ^= 0x02;                       // Toggle PC1
     PORTC ^= 0x02;                       // Toggle PC1
}

Download C-Sourcefile mit ASCII-Schema: C-Sourcefile mit ACII-Schema

Signalplots

####Plotbeschreibung####

Gelb: Digitaler Ausgang OC1A

Blau: Digitaler Ausgang PC0

Rot: Digitaler Ausgang PC1