mikrocontroller.net

Forum: Projekte & Code Frei veränderliche symetrische Frequenzen mit PWM


Autor: Zoltan (Gast)
Datum:

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

Autor: Hagen (Gast)
Datum:

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

Autor: Zoltan (Gast)
Datum:

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

Autor: Hagen (Gast)
Datum:

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

Autor: Zoltan (Gast)
Datum:

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

Autor: Armin Kniesel (Gast)
Datum:

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

Autor: Nik (Gast)
Datum:

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

Autor: Dietmar (Gast)
Datum:

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

Autor: Wolfgang Horn (Gast)
Datum:

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

Autor: Nik (Gast)
Datum:

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

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.