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
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
@ 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.
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.