Forum: Compiler & IDEs schneller Timer ATMEGA32


von Sebastian (Gast)


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

von Thomas (Gast)


Lesenswert?

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

von Sebastian (Gast)


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

von Karl H. (kbuchegg)


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.


von Thomas (Gast)


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

von Thomas (Gast)


Lesenswert?

...Nachtrag...

Habe gerade gesehen, dass die PWM "händisch" erzeugt wird...dann geht's 
am "genauesten" über den CTC-Mode.

Gruß

von Karl H. (kbuchegg)


Lesenswert?

> Wieso CTC-Mode?

Weil du im CTC den Timer nicht bis zum Endwert laufen
lassen musst um einen Interrupt zu kriegen.

von Sebastian (Gast)


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

von Karl heinz B. (kbucheg)


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.


von Karl heinz B. (kbucheg)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Seh viel höher als 1kHz wirst du da nicht kommen.

Schneller ist der LDR ohnehin nicht. ;-)

von Sebastian (Gast)


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

von Karl heinz B. (kbucheg)


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.


von Sebastian (Gast)


Lesenswert?

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.

von unscheinbarer WM-Rahul (Gast)


Lesenswert?

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

von Sebastian (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

Welchen Elko? Wert?

von Sebastian (Gast)


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.

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
Noch kein Account? Hier anmelden.