Hallo, Ich muss eine Software PWM mit möglichst hoher Frequenz ausgeben. Die PWM funktionier auch schon, die Frage ist, ob der Timer nicht schneller eingestellt werden kann, da ich mit der PWM einen LED-LDR Koppler steuern will, durch den ein Audiosignal läuft. ISR (TIMER0_OVF_vect) { zaehler ++; if (zaehler == 100) //100 => 1 Periode { zaehler = 0; } if (an > zaehler) { PORTB |= (1 << PB3); } else { PORTB &= ~(1 << PB3); } } void init(void) { DDRB = 0xff; //PORTB Ausgang TCNT0 = 0xFF; //Timerwert TCCR0 = (1 << CS00); //kein Prescaler TIMSK = (1 << TOIE0); //Timer0 Interrupt an } int main (void) { init (); sei(); //globaler Interrupt an PORTB = 0x01; an = 5; //5% Helligkeit for (;;) { } } So sieht das PWM Programm aus. Hab ich mich irgendwo vertan, oder geht der echt nicht schneller? Der µC läuft mit 4,19Mhz. Jede PWM Periode hat 100 Timer-Overflows. Da komme ich auf eine Frequenz von ca 40Khz. Der LDR hängt zum Testen in Reihe zu einem Audiosignal. Beträgt meine "an-Zeit 5/100" , dann höre ich im Lautsprecher eine Art Knattern.Da kann doch irgendwas nicht stimmen. M f G Sebastian
Also ich hatte einmal etwas mit einem ATMEGA128 mit Oszi-F=4,096MHZ und da konnte ich maximal 16KHz PWM ausgeben. Schau' doch einfach mal ins Datenblatt -> da müsste eine Berechnungsformel für den jeweiligen Modus stehen. Mfg
Hallo, Ins Datenblatt hab ich schon geschaut.. daher bin ich ja der Meinung, dass es nicht schneller geht. Laut Datenblatt ist das die Initialisierung für den Betrieb ohne Vorteiler, d.h. mein Timer läuft jeden Takt über (da der Startwert FF ist).... Vll. liege ich aber auch total falsch. M f G Sebastian
> d.h. mein Timer läuft jeden Takt über (da der Startwert FF > ist).... Wieso soll der Timer bei jedem Takt überlaufen? Der Timer zählt munter von 0 bis 255, macht den Überlauf, beginnt wieder bei 0 usw. Beim ersten mal hast du zwar einen Timerwert vorgegeben, mehr aber auch nicht. Wenn dus schneller brauchst, dann beschäftige dich mal mit dem CTC Modus des Timers. Wenn du den Maximalwert von 100 auf 50 runterholst, verdoppelst du ebenfalls die PWM Frequenz.
Hallo, @Karl: Wieso CTC-Mode? Ich bin davon ausgegangen, dass PWM mit einer festen Frequenz und einer variablen Pulsdauer (Tastgrad 1%..99%) funktionieren sollte. Habe gerade nochmal im DB nachgeschaut und finde unter "fast pwm-mode" folgende Formel: f_pwm <= f_clk / 256 f_pwm <= 4,019MHz / 256 = 15699,2 Hz Grüße Thomas
...Nachtrag... Habe gerade gesehen, dass die PWM "händisch" erzeugt wird...dann geht's am "genauesten" über den CTC-Mode. Gruß
> Wieso CTC-Mode?
Weil du im CTC den Timer nicht bis zum Endwert laufen
lassen musst um einen Interrupt zu kriegen.
Hallo, Werde mal schauen, was es mit dem CTC Modus auf sich hat. Wusste auch nicht, dass man den TCNT0-Wert immer wieder neu beschreiben muss, würde aber das knarrende Geräusch erklären. M f G Sebastian
> Jede PWM Periode hat 100 Timer-Overflows. Da komme ich auf eine Frequenz > von ca 40Khz. Wenn du bei jedem Takt einen Overflow kriegen würdest. Was du aber nicht kriegst, du kriegst nur bei jedem 256ten Takt einen Overflow > Wusste auch nicht, dass man den TCNT0-Wert immer wieder neu > beschreiben muss, würde aber das knarrende Geräusch erklären. ( 4000000 / 256 ) / 100 = ~ 156 Hz Könnte hinkommen.
> da ich mit der PWM einen LED-LDR Koppler > steuern will, durch den ein Audiosignal läuft Willst du einen Messwert in einen Ton umwandeln? Oder was wird das? Seh viel höher als 1kHz wirst du da nicht kommen. Selbst 1kHz wird schon knapp. Da bleiben im Interrupt grade mal 40 Taktzyklen, bei einer PWM Abstufung von 100
> Seh viel höher als 1kHz wirst du da nicht kommen.
Schneller ist der LDR ohnehin nicht. ;-)
@ Karl Heinz Buchegger: OK, wie 156Hz klingts auch :) Habe jetzt den Startwert bei jedem Interrupt wieder auf FF gesetzt. also wäre das dann doch 156Hz * 255 = 39,7kHz. Wofür das Ganze? LDRs als Poti-Ersatz in einem Gitarren-Röhren-Preamp. -> Ich will zuerst mal verschiedene LDR Koppler testen, d.h. der µC soll eine Widerstandskennlinie messen. (Auf der Platine sind 3 Konstantstromquellen, die über den µC geschaltet werden können, das ergibt 3 Messbereiche: <10k, <100k, <1M). Die Kennlinie wird dann in Excel angezeigt... Dabei bin ich halt auf das Problem gestoßen, dass die PWM zu langsam ist. Wahrscheinlich werde ich es auch auf 8Bit DA Wandler (Latch mit 8 Rs) umbauen, dann hat man zumindest kein Zeitproblem und kann die Kennlinie sauber aufzeichnen. M f G Sebastian
> Habe jetzt den Startwert bei jedem Interrupt wieder auf FF gesetzt Das wird weniger bringen als du glaubst. Vor allen Dingen wird der µC nur noch Overflow Interrupts bearbeiten. Und zwar zu 100%. > LDRs als Poti-Ersatz in einem Gitarren-Röhren-Preamp. Dann solltest du die PWM mit einem Elko glätten und so aus dem Rechteck eine variable Spannung machen.
Habe schon versucht, die Spannung mit nem Elko zu glätten, was aber dazu führt, dass es sehr träge wird, zu träge.
>dass es sehr träge wird, zu träge
Dann hast du ein zu grosses C oder R gewählt; deine Zeitkonstante R*C
ist also zu groß.
Naja, ich hab einfach mal nen Elko parallel zur LED geschaltet, was wohl eh nicht optimal ist, da ich keinen Treiber oder sonstwas verwende. Evtl nochmal mit Transistor versuchen...
2,2µF war zu klein. 100µF lag noch da rum, also hab ich den genommen :) Aber das ganze Konzept hinkt. Da müssen später ca 15-20 LEDs mit angesteuert werden. Denke da is ne 8Bit Latch Version besser geeignet. Zumindest keine Zeitprobleme.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.