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, ich habe das in Codevision so gemacht: // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 4000,000 kHz // Mode: Ph. correct PWM top=OCR1A // OC1A output: Toggle // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge TCCR1A=0x43; TCCR1B=0x11; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x05; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; und dann kann man die gewünschte Frequenz folgendermaßen einstellen: Quarzfrequenz 4 gewünschte Hz = OCR1A
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.