ATmega16 Timer 1 Phase Correct PWM Mode

Mit diesem Sorucecodebeispiel kann der Timer 1 des ATmega16 im Phase Correct PWM Mode initialisiert werden.


Beschreibung

Timer 1 läuft im Phase correct PWM Mode. An PD5 wird das PWM Signal ausgegeben. Die Overflow- und Compare Interrupts sind aktiviert und ihr Auftreten wird auf den Kanälen PA0 und PA1 gezeigt. Jedes Mal, wenn einer dieser Interrupts stattfindet, erscheint auf dem Digitalport ein Puls. Das PWM Signal hat einen Dutycycle von 10%.

C Sourcecode

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

int main(void)
{

    DDRD = 0x20;                         // Setup PD5 as output
    DDRA = 0x03;                         // Setup PA0 and PA1 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)
{
     PORTA ^= 0x01;                       // Toggle PA0
     PORTA ^= 0x01;                       // Toggle PA0
}

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

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

Signalplots

ATmega16 Timer 1 Phase Correct PWM 1

Gelb: Digitales Ausgangssignal PD5 (OC1A)

Blau: Digitales Ausgangssignal PA1

Rot: Digitales Ausgangssignal PA0