Forum: Mikrocontroller und Digitale Elektronik A/D-Wandler ADS1255 läuft nicht


von Wolfgang-G (Gast)


Lesenswert?

Unter "Auswahl eines AD Wandlers" im Analogforum  hatte ich schon mit 
der gleichen Frage um Hilfe gebeten.

Hat jemand einen funktionstüchtigen Programmschnipsel für den ADS1255?
Der ADS1255 auf meiner Leiterplatte antwortet nicht. Bevor ich den
ADS1255 austausche, wollte ich ausschließen, dass ich einen Fehler im
Programm habe.
Das Programm muss nicht ausgefeilt sein, Hauptsache es läuft und liefert
Messwerte ab.

MfG

von Wolfgang-G (Gast)


Lesenswert?

wahrscheinlich haben sich nur wenige mit dem ADS1255 beschäftigt.
deshalb die Anfrage noch einmal hochrücken
MfG

von TrippleX (Gast)


Lesenswert?

Als erstes Frage ich mich was du mit einen 24 Bit ADC machst.

Was funktioniert den genau nicht und forallen wie läuft
deine Kommunikation aus und wie ist der Aufbau?
Schon Grundlegende Dinge wie Spannunsversorgung und so durchgetestet?

Auf fertigen Code von jemanden brauchst du gar nicht hoffen ist
nicht grad ein 08/15 ADC sondern ein ziemlicher Brocken.

von Arc N. (arc)


Lesenswert?

Wolfgang-G schrieb:
> Unter "Auswahl eines AD Wandlers" im Analogforum  hatte ich schon mit
> der gleichen Frage um Hilfe gebeten.
>
> Hat jemand einen funktionstüchtigen Programmschnipsel für den ADS1255?
> Der ADS1255 auf meiner Leiterplatte antwortet nicht. Bevor ich den
> ADS1255 austausche, wollte ich ausschließen, dass ich einen Fehler im
> Programm habe.
> Das Programm muss nicht ausgefeilt sein, Hauptsache es läuft und liefert
> Messwerte ab.
>
> MfG

Die üblichen Verdächtigen sind schon ausgeschlossen?
- AVDD, DVDD innerhalb der Spezifikationen und halbwegs sauber?
- saubere Referenzspannung an VREFP, VREFN?
- Beschaltung von /RESET, /SYNC, /CS i.O.?
- wie sieht der Takt an XTAL1 aus bzw. schwing der Quarz sauber (an)
- "manuelle" Wandlung getestet (Figure 18. Data Retrieval After 
Synchronization im DS, falls die Schaltung das zulässt)?
- alle SPI-Modes getestet?
- SPI-Timing (Serial Interface Timing im DS)

Was kommt denn zurück, wenn folgendes gesendet wird
1
    SelectADC();
2
    dummy = SPITransfer(0x10);
3
    dummy = SPITransfer(0x00); 
4
    // SPI timing
5
    wait(); 
6
    res = SPITransfer(0x00);
7
    DeselectADC();

von Wolfgang-G (Gast)


Lesenswert?

etwas zum Stand des Aufbaus und den bisherigen Ergebnissen
 - ADS1255 ist an einem MSP430F1611 angeschlossen
 - über die SPI schnittstelle lief früher schon mal ein LTC2400 
erfolgreich
 - beim Aussenden eines Zeichens ist an SCLK der Takt mit einem Oszi
   erkennbar
 - das ausgesendete Zeichen (Bitmuster) ist mit dem Oszi an Din des
   ADS1255 zu sehen
 - egal was gesendet wird, an Dout des ADS1255 ist kein Bitmuster zu
   sehen,  woraus ich schließe, dass der ADS1255 nicht antwortet und 
evtl.sogar defekt ist

  es könnte aber natürlich auch an meinem Programm liegen, deshalb meine
  Anfrage

MfG

von Arc N. (arc)


Lesenswert?

Wolfgang-G schrieb:
> etwas zum Stand des Aufbaus und den bisherigen Ergebnissen
>  - ADS1255 ist an einem MSP430F1611 angeschlossen
>  - über die SPI schnittstelle lief früher schon mal ein LTC2400
> erfolgreich
>  - beim Aussenden eines Zeichens ist an SCLK der Takt mit einem Oszi
>    erkennbar
>  - das ausgesendete Zeichen (Bitmuster) ist mit dem Oszi an Din des
>    ADS1255 zu sehen
>  - egal was gesendet wird, an Dout des ADS1255 ist kein Bitmuster zu
>    sehen,  woraus ich schließe, dass der ADS1255 nicht antwortet und
> evtl.sogar defekt ist

Wieviele Bytes werden gesendet/welches Kommando? (bspw. dürfte bei WREG 
nichts auf DOUT zu sehen sein)

Was passiert an /CS?
Wie sind SPI Phase und Polarity beim MSP eingestellt?
Was ist mit den Punkten von oben?

>   es könnte aber natürlich auch an meinem Programm liegen, deshalb meine
>   Anfrage
>
> MfG

von Wolfgang-G (Gast)


Angehängte Dateien:

Lesenswert?

@Arc Net
Vielleicht kannst Du Dir mal meine Schaltung  im Anhang ansehen und den 
Kommentar zu:

Was kommt denn zurück, wenn folgendes gesendet wird
    SelectADC();                           //  CS = L ;  oder ????
    dummy = SPITransfer(0x10); //sendet den Befehl für ??
    dummy = SPITransfer(0x00); //sendet den Befehl für ??
    // SPI timing              // was soll hier geschehen
    wait();                    //warten; wie lange?
   res = SPITransfer(0x00);    // kann ich nicht deuten
    DeselectADC();         //  CS = H ;  oder ????

ergänzen.
MfG

von Gast (Gast)


Lesenswert?

Steht die Bedeutung der Befehle nicht im Datenblatt??

von eProfi (Gast)


Lesenswert?

AGND und DGND muss an einem Punkt verbunden sein, am besten direkt am 
Wandler.
Diese Stelle ist immer heikel, vor allem wenn die beiden GNDs noch an 
anderen Stellen (z.B. weiteren Wandlern oder Netzteil) verbunden sind. 
Da sind Ringströme vorprogrammiert.
Deshalb kann man die Verbindung auch mit 1 - 5 Ohm machen.

Die Potentiale diese beiden Pins dürfen nicht zu weit auseinander 
liegen, das nehmen die Wandler einem übel (werden heiß und kaputt).

Die 100 Ohm kommen mir ein bisschen hoch vor. Evtl. musst Du beim 
Anlegen der betroffenen Signale ein paar µs warten. 22-47 Ohm versuchen.

Mit dem ADS1252 habe ich schon viel gemacht, ist halt ziemlich tricky, 
da dort nur ein Pin für "Wandlung fertig" und "Data out" verwendet wird.

Habe jetzt das Datenblatt des 1255 nicht gelesen, wer gibt den SCLK vor? 
Ich vermute mal der MSP. Welche Frequenz?  Evtl. mal heruntersetzen.

von Wolfgang-G (Gast)


Lesenswert?

>AGND und DGND muss an einem Punkt verbunden sein, am besten direkt am
>Wandler.
ich kenne es so: analoge und digitale Masse am Kondensator der 
Stromversorgung verbinden.

Die Verbindung von AGND und DGND wurde auf der Leiterplatte zwischen 
Anschluss Nr. 2 des LP2950 und Anschluss Nr. 1 Kondensator C10 
hergestellt.
Im Schaltplan leider falsch gezeichnet. Die schräge Signalleitung (im 
Plan nahe IC2/10 gezeichnet) muss an C10/1 enden.
Dies dürfte aber für die Grundfunktion des ADS1255 zunächst zweitrangig 
sein.
MfG

von Arc N. (arc)


Lesenswert?

Kurz zur Schaltung:
- keine Input/Output-Kondensatoren für den LP2950?
- keine Bypass-Kondensatoren für AVDD?
- die Bypass-Kondensatoren am MAX6126 sollten hier 100nF und 10uF sein
  (u.U. kann auch noch ein Buffer zw. Referenz und ADC nötig sein,
  z.B. DS Figure 26.)
- kein Pull-up auf /CS?

Das Beispiel etwas ausführlicher.
Das Timing ist auf Seite 6 im Datenblatt erklärt:
SCLK t1: min. 4 / 8 MHz = 500 ns, max. 10 / fData
t6: min. 50 / 8 MHz = 6.25 us
1
uint8_t SPITransfer(uint8_t val) {
2
    U0TXBUF = val;
3
    // while (!(IFG1 & URXIFG0)) { } or nops
4
    return U0RXBUF
5
}
6
7
void wait(uint8_t adcClocks) {
8
    // depends on MCU clock frequency!
9
    for (uint8_t i = 0; i < adcClocks; i++) {
10
        nop();
11
    }
12
}
13
14
// read one register, command RREG (DS page 36)
15
uint8_t ADCRREG(uint8_t reg) {
16
    uint8_t dummy, res;
17
    // /cs = low 
18
    SelectADC(); 
19
20
    // first byte = command and start reg
21
    dummy = SPITransfer(0x10 | reg); 
22
    // second byte = number of registers to read - 1
23
    dummy = SPITransfer(0x00); 
24
25
    // DS page 36 and page 6
26
    // wait t6
27
    wait(50);                 
28
    res = SPITransfer(0x00);    
29
    DeselectADC();         
30
    // wait t10  
31
    // wait(8);
32
}
33
34
// read multiple regs, command RREG (DS page 36)
35
void ADCRREGs(uint8_t startReg, uint8_t numRegs, uint8_t* bufferP) {
36
    if (!bufferP) return;
37
    
38
    SelectADC(); 
39
    dummy = SPITransfer(0x10 | startReg); 
40
    dummy = SPITransfer(numRegs - 1); 
41
42
    wait(50); 
43
 
44
    for (uint8_t i = 0; i < numRegs; i++) {
45
        bufferP[i] = SPITransfer(0); 
46
    }
47
    DeselectADC();
48
    // wait(8);
49
}


> ich kenne es so: analoge und digitale Masse am Kondensator der
> Stromversorgung verbinden.

Wie schon oben ausgeführt: Auf keinen Fall
http://www.analog.com/library/analogDialogue/Anniversary/12.html

von Rainer (Gast)


Lesenswert?

Hallo Wolfgang,

zu dem Codeschnipsel von Arc Net:

>    SelectADC();                           //  CS = L ;  oder ????
Jupp

>    dummy = SPITransfer(0x10); //sendet den Befehl für ??
Datenblatt -> 0x1x: Register auslesen
Hier Register 0x00 -> Statusregister

>    dummy = SPITransfer(0x00); //sendet den Befehl für ??
Dieses Byte gibt an wieviel Bytes ausgelesen werden sollen -1
-> 0x00 entspricht 1 Byte

>    // SPI timing              // was soll hier geschehen
>    wait();                    //warten; wie lange?
wie oben schon angesprochen ist das hier die t6 Zeit (siehe Datenblatt)
Dieses timing ist bei dem ADC sehr kritisch und der Baustein nimmt es 
einem echt übel, wenn es nicht eingehalten wird. 50 Clocks haben bei uns 
nicht ausgereicht, es ging erst mit 60 (besser 100).
Auserdem wichtig: Stell sicher, das alle Bits von deiner UART 
rausgetacktet worden sind. Erst dann läuft die t6 Zeit

>   res = SPITransfer(0x00);    // kann ich nicht deuten
Hier wird ein Dummy Byte gesendet, damit der ADC was sendet, denn ohne 
Takt vom Master macht der nix. Der Registerinhalt steht dann in res, 
wenn ich den Befehl SPITransfer richtig deute.

>    DeselectADC();         //  CS = H ;  oder ????
Jupp

Generell würde ich dir aber raten noch mehr Zeit mit dem Datenblatt zu 
verbringen, da steht eigentlich alles drin. Der ADS1255 ist ein guter 
Wandler, aber er reagiert ziemlich zickig, wenn man bei den timings 
nicht genau aufpasst.

Gruß
Rainer

von Wolfgang-G (Gast)


Lesenswert?

Vielen Dank an Arc Net und Rainer.

>- kein Pull-up auf /CS?
Lt. Datenblatt  Bild 27 nicht vorgesehen

Die Hinweise zum Programmablauf muss ich mir noch genauer durcharbeiten 
und dann testen.

Persönlich gefallen mir die ausführlicheren Kommentare von Rainer etwas 
besser, da die erwarteten Voraussetzungen nicht so hoch sind.

MfG

von Wolfgang-G (Gast)


Lesenswert?

Habe noch etwas hinzuzufügen
>- keine Input/Output-Kondensatoren für den LP2950?
>- keine Bypass-Kondensatoren für AVDD?
Die habe ich doch tatsächlich vergessen - wird aber sofort ergänzt
MfG

von Wolfgang-G (Gast)


Lesenswert?

>Generell würde ich dir aber raten noch mehr Zeit mit dem Datenblatt zu
>verbringen, da steht eigentlich alles drin.
Das ist ja richtig, aber entweder hat man es falsch übersetzt, etwas 
übersehen oder nicht richtig verstanden, zumal oftmals die Schaltkreise 
unterschiedlich funktionieren und für viele Datenblätter 100 Seiten 
nicht reichen.
Jetzt läuft bei mir zunächst das Auslesen eines Messwertes.
Hauptursache war die falsche Polarität für SPI. Der ADS 1255 erwartet 
für den SCLK Takt im inaktiven Zustand L.
Noch nicht verstehe ich, wie man die Kalibrierung und 
Nullpunkteinstellung programmiert. Dies sollte bei mir der nächste 
Schritt werden.
Gibt es eine Art Initialisierung zur Vorbereitung des Wandlers?
Vielleicht hat jemand nützliche Tipps (außer Datenblatt lesen)

MfG

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.