habe ich eine 10Bit-Auflösung, die LEDs flimmern nicht mehr. 10Bit dürfte eigentlich gar nicht gehen. Wieso geht es trotzdem ? Irgendwie verstehe ich etwas falsch.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit WGM0 = %10 setzt Du den Timer auf CTC (Clear on Compare). Dann wird jeweils ausgelöst, wenn TCNT den Wert in OCRA erreicht und TCNT zurückgesetzt. Damit kann man eine veränderliche Frequenz erzeugen, ist OCRA klein ist die Frequenz hoch, wird OCRA größer sinkt die Frequenz.
Was nun wahrscheinlich passiert ist, dass bei kleinem OCRA die Frequenz so hoch ist, dass Du kein Flimmern siehst. Aber eine vernünftige PWM kann dabei eigentlich nicht rauskommen.
Wenn Du Flimmern vermeiden willst, musst Du die PWM-Frequenz erhöhen, indem Du den Prescaler TCCR0B verringerst oder den Bereich der PWM verringerst (64, 128 statt 256 Werte), letzteres geht natürlich auf die Auflösung.
Du musst hier unterscheiden zwischen der Frequenz, mit der der Timer läuft und die durch den Prescaler bestimmt wird. Mit dieser Frequenz schaut der Timer, ob OCRA oder OCRB erreicht sind und er den Ausgang umschalten muss. Das erfolgt automatisch in Hardware ohne Interrupt. Der Ausgang schaltet dann während 256 Durchläufen des Timers einmal ein, wenn OCRA erreicht ist, und wieder aus wenn TCNT überläuft. Daraus ergibt sich dann die PWM-Frequenz, die um 256 kleiner ist als die Timerfrequenz. Es gibt auch noch andere PWM-Modi, dabei läuft der Timer einmal bis 256 und dann wieder bis 0 zurück, und schaltet jeweils bei OCRA ein und aus. Damit ergibt sich ein sauberes Signal, man erkauft sich das aber durch Halbierung der PWM-Frequenz, weil ja insgesamt 512 Schritte gezählt werden.
Das dachte ich mir fast, das man dies mit dem Prescaler löst. Schlussendlich muss man die Parameter abschätzen, wen man den Timer noch anderwärtig braucht.
Wieder einmal zur Arduino-Software. Da macht man etwas mit dem Timer und verwundert sich, wieso, das auf einmal mit dem PWM etwas nicht stimmt. Wen man alles selbst macht, dann sieht man die Abhängigkeiten.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mathias hat geschrieben:Schlussendlich muss man die Parameter abschätzen, wen man den Timer noch anderwärtig braucht.
Nunja, da der 328 mit 3 Timern komfortabel ausgestattet ist, gibts meist eine Lösung.
Bei 8MHz kommt man in einer interruptgesteuerten Soft-PWM auf 300Hz PWM-Frequenz bei 256 Stufen Auflösung auf 8 Ausgängen gleichzeitig - allerdings in Assembler programmiert.
Nunja, da der 328 mit 3 Timern komfortabel ausgestattet ist, gibts meist eine Lösung.
Der Atmega328 schon, aber es gibt noch ATTiny, zB. der 2313, der hat nur 2 Timer. 3 Servos, und alle Timer sind in Gebrauch.
Bei 8MHz kommt man in einer interruptgesteuerten Soft-PWM auf 300Hz PWM-Frequenz bei 256 Stufen Auflösung auf 8 Ausgängen gleichzeitig - allerdings in Assembler programmiert.
Die ist natürlich auch eine Lösung, das Ganze Softwaremässig zu steuern, aber ob die Ideal ist ? Wie viel HZ braucht es, um einen Servo zu steuern ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mathias hat geschrieben:Der Atmega328 schon, aber es gibt noch ATTiny, zB. der 2313, der hat nur 2 Timer. 3 Servos, und alle Timer sind in Gebrauch.
Ja nur wenn man nicht programmieren kann.
Servos laufen mit 20msec Periodendauer und Pulsen zwischen 0.5msec und 2.5msec. Das mach ich Dir mit einem Timer und 256 Stufen Auflösung in Software - für 8 Kanäle gleichzeitig. Und da kann der Attiny nebenbei noch Seti rechnen...