PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM mit Nadelimpulsen und genauen Frequenzen



IE04
25.09.2006, 20:42
Hallo alle zusammen!

Ich habe ein Problem und finde einfach keine gescheite Lösung.

Ich möchte Nadelimpulse erzeugen, die ich auf vier unterschiedliche Frequenzen umschalten kann. Als µC benutze ich einen AtMega8 bzw. möchte später den AtMega88 verwenden. Die Frequenzen sind 15,6 kHz; 31,2 kHz; 46,8 kHz und 53,1 kHz.

Ich dachte mir, dass ich dafür eigentlich sehr gut die PWM des AVRs benutzen könnte, da dadurch sehr wenig Rechenzeit verbraucht wird.

Das Problem ist, das ich durch die PWM entweder Nadelimpulse erzeugen kann, wobei ich damit nicht die Frequenzen hinbekomme die ich brauche, oder aber die Frequenzen mit einer halben Schwingung High-Pegel und einer halben Schwingung Low-Pegel.

Habe schon überall gesucht und mir den Kopf über das Problem zerbrochen. Der Artikel im Wiki zur PWM hat mir als Anfänger zwar schon sehr viel gebracht, aber eine passende Lösung ist mir nicht gekommen.

Was ich mir noch in den Sinn kam wäre: Die Ausgabe der PWM auf einen Interrupt zu geben, der bei H/L auslöst und dadurch die Impule ausgibt.

Nur ist mir der Interrupt eigentlich nicht so recht, weil er mir die Hauptschleife unterbricht.

Hat jemand vielleicht eine Idee, wie ich das hinbekommen kann ohne Außenbeschaltung des AVR? Oder geht es eurer Meinung nur mit zusätzlichen Bauteilen oder Interrupt?

Vielen Dank für euer Interesse!

Bis dann

Jens

sigo
25.09.2006, 21:41
Hi, warum nicht die Frequenz erzeugen und dann einen Nadelimpuls mit externer Hardware machen, kostet zwar ein bischen Platz, aber nicht viel. Und es kostet auch sehr wenig.

Zur Erzeugung des Nadelimpulses gibt es ja viele Möglichkeiten. Im einfachsten Fall würde evtl. ein kleiner RC-Hochpass reichen, der bei der positiven Flanke einen positive Nadel erzeugt.

Die Interruptlösung wäre eigentlich nicht sooo schlimm, oder?
Denn die ISR könnte extrem kurz sein. Du könntest die Hauptschleife evtl. ebenfalls interruptgetrieben machen, mit einer zeitlichen Reserve. Sodass die Zykuszeiten der Hauptschleife wieder konstant werden. Wenn du am Anfang eine Zyklus einen Timer startest (Watchdog?) kannst du am Ende ggf. auf den Timer warten..

Sigo

magnetix48
25.09.2006, 22:04
Hallo Jens,

Um den Vorschlag von sigo aufzugreifen:

Mit einem spannungssteuerbaren Monoflop, das dürfte mit einem NE555 machbar sein, könnte man die Nadelimpulse in der Breite steuern.
Die Taktfrequenz steht ja, bis auf die 53,1 kHz, in einem leicht hardwaremäßig erzeugbaren Verhältnis zueinander. Mit diesem Takt könnte das Monoflop angesteuert werden.
Ich weiß nicht, ob du diese Spannungssteuerbarkeit brauchst.

Gruß
Detlef

kalledom
26.09.2006, 14:44
Hallo Jens,
ich habe solch eine ähnliche 'Geschichte' soeben (bin mit der Hardware noch nicht komplett fertig) mit einem PIC realisiert: Ruhezeit von 0,1...6553,5ms und dann ein kurzer Impuls von 0,1...25,5ms, mit 'meiner' Philosophie zum Betrieb von Mikro-Controllern.
Ein Timer-Interrupt wird (in meinem konkreten Fall) alle 0,1ms ausgelöst und nichts anderes gemacht, als ein 16 Bit Zähler bis auf 0 decrementiert.
Beim Erreichen von 0 wird ein zweiter 8 Bit Zähler mit einem Wert geladen und ebenfalls im 0,1ms-Takt decrementiert; beim Erreichen von 0 wird der Ausgang abgeschaltet.
In Deinem konkreten Fall würde ich den Timer-Interrupt entsprechend der gewünschten Frequenz initialisieren und bei jedem Interrupt den Ausgang setzten und nach 1...n mal nop wieder abschalten; dann hast Du ziemlich genaue Nadelimpulse.

PS: In Deiner 'Hauptschleife' kannst Du dann richtig rumtrödeln, weil dort kein Interrupt und somit kein Nadelimpuls verloren geht.

waste
26.09.2006, 23:51
Hallo Jens,

imho sollte das im Fast PWM Mode mit dem ATmega8 schon möglich sein. Lies mal im Datenblatt bei Timer1 und Fast PWM Mode nach. Nur das mit der genauen Frequenz könnte ein Problem werden. Da der Timer den Clock nur ganzzahlig teilen kann, ergibt sich z.B. bei 8MHz Clock anstatt der gewünschten 53.1kHz nur 52.98kHz. Bei 16MHz Clock sieht es etwas besser aus, da könnte man 53.156kHz einstellen.

Waste

E-Fan
27.09.2006, 13:28
Es gibt noch eine weitere Möglichkeit. Im CTC-Mode (clear Timer on Compare Match) zählt der Timer1 bis zu einem vorgegebenen Wert und negiert jedes mal den "Zustand" des dazugehörigen Ports. Ob man das Tastverhältniss ändern kann weiß ich nicht weil ich es noch nicht ausprobiert habe. Allerdins kann man, wie es schon gesagt wurde, ein Monoflop nachschalten und die Länge des Peaks unabhängig von der Frequenz erzeugen.
Der Attiny26 kann auf die oben beschriebene Weise einen Takt von maximal 32Mhz erzeugen wenn er mit 8Mhz getatktet wird. (ein Timer läuft dann mit 64Mhz (mehr geht nicht!) und zählt immer bis 1)

IE04
28.09.2006, 17:28
Hallo alle zusammen!

Vielen Dank für die super Ideen.

Ich denke das Beispiel von Detlef passt am besten für meine Schaltung. Zwar muss ich da etwas Außenbeschaltung in Kauf nehmen aber das krieg ich hin. Was mir daran sehr gut gefällt ist, dass ich die Peaks genau so einstellen kann, wie ich sie benötige.

Das mit dem Timer hatte ich am Anfang schon probiert aber da kam bei mir kein befriedigendes Ergebnis heraus. Daher habe ich mich auch an euch gewandt.

Ich denke am Wochenende werde ich dazu kommen wenigstens ein bisschen etwas am Projekt zu machen.

Bis dann

Jens