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
wahrscheinlich haben sich nur wenige mit dem ADS1255 beschäftigt. deshalb die Anfrage noch einmal hochrücken MfG
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.
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(); |
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
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
@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
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.
>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
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
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
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
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
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.