www.mikrocontroller.net

Forum: Compiler & IDEs schneller Timer ATMEGA32


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...Nachtrag...

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

Gruß

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wieso CTC-Mode?

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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.


Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Schneller ist der LDR ohnehin nicht. ;-)

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: unscheinbarer WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen Elko? Wert?

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.