ATmega32 PWM LED Dimmer

Gast #1376772
Lesenswert?

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

void Init_PORT(void)
{

 PORTD = 0x00;
 DDRD = (1<<PD5);

}


void Init_PWM(void)
{

 //Timer1, Fast PWM,

 TCCR1A = (1<<COM1A1) | (1<<WGM11);
 TCCR1B = (1<<WGM12) | (1<<WGM13) | (1<<CS10);


}



void Set_PWM(unsigned int value)
{

 OCR1A = value;
 ICR1 = 0xFFFF;

}




int main(void)
{

 Init_PORT();
 Init_PWM();


 while(1)
 {


   Set_PWM(x);


 }

 return 0;

}
#1376861
Lesenswert?

Warum setzt du IRC1? Das ist zumindest für eine normale PWM bei fester 
Frequenz nicht nötig.
Dass Du Set_PWM() in einer Endlosschleife stehen hast ist auch nicht gut 
wenn vor dem Setzen des Registers nicht darauf gewartet wird dass der 
Timer auf 0 steht.

Spring einmal vor der Endlosschleife in die Set_PWM() Funktion und 
danach nur noch wenn sich der Wert auch ändert. Das gibt sonst ein 
Durcheinander.

Grüße
#1376866
Lesenswert?

Tilo schrieb:
> Ich Versuche gerade ein Power LED (weis) zu dimmen aber je dunkler ich
> sie dimmen will (kleinerer pwm  wert = dunkler) desto mehr flackert es.
> Der Atmega32 (Timer1) wird an 4Mhz betrieben (PWM Pre. = 1).
>
> Wie kann ich dieses Problem eliminieren?

Indem du keine volle 16 Bit PWM benutzt.
Bei 4Mhz kommst du damit auf eine PWM-Frequenz von ~61Hz.
Und wenn die Led Dunkel ist, sieht man das bereits.

Bruachst du wirklich eine LED mit 65536 verschiedenen Helligkeitswerten?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren