Forum: Mikrocontroller und Digitale Elektronik ADS 8320 ADC verhält sich merkwürdig


von Sven B. (scummos)


Lesenswert?

Hallo!

Ich habe mir einen ADS 8320 ADC [1] gekauft. Diesen versuche ich jetzt 
über SPI mit einem Raspberry Pi anzusteuern. Ich habe die im Datenblatt 
vorgeschlagene Schaltung aufgebaut [2] und die Anschlüsse entsprechend 
verkabelt. Wenn ich nun 3 Bytes sende und empfange (zum Beispiel mit dem 
spi-bcm2708-Treiber, der im Linux-Kernel für den auf dem Pi verbauten 
SPI-Controller beiliegt), kriege ich auch tatsächlich Daten, die so 
aussehen, wie das was man erwarten würde (ändern sich, wenn man eine 
andere Spannung anlegt, etc.). Rechnet man diese allerdings wie folgt
1
// rx ist der Buffer mit den empfangenen Daten und enhält 3 Bytes
2
int r0 = rx[0] & 0b00000011;
3
int r1 = rx[1];
4
int r2 = rx[2] & 0b11111100;
5
int result = (r0 << 14) + (r1 << 6) + (r2 >> 2);

in eine Dezimalzahl um, so ergibt sich ein sehr merkwürdiges Bild [3], 
wenn man die Spannung am Netzteil langsam hoch- und wieder runterdreht. 
Bei näherem Hinsehen fällt auf, dass schon in den übertragenen Bitfolgen 
immer wieder deutliche Sprünge zu erkennen sind. Ein Beispiel solcher 
Daten ist hier [4]: je weiter man runter scrollt, desto größer ist die 
anliegende Spannung (die ersten 6 und letzten 2 Bit sind Müll, die Daten 
fangen mit dem höchstwertigen Bit beim 7. Bit der ersten Zeile an; die 
durch Striche getrennten Dreierblocks sind immer eine Messung). Ungefähr 
bei Zeile 170 passiert aber etwas sehr merkwürdiges: Die Einsen am 
Anfang verschwinden einfach, ohne das nächsthöhere (achte) Bit zu 
flippen. Erst bei der nächsten Markierung (127 Zeilen später) wird 
dieses dann inkrementiert -- nachdem das nächst-niederwertige (neunte) 
Bit zum zweiten Mal von 1 auf 0 wechselt.

Das verstehe ich nun wirklich überhaupt nicht. Ich konnte dieses 
Verhalten mit verschiedenen Bus-Takten zwischen 8kHz und 2MHz 
reproduzieren, und zwar mit dem Hardware-SPI-Controller + Kerneltreiber 
und meiner eigenen "Bit-Banging"-Softwarelösung über die GPIO-Pins 
(letztere erreicht natürlich bei weitem keine 2MHz Bustakt).

Ich habe mir das Ganze auch mit dem Oszilloskop angeschaut, aber bei der 
Softwarelösung flackert es extrem, und bei dem Hardware-Controller sind 
immer so kleine Pausen zwischen den Bytes, sodass ich mir nie ganz 
sicher bin, ob jetzt ein oder zwei nebeneinanderliegende Bits geflippt 
wurden... deshalb kann ich leider keine definitive Aussage treffen, ob 
man das Verhalten hier auch beobachten kann (das Oszilloskop ist leider 
rein analog).

Nun frage ich mich, woran kann das noch liegen? Habe ich den Chip 
vielleicht duch unvorsichtiges Löten gegrillt? Ich denke eigentlich 
nicht, und wenn, dann wäre das ja doch eine sehr merkwürdige 
Fehlfunktion, oder?
Einen zweiten habe ich leider nicht da, weil die ziemlich teuer sind (10 
Euro) und ich eigentlich nur einen brauche.

Hat irgendjemand noch eine Idee, was man versuchen könnte, um dem 
Problem auf die Spur zu kommen?

Danke und viele Grüße,
Sven
_______
[1] Datenblatt: http://www.ti.com/lit/ds/symlink/ads8320.pdf
[2] Siehe Datenblatt Seite 13. Foto meines Aufbaus: 
http://i.imgur.com/28nwU.jpg
[3] Messdaten bei einer zuerst ansteigenden, dann wieder abfallenden 
Spannung : http://i.imgur.com/w1gUd.png
[4] http://pastie.org/4897771

von holger (Gast)


Lesenswert?

>Hat irgendjemand noch eine Idee, was man versuchen könnte, um dem
>Problem auf die Spur zu kommen?

Das Timing Diagramm aus dem Datenblatt 1:1 nachbilden?
Das kann man mehr per Bitbanging eigentlich immer gut machen.
Also schön langsam und darauf achten bei welchem Bit wo was passiert.
Wann wird CS auf 0 gezogen, bei welcher Flanke von CLK muss ich lesen...

Wenn das klappt Speed geben;)

von Sven B. (scummos)


Lesenswert?

Hey,

das habe ich eigentlich probiert, auch darauf geachtet, bei welcher 
Flanke die Daten übertragen werden, und mit verschiedenen Delays 
versucht... irgendwie hat das nicht geklappt! Immer dasselbe Ergebnis. 
:(

Grüße,
Sven

von holger (Gast)


Lesenswert?

>das habe ich eigentlich probiert, auch darauf geachtet, bei welcher
>Flanke die Daten übertragen werden, und mit verschiedenen Delays
>versucht... irgendwie hat das nicht geklappt! Immer dasselbe Ergebnis.

Dann machst du was falsch. Was auch immer.
Mit nem AVR, PIC oder ARM hätte ich das Timing Diagramm dieses
ADC in weniger als einer Stunde im Griff.

>das habe ich eigentlich probiert

Mach es nicht "eigentlich" sondern richtig. Dann geht das auch.
Hört sich blöd an, aber so ist es nun ein mal;)

von Sven B. (scummos)


Lesenswert?

Hi,

holger schrieb:
> Dann machst du was falsch. Was auch immer.
> Mit nem AVR, PIC oder ARM hätte ich das Timing Diagramm dieses
> ADC in weniger als einer Stunde im Griff.
Dass das Bauteil beschädigt ist, hältst du demzufolge für 
ausgeschlossen?
Gut, dann werde ich das nochmal probieren. Ich finde es nur sehr 
merkwürdig, dass der Hardware-SPI-Controller dasselbe Problem hat wie 
meine selbstgeschriebene Lösung -- und für den in Frage kommt ja nur ein 
Fehler in Hardware oder im Linux-Kernel, und die sind eigentlich beide 
relativ selten. Oder eben eine Inkompatibilität zwischen Controller und 
Chip, aber das ist aufgrund der Software-Geschichte auch irgendwie 
unwahrscheinlich.

Ich versuch's nochmal mit dem Oszi, vielleicht kann man das ein bisschen 
besser einstellen. Dann sieht man vielleicht, ob der Fehler beim 
Empfangen der Daten passiert, oder ob der ADC schon falsche Daten 
sendet.

Gruß,
Sven

von Bernhard S. (b_spitzer)


Lesenswert?

Falscher SPI-Mode?? Ansonsten sieht der Wertebereich aus dem Bild 
http://i.imgur.com/w1gUd.png irgendwie stark nach übersteuertem Eingang 
aus. Beim Messwert 800 (ca.) hat der Digitalwert den Maximalwert 65535 
erreicht. Danach kommt aber nochmal der Rest der positiven Halbwelle. Da 
ist was faul. Wie ist In- und In+ beschaltet? Welche Versorgungsspannung 
wird genutzt, woher kommt die Referenzspannung?
Messe mal Ratiometrisch, Uref=Vcc, Poti als Spannungsteiler zwischen 
Uref, In+ und In-, In- auf GND. Dann noch ein paar nF von In+ nach GND. 
Jetzt sollte der Potiweg im Bereich 0x0000 beis 0xFFFF abgebildet 
werden.

von Sven B. (scummos)


Lesenswert?

Hi!

Ich habe einige (eigentlich "alle verfügbaren") SPI-Modes probiert, ich 
bin mir ziemlich sicher, dass es daran nicht liegt. Die ankommenden 
Daten sind zwar leicht unterschiedlich (der Offset verschiebt sich), 
aber das Ergebnis ist im Endeffekt dasselbe. Manche funktionieren 
natürlich auch überhaupt nicht. Und: In dem, was ich anhand des 
Timing-Diagramms selbst geschrieben habe, gibt es ja so etwas wie einen 
Mode gar nicht. :)
Übersteuert sollte das Ganze eigentlich auch nicht sein, im Datenblatt 
steht "bis +- VRef", und VRef sind 3.3 Volt. Die kommen vom 3.3V-Pin des 
RPi (ich weiß, keine tolle Referenz für tatsächliche Einsätze). Die 
Test-Spannung am Input kommt aus einem großen Labornetzteil und beträgt 
in dem Diagramm, was ich gepostet habe, maximal 2.5V -- also klar 
kleiner als VRef (die beiden Massen sind natürlich verbunden). Das 
Labornetzteil habe ich schon bei verschiedenen Gelegenheiten 
ausgemessen, dessen Spannung ist sehr stabil und verlässlich. Ein 
anderer (viel billigerer!) ADC zeigt eine glatte, saubere Kurve beim 
Hochdrehen des Reglers.

Dass die Spannung nach dem Maximalwert abbricht, ist auch nicht das 
einzige Problem, diese Abbrüche passieren ja auch während des Anstiegs 
immer wieder (in kleinem Maße). Es sieht fast so aus, als ob da im Laufe 
der Daten zwei oder drei Bits fehlen, aber so ganz passt das irgendwie 
auch nicht.

Das mit dem Poti werde ich morgen mal ausprobieren, danke für den 
Hinweis. Ich kann mir zwar nicht vorstellen, dass es an der 
Eingangsspannung liegt, aber eine gute Testmethode ist es trotzem.

Grüße,
Sven

von Sven B. (scummos)


Lesenswert?

Hallo!

Ich habe mich gerade nochmal drangesetzt, und den Fehler gefunden: das 
Kabel, mit dem die SPI-Kanäle verbunden waren, war wohl zu lang, und es 
haben sich Störungen eingeschlichen. Ein Anlöten von drei 
100pF-Kondensatoren der drei SPI-Lanes zu GND neben dem ADC hat das 
Problem sofort gelöst, und die Daten sehen jetzt sehr gut aus:
http://i.imgur.com/daKQV.png

Überrascht bin ich, dass man dies auf dem Oszilloskop wirklich überhaupt 
nicht gesehen hat, da sah die ganze Kommunikation perfekt scharf aus.

Danke für eure Hilfe.

Viele Grüße,
Sven

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.