2017-02-16 1 views
0

Ich versuche, die Helligkeit einer LED mit PWM mit Timer0 auf dem ATMega164PA zu erhöhen. Nach dem Ausführen meines Codes unterhalb bleibt die LED nur ausgesendet und ändert ihre Helligkeit nicht.PWM mit ATMega164PA

Bitte nehmen Sie sich einen Blick auf meinem Code und ich sagen, ob es etwas, was ich falsch tue ist:

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

int dutycycle = 0; // Variable for dutycycle 

/********************************************** MAIN ****************************************************/ 
int main(void) 
{ 
    DDRB |= (1 << PB3); // Make pins output and OC0A pin for PWM 

    TCCR0A |= (1 << COM0A1) | (1<<WGM01) | (1<<WGM00); // Clear OC0A on comare match and set OC0A at BOTTOM 

    TIMSK0 |= (1<<TOIE0); // Overflow Interrupt Enabled 

    TCNT0 = 0; // Set Counter Value Register for comparison with OCR0A 

    OCR0A = (dutycycle/100) * 255; // Set duty cycle ON period 

    sei();  // Enable global interrupts 

    TCCR0B |= (1 << CS00); // Prescale of 1 - start timer 

    while (1) 
    { 
     _delay_ms(500); 

     dutycycle += 10;  // increase duty cycle by 10% every 500ms 

     if (dutycycle > 100) // if duty cycle is greater than 100% set to 0 
     { 
      dutycycle = 0; 
     } 
    } 
} 

ISR(TIMER0_OVF_vect) 
{ 
    OCR0A = (dutycycle/100) * 255; // Set duty cycle ON period 
} 

Antwort

3

ich nicht sicher, ob die Logik Ihres Ansatzes bin, aber ich kann ein offensichtliches Problem sehen, dass verursacht dir Schwierigkeiten.

Integer Division erzeugt keinen Bruch. Stattdessen wird das Ergebnis auf die nächste ganze Zahl abgerundet. Dies bedeutet, dass dutycycle/100 wird fast immer 0 sein, da Sie sicherstellen, dass dutycycle <= 100. So ist OCR0A fast immer 0. Die einzige Ausnahme ist, wenn dutycycle genau 100 ist, die OCR0A bis 255

Ein Weg setzt, um dieses ist OCR0A = dutycycle * 255/100; stattdessen zu verwenden. Ich weiß nicht, ob das alle Probleme beheben wird, nur die erste, die ich sehe.

+0

Ich versuche, das Tastverhältnis um 10% zu erhöhen, bis es 100% erreicht. Wenn dies passiert, möchte ich den Duty Cycle-Wert zurück auf 0 setzen und wiederholen. Ich erhalte nur eine Ausgabe, wenn ich den ganzzahligen Wert an der Spitze meines Codes ändere, es scheint, dass die Berechnung innerhalb der Hauptausgabe ignoriert wird und OCR0A gerade der Ganzzahl des Arbeitszyklus zugewiesen wird. Ich machte die Änderung, die Sie vorgeschlagen, aber immer noch kein Glück :( – LoneCoder

Verwandte Themen