Forum: Mikrocontroller und Digitale Elektronik atmega16 und DA-Wandler MCP4921


von hoanz (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Freunde,

ich möchte einen MCP4921 12Bit DA-Wandler per ATmega16 via SPI 
ansteuern. Das gelingt mir mittlerweile auch schon recht gut, ich kann 
dem DA-Wandler sagen was er machen soll, und er tut ungefähr das... aber 
eben nur ungefähr.

Zum Testen möchte ich ganz einfach die Variable
1
value.Short

in der Funktion  update() übertragen. Bei 12 bit sollte ich somit bei 
einem Wert von 4096 die Referenzspannung am Ausgang messen (4.09V). 
Leider stimmen diese Werte bei mir überhaupt nicht.

Bei einem Wert von value.Short von 300 messe ich 0.443V, bei 600 1.202V 
und wenn ich value.Short auf 2000 setze,  messe ich sogar 4.98V.

Ich übertrage die beiden Bytes (12 Bit Daten, und 4Bit overhead) ganz 
einfach nacheinander.

Kann bitte jemand schnell den Code anschauen und mir sagen wo der Fehler 
liegt? Vielleicht liegt es trotzdem an der Art wie ich die Bytes 
übertrage, aber ich kann den Fehler beim besten Willen nicht finden.

Denkt ihr es kann an der Beschaltung liegen. Im Moment ist der Ausgang 
des DA-Wandlers einfach offen.

Vielen Dank für die Hilfe

Hoanz

von Falk B. (falk)


Lesenswert?

@ hoanz (Gast)

>in der Funktion  update() übertragen. Bei 12 bit sollte ich somit bei
>einem Wert von 4096 die Referenzspannung am Ausgang messen (4.09V).

Nein. Der größte Wert eines 12 Bit Wandlers ist 4095 und knapp unter 
Vref.

AD-Wandler

http://www.mikrocontroller.net/articles/Quantisierung

>Bei einem Wert von value.Short von 300 messe ich 0.443V, bei 600 1.202V
>und wenn ich value.Short auf 2000 setze,  messe ich sogar 4.98V.

>Denkt ihr es kann an der Beschaltung liegen. Im Moment ist der Ausgang
>des DA-Wandlers einfach offen.

Ist OK.

Im Prinzip sollte dein programm funktionieren, wenn gleich die Funktion 
noch etwas sehr gebastelt ist. Du musst aber den gainx1 Modus noch 
einschalten, sonst geht es nicht. DU kannst keine Spannung > VCC 
erzeugen. Also noch ein

value.Short |= 0x2000;  // GAIN x1

ergänzen.

von hoanz (Gast)


Lesenswert?

Hallo Falk

Falk Brunner schrieb:
> value.Short |= 0x2000;  // GAIN x1

Tatsächlich, das war das Problem. Vielen Dank für deine Hilfe. Du 
schreibst meine Funktion sei etwas gebastelt. Kannst du mir, wenn du 
Zeit hast, sagen was ich noch besser machen könnte?


Danke nochmals
Hoanz

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.