Hi,
ich habe mir den Kopf zerbrochen, wie ich eine "frei einstellbare"
Frequenz mit dem ATMEGA8 erzeugen kann, ohne dafür Interrupts oder
Schleifen verwenden zu müssen. Nach Stundenlanger Datenblattstudie ist
es mir gelungen!!! ;-) mit dem Timer1 im Fast-PWM-Mode eine variable
Frequenz zu erzeugen, die so zusagen "im Hintergrund" generiert wird,
und der Programmablauf somit nicht unterbrochen wird (so wie wirs vom
PWM kennen).
TCCR1B=(1<<WGM13)|(1<<WGM12)|(1<<CS10);
// clkI/O/1 (No prescaling), WGM10,11,12,13-> Fast PWM (siehe S.97)
TCCR1A=(1<<WGM11)|(1<<WGM10)|(1<<COM1A0);
// COM1A0:Toggle OC1A on compare match (siehe S. 96, S. 89)
OCR1A = 100;
// Frequenz einstellen
Gruß
Zoltan
Das ist korrekt, allerdings habe ich diese Modis so verstanden das das
Pulsweitenverhältniss immer 50% ist und nicht mehr variabel. Die wäe
dann eigentlich kein PWM mehr sondern nur ein Frequenzgenerator.
Oder habe ich das laut Datenblatt falsch verstanden ??
Gruß Hagen
Hi,
ja, Du hast schon Recht, es ist ein reiner Frequenzgenerator. Ich hätte
vielleicht die Überschrift "Frei veränderliche symetrische Frequenzen
mit dem PWM-Generator" nennen sollen.
Ich nehme an, dass man auch PWM mit variablen Frequenzen erzeugen kann,
auch ohne die vorgegebenen Frequenzteiler 1,8,64... verwenden zu
müssen. Das habe ich aber noch nicht probiert.
Vollständigkeitshalber sei noch erwähnt, dass man den Port PB1(OC1A)
als Ausgang definieren muss, denn an diesem Pin wird die Frequenz
ausgegeben.
Gruß
Zoltan
Auch dies solllte gehen, allerdings steige auch ich nicht 100%'tig
durch das Datenblatt durch.
Modis 4,8,9,10,11,12,14,15 sollten damit funktionieren. Bei diesen
Modis kann man TOP vorgeben,entweder über ICR1 oder OCR1A.
Was ich allerdings NICHT verstanden habe ist wie sich nun bei Benutzung
von OCR1A als TOP Register die PWM auf Kanal B auswirkt. Denn nur unter
der Annahme das Kanal B durch den TOP Wert im OCR1A beeinflußt wird,
wird es möglich über OCR1B den Dutycycle/Pulsweite des Kanales B
relativ zu eingestellten PWM Frequenz über OCR1A zu verändern. Nur,
müsste dann Kanal A ja dann immer 50% PWM haben ??
Wir ICR1 als TOP Register benutzt würde es meiner Meinung nach bedeuten
das nun Kanal A und B in der Frequenz über ICR1 eingestellt werden. Die
Pulsweite beider Kanäl müsste dann jeweils über OCR1A und OCR1B
einstellbar sein. Allerdings geht aus den Datenblättern der
Zusammenhang zwischen diesen Modis und den dadurch verfügbaren Modis
und Konsequenzen nicht hervor (meiner Meinung nach).
Eventuell gibts hier ja Experten die darüber genauer Auskunft geben
können.
Gruß Hagen
>"...Nur,müsste dann Kanal A ja dann immer 50% PWM haben"
Ich denke, dass es auch so funktionieren muss, wie Du es beschrieben
hast. Im Datenblatt sind diese zusammenhänge tatsächlich sehr schwer zu
erkennen, daher denke ich, dass Du das Verhalten Simulieren solltest.
Oder noch besser wäre es, ein Programm in einem MC zu brennen, und so
das Verhalten zu testen.
Falls Du es ausprobierst, und zu einem Schluss kommst, dann wäre es
nett von Dir, wenn du das Resultat hier posten könntest.
Gruß
Zoltan
Hallo alle,
ich weiß nicht, ob noch jemand an dieser Stelle mitliest, aber ich habe
mal eine Frage dazu. Ich bin vollkommener Neuling was µCs angeht.
Ich würde gern einen atmega8 als Taktgenerator verwenden (sofern es
keine andere Möglichkeit gibt), wobei ich möglichst genau (+- 3 Hz)
57000 und 38000 Hz erzeugen möchte. Wenn ich mir obige Kommentare zu
den Programmen ansehe, schein dies möglich. Allerdings wurde ich heute
verunsichert, man sagte mir, die kleinste Änderung der herauskommenden
Frequenz beträgt Quarztakt/2^16, bei 16 MHz also 244,14 Hz.
Hat jemand hier eventuell genauere Infos oder vielleicht sogar ein
kleines Programm, welches mir die o.g. Taktraten ausgibt?
Vielen Dank für Infos,
Grüße, Nik
Hallo Nik,
Du kannst mit den Timern jede gewünschte Frequenz erzeugen und das sehr
genau.
Prog:
(ich lasse hier den ganzen Vorspann, wie Prozessor,Takt,Ausgänge weg)
"
TCCR1A=&B01000000 'Pin OC1a/PB1 toggeln, kein PWM
TCCR1B=&B00001010 'Timer-Reset bei Compare, Clock/8
COMPARE1A=230 'Vergleichswert setzen (OCR1AH+OCR1AL)
"
Der Wert 230 von COMPARE1A errchnet sich aus:
Quarzfrequenz(3.6864
MHz)/Vorteiler(8)/2(Vollwelle)/1kHz(Wunschfrequenz)
Die Klammerwerte sind mein Beispiel.
Bei 57kHz(Deine Wunschfrequenz) und 8MHz(Quarz) ergäbe das einen
Komperatorwert von 8,7719298245614035087719298245614. Du kannst aber
nur gerade Werte einstellen also 8 oder 9 dies ergäbe dann eine
Frequenz von 62500Hz. bzw. 55555,555 Hz. Wenn Du aber den Weg gehst und
gleichzeitig Deine Quarzfreqenz änderst sowie mit den verschiedenen
Vorteilern (0/8/64/256/1024) herumrechnest, müsstest Du exakt auf
Deinen Wunschfrequenz kommen.
mfg.
Dietmar
Hi, Nik,
erzeugen können wir so nur Frequenzen mit einem ganzzahligen
Teilverhältnis vom Systemtakt.
Du könntest die Frequenzen 38 kHz und 57 khZ (ist da ein Zusammenhang
mit dem RDS auf UKW?) ganz genau erzeugen mit einem Systemtakt von 11.4
MHz (38 kHz: Teilfaktor 30, 57 kHz: Teilfaktor 20.)
Und falls es wirklich RDS sein sollte und Du Deinen Decoder nachregeln
willst, dann nimm doch einen VCXO für die 11.4 MHz... Eine Variation
von 3 Hz bei 38 kHz verträgt auch ein UART.
Ciao
Wolfgang
P.S. Sorry, aber mir macht es Spaß, Gedanken weiterzudenken.
Hallo Dietmar, hallo Wolfgang, hallo alle :)
Danke für die Antworten! Ich werde mich mit den Anregungen mal genauer
"reinfuchsen" und experimentieren.
@Wolfgang: Alle Achtung :) das trifft's exakt :)
Grüße, Nik