Forum: Mikrocontroller und Digitale Elektronik Wie aus einem ADC -Eingang ein DAC Ausgang wird


von Michael von Gersdorff (Gast)


Lesenswert?

An die die (wie ich) auch immer Wieder zu wenig Analoge Ausgänge haben.

Man kann sich einen oder auch mehrere zusätzliche analoge Ausgänge
verschaffen indem man einen rail to rail-OP als Impedanzwadler
verschaltet (Ausgang mit neg. Eingang verbunden) und einen Kondensator
(beispielsweise 1uF) ueber beispielsweise 470 K, mit dem als Ausgang
geschaltetem ADC Kanal, läd oder entläd. Die Spannung am Kondensator
wird auf den + Eingang des Impedanzwandlers gegeben. Der Ausgang des
impedanzwandlers wird auch über 5..20 k mit den Pin des ADC-Kanals
verbunden. Der Trick ist jetzt daß man im Programm den ADC-Kanal bei
jedem loop einmal als Eingang schaltet und prueft ob die Spannung die
am Ausgang des Impedanzwandlers anliegt zu klein oder zu groß ist im
Vergleich mit dem Sollwert. Anschließend definiert man den gleichen
ADC-Kanal in einen Digitalen Ausgang um und setzt diesen auf Null falls
die Spannung zu groß war bzw. auf 1 falls die Spannung zu klein war.
Dadurch wird der Kondensator entsprechend ent- oder Geladen und die
Spannung nähert sich dem gewünschten Sollwert.
Fuer langsame Spannungsaenderungen mit sich nicht schnell ändernden
Sollwerten funktioniert die Sache bestens.
Sollte jemand Interesse haben und noch ein Verständnisproblem bestehen
kann ich noch einen Schaltplan nachliefern.
Michael

von Michael von Gersdorff (Gast)


Angehängte Dateien:

Lesenswert?

Schaltplan fuer ADC/DAC

von Peter D. (peda)


Lesenswert?

Wozu der Umweg über den ADC ?

Mach doch einfach ne Software-PWM mit dem Timerinterrupt.


Peter

von Michael von Gersdorff (Gast)


Lesenswert?

Hallo Peter
Ich hab schon alle 3 Timer verbraucht und dazu drei Interrupts. Kannst
Du mir dennoch grob erklären wie Du es machen wuerdest.

von Peter D. (peda)


Lesenswert?

@Michael

"Ich hab schon alle 3 Timer verbraucht"

Was meinst du damit ?


Timer verbrauchen sich nicht. Man kann mit ihnen doch mehrere Sachen
erschlagen.

Die kleinste Zeiteinheit wird als Interuptrate genommen und darin
werden für beliebig viele längere Zeiten Variablen (Register oder SRAM)
runtergezählt.


Peter

von Michael von Gersdorff (Gast)


Lesenswert?

Hallo Peter
Also eine Timer habe ich benutzt um eine Echtzeit-Uhr kombiniert mit
einer Stoppuhr (mit 32,..khz Quarz) zu realisieren. Der zweite (8bit)
macht schon PWM und der Dritte ist mit dem Messen einer Drehzahl
beschaeftigt (zählt mit Vorteiler bis ein externer Interrupt kommt,
wird zurueckgesetzt und zaehlt wieder los).
Welchen hälst Du unter diesen Bedingungen fuer den geeignetsten um noch
etwas anzuhängen. Nur der erste zählt durch und eigentlich immer bis zum
selben Wert. Die beiden anderen werden unter Umständen lang vor dem
Erreichen des Endwertes zurückgesetzt.
Michael

Ps: Ich komme ursprünglich aus der Analogtechnik und habe daher
keinerlei Berührungsängste mit diesen Bauelementen. Aber man kann immer
etwas dazulernen.

von Ronny Schulz (Gast)


Lesenswert?

Der Grundgedanke ist, dass Du einen Timer verwenden kannst, um einen IRQ
auszulösen. In diesem kannst Du dann beliebige Portpins ein- oder
auschalten und somit auch ein Software-PWM erzeugen. Um z.B. 2,5V am
Ausgang zu haben, schaltest Du den Ausgang einmal auf H und beim
nächsten mal auf L. 4 x H und 1 x L ergibt z.B. 4V. Und genau das musst
Du eben so umsetzen, dass es für deine Schaltung passt.

von Michael von Gersdorff (Gast)


Lesenswert?

Hallo Peter, hallo Ronny
Das Prinzip ist mir schon klar. Wenn ich also beispielsweise PWM mit
drei Ausgängen an nur einem Timer machen will und also drei Parameter
habe muß ich drei Mal einen Vergleich zwischen den Zählerregister und
meinen Parametern machen. Dazu muß ich meine Parameter wohl erst der
Größe nach sortieren und beispielsweise zunaechst den kleinsten
Parameter nehmen und warten bis der Interrupt des Zählers (ausgelöst
durch Vergleich mit dem Zählregister) erfolgt. Anschließend den Zweiten
Wert zum Vergleich nehmen und als letztes den Dritten. Dabei darf der
Zähler nicht zu schnell sein sonst gelingt das sequenzielle vergleichen
nicht wenn Parameter sich nur um 1 bit unterscheiden.
In meiner Anwendung müßte das immer mit dem Interrupt des Zählers
gemacht werden da mein Programm nicht mit dem ständigen Vergleich von
Registern beschäftigt werden darf. Ich habe zwar schon mit dem Auflösen
der Leiterplatte begonnen aber der Gedanke drei (oder mehr) PWM
Parameter über Software zu machen erscheint doch vielversprechend. Ich
hab zwar dann noch das Problem ständig unkontrollierte Interrupts mit
einigen Zeilen code zu haben die mit meinen anderen Interrupts
kollidieren können was beispielsweise bei dem seriell arbeitenden
MM5451 (LED-Treiber für 35 LEDs) zu flackernder Anzeige führen kann.
Dieser Baustein mag es nicht wenn er mitten in der Seriellen Übernahme
seiner 35 Bits unterbrochen wird. Dann erfindet er neue Zeichen auf dem
Display was natürlich stört. Bisher konnte ich das Problem damit lösen
daß ich den Displayteil immer kurz nach dem Interrupt angesprungen habe
da ich wußte daß der nächste Interrupt erst nach ca 10 ms kommen kann.
Vielleicht fällt Euch dazu auch noch etwas ein.
Michael

von Benedikt (Gast)


Lesenswert?

Ich verwende einen mega8515 als 32 Kanal PWM Steuerung für LEDs.
Die PWM hat 8bit und eine Ausgangsfrequenz von etwa 200Hz.

Ich denke du hast die Funktionsweise von PWM nicht so ganz verstanden:
In der Interrupt Routine wird ein Zähler hochgezählt und mit allen PWM
Werten verglichen. Ist der Zähler kleiner als der PWM Wert, wird der
entsprechende Pin auf 1 gesetzt, ansonsten auf Null.
Genauso funktioniert FastPWM.

von Peter D. (peda)


Lesenswert?

"Dieser Baustein mag es nicht wenn er mitten in der Seriellen
Übernahme
seiner 35 Bits unterbrochen wird. Dann erfindet er neue Zeichen"


Wie soll das gehen ?

Du hast einen Daten- und einen Takteingang und nach 36 Takten wird
übernommen, völlig unabhängig, wie lange ein Takt dauert.

Ich benutze die ICs auch und hatte noch nie Probleme.

Wenn Du Probleme mit Interrupts hast, dann wird wohl der Interrupt den
Taktpin auch benutzen und so zusätzliche Takte reinschummeln.


Zu PWM:

http://www.mino-elektronik.de/soft-pwm/pwm_software.htm


Peter

von Michael von Gersdorff (Gast)


Lesenswert?

Hallo Peter
Das liegt daran daß ich als Takt fuer den mm5451 den des 32 Khz Quarzes
der Uhr verwendet habe und der taktet natürlich weiter und nimmt keine
Rücksicht auf den Interrupt. Du hast vermutlich den Takt aus einer
Zähschleifer abgeleitet in der Du auch die 36 Zeichen uebertraegst. Da
kannst Du jederzeit aussteigen, einen Interrupt abarbeiten und
anschließend weitermachen. Auf diese Idee bin ich noch gar nicht
gekommen, ich bin aber auch etwas knapp mit port pins.

Frage, funktioniert der 5451-Baustein auch nahezu statisch so daß man
ueberhaupt keinen gleichmaeßigen Takt benoetigt?

Falls ja dann hast Du mir sehr geholfen da ich dann die Anzeigeroutine
noch deutlich (etwa um den Faktor 10) schneller machen kann und auf den
Takt des 32 Khz Quarzes verzichten werde. Ich wollte auch noch
Temperaturversuche machen da ich mir nicht sicher war ob der Quarz, an
den ich mich mit 20pf angehängt habe, bei -30....+70 Grad sicher
anschwingt. Die könnte ich mir dann sparen.
Einstweilen schon mal vielen Dank
Michael

von Michael von Gersdorff (Gast)


Lesenswert?

Hallo Benedikt
Die Funktionsweise von PWM im allgemeinen habe ich schon verstanden und
diese Technik bereits verwendet als man das noch überwiegend analog
realisiert hat. PWM ist alles was "pulse width modulation" ist. Aber
es gibt so unendlich viele Möglichkeiten diese zu realisieren (elegante
und weniger elegante) das man nicht immer direkt zur besten Lösung
kommt. Letztendlich ist es aber die Vielfalt die unser Hobby, oder
diesen Beruf so faszinierend macht.

In meiner Anwendung ist das PWM nur ein ganz kleiner Teil der Software
(unter 1%) und dient nur dazu die Helligkeit der 7-Segmentanzeige
abhängig von den Lichtverhältnissen zu regeln und die Lautstärke eines
Tongebers auf die in einem Fahzeug herschenden Geräuschquellen
anzupassen damit dieser nich überhört wird. Daher blieb für die PWMs
nur noch übrig was vom Mega32 noch nicht bereits vergeben war.
Michael

von Peter D. (peda)


Lesenswert?

Nun, ich würde den mm5451 an die SPI hängen, denn dazu ist sie ja da.

Du mußt dann natürlich 5 Byte (40 Takte) senden, was aber kein Problem
ist, da er ja auf das Startbit wartet.

Wenn da noch anderes am SPI hängt, dann mußt Du den Chipselect mit
verwenden.

Den Quarzoszillator sollte man generell nicht belasten, da er sehr
hochohmig ist und auch kein Rechteck rauskommt, sondern Sinus.
Wundert mich ehrlich, daß es überhaupt funktioniert.

Wenn Du nicht den Power Save Mode benutzt, dann lass den 32kHz Quarz
weg und nimm den Hauptquarz als Uhr. Dann hast Du außerdem 2 IOs mehr.


Peter

von Michael von Gersdorff (Gast)


Lesenswert?

Hallo Peter
Danke für den Tip. Ich schau mir die SPI Spezifikation an und probier
das Morgen mal aus.
Zum Thema Quarz, ich habe diesen mit einem Hochpaß mit 20pf und 1 M-Ohm
in Reihe belastet (am Atmega-pin der ein Ausgang sein soll) und schon
gemerkt daß da nur eine kleine Sinusspannung mit 200 mV anliegt. Daher
hab ich einen Komparator nachgeschaltet damit ich ein schönes Recheck
kriege. Bisher gabs damit keine Probleme.
Michael

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
Noch kein Account? Hier anmelden.