Den Elko braucht man nicht, wenn die PWM Frequenz hoch genug ist. Das Auge ist echt träge in der Hinsicht.
Bei deinem Programm ist das Problem, dass du die An-Zeit unangetastet lässt und die Aus-Zeit verlängerst. Das Problem dabei ist, dass du damit de-facto die PWM-Frequenz kontinuierlich veränderst. Richtig wäre:
X Takte an, Y-X Takte aus. Wenn du die LED also einen Takt länger an hast, ist sie auch einen Takt weniger aus, sodass die Zyklus-Zeit immer gleich lang bleibt.
Hast du dir mal meinen Link zu Gemüte geführt? Da ist das genau so erledigt.
Code:
ISR(TIMER2_OVF_vect) {
TimerCounter++;
if (TimerCounter > 1023 ) {
TimerCounter = 0;
if (lr1 != 0) { n1_Port |= (1 << n1_Pin);}
if (lr2 != 0) { n2_Port |= (1 << n2_Pin);}
if (lr3 != 0) { n3_Port |= (1 << n3_Pin);}
if (lr4 != 0) { n4_Port |= (1 << n4_Pin);}
if (lr5 != 0) { n5_Port |= (1 << n5_Pin);}
if (lr6 != 0) { n6_Port |= (1 << n6_Pin);}
}
if (TimerCounter > lr1) {
n1_Port &= ~(1 << n1_Pin);
}
if (TimerCounter > lr2) {
n2_Port &= ~(1 << n2_Pin);
}
if (TimerCounter > lr3) {
n3_Port &= ~(1 << n3_Pin);
}
if (TimerCounter > lr4) {
n4_Port &= ~(1 << n4_Pin);
}
if (TimerCounter > lr5) {
n5_Port &= ~(1 << n5_Pin);
}
if (TimerCounter > lr6) {
n6_Port &= ~(1 << n6_Pin);
}
}
lr1..lr6 Das sind die Helligkeitswerte der LEDs. Diese Function wird vom Timer aufgerufen (Overflow des Timers). Was passiert sollte anhand des Codes eigentlich ersichtlich sein: Erreicht die Laufvariable 1024, so wird sie auf Null gesetzt und alle LEDs eingeschaltet. Dann läuft sie wieder hoch bis 1024. Erreicht sie dabei den Helligkeitswert einer LED so wird diese Ausgeschaltet. Die Gesamtlaufzeit dieses Zyklus ist also immer 1024 Durchläufe (also eine konstante Zeit). Das Verhältnis von An und Aus ergibt also die Helligkeit der LED.
Bääääär
Lesezeichen