Forum: Mikrocontroller und Digitale Elektronik MCP3201 ADC Probleme


von Steve M. (jodziste)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe den MCP3201 ADC an einem ATmega8 laufen. Der konvertierte Wert 
wird per SPI eingelesen und testweise auf einem LCD ausgegeben, was auch 
eigentlich funktioniert. Wenn der Eingang vom ADC auf Vcc liegt sehe ich 
auf dem Display 4099, was abgesehen von den 4 bit zu viel, passt. Jetzt 
habe ich einen Poti (100k) als Spannungsteiler zwischen Vcc und GND, 
dass ich also auf dem Display Zahlen zwischen 4096 und 0 sehen sollte. 
Die Zahlen von 1000 bis 4096 lassen sich problemslos einstellen. Wenn 
ich jedoch den poti bei 1000 weiter runterschraube ist der nächste Wert 
9990, von dort geht es dann runter in 10er Schritten bis ca. 2300 (nach 
jeder rotation über 9990 etwas mehr/weniger).
Wenn ich jedoch den poti auf GND drehe und den µC reset zeigt es 
plötzlich nur sowas wie 2 oder 1 an... was richtig ist. Wenn ich jedoch 
in den zweistelligen Bereich schraube komme ich nicht unter ca. 21.
Im Dreistelligen nur runter auf ca. 220.
Da sieht man ein Muster... hab nur keinen Plan wo das Problem liegt.
MfG Steven
PS: die SPI-Auslese routine ist von 
http://www.speedlimit88.com/arduino/spi_adc/

von Jens (Gast)


Lesenswert?

Dann ist dein Programmcode halt falsch.
Es kommen Werte. Also gehen wir davon aus, dass das Auslesen aus dem ADC 
funktioniert.

Nimm dir mal das Datenblatt vor und schau dir die Bit Order im 
Resultregister an.
Man kann schnell sehen, dass deine Shift Operationen im Programmcode 
falsch sind.
Bei einem 12bit Wandler kann man nicht über 4095 kommen. Wenn dem doch 
so ist, dass ist die Umrechnung (Shiften) falsch.

Das kann auch deine Überläufe und dein komisches Verhalten erklären.

Das: result = result >> 1 ;
sollte result = result >> 2 ; sein denke ich.

Im Ergebnisregister muss du nicht nur ein bit wegschmeißen, sondern 2. 
Da sind ja nicht nur B0 sondern auch B1 enthalten. Beide brauchst du 
nicht.

Gruß

von Steve M. (jodziste)


Lesenswert?

Danke für die Antwort.
result = result >> 1 sorgt dafür ,dass das erste bit von der LSB first 
übertragung rausgeschoben wird(b0 gehört noch zur MSB first übertragung)
Wenn ich da eine 2 verwende komme ich auf nur max. 2049 und min ca. 800.

von Steve M. (jodziste)


Lesenswert?

Hab das Shiften auf Papier nachvollzogen und ich kann keinen Fehler 
entdecken :-/

von 61er (Gast)


Lesenswert?

1000 Loops und y soll eine 16 Bit Variable sein?

von Steve M. (jodziste)


Lesenswert?

das ist nur zur stabilisierung und für die ablesbarkeit des Wertes auf 
dem LCD

von Steve M. (jodziste)


Lesenswert?

Ohne den 1000 Durchläufen bekomme ich 4095 als maximal Wert, da scheint 
das Problem nicht zu liegen.
Brauche bitte hilfe

von Steve M. (jodziste)


Angehängte Dateien:

Lesenswert?

Also, ich habe erstmal die Hardware neu aufgebaut um dort defekte etc. 
auszuschließen. Dies hatte nichts gebracht.
Durch rumprobieren habe ich in der Software noch am Anfang ein 
lcd.clear() eingefügt. Dies hat das Problem behoben, ich weiß jedoch 
nicht genau warum. Es hat auf alle Fälle was mit dem LCD zu tun. 
(speichert der HD4470 die Werte die er anzeigen soll und "vermischt" die 
vorherigen mit den nächsten?)
Zumindest die SPI-abfrage ist richtig.
MfG Steven

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.