schneller Timer ATMEGA32

Gast #456183
Lesenswert?
• ▲
▼
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
Gast #456220
Lesenswert?
• ▲
▼
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
#456237
Lesenswert?
• ▲
▼
> 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.

Gast #456245
Lesenswert?
• ▲
▼
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
Gast #456670
Lesenswert?
• ▲
▼
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
#456707
Lesenswert?
• ▲
▼
> 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.

#456710
Lesenswert?
• ▲
▼
> 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
Gast #456732
Lesenswert?
• ▲
▼
@ 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
#456739
Lesenswert?
• ▲
▼
> 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.

Gast #456868
Lesenswert?
• ▲
▼
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.

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