Hallo, kennt sich jemand mit dem 24-bit ADC ADS1251 aus? Ich blick' nicht durch, welchen Pegel der DOUT/~DRDY-Pin nach dem Einschalten und nach Beendigung einer Datenübertragung hat. Danke! Peter
Ja, das sind huebsche 8polige AD-Cs von Burr Brown / TI. Die Übertragung hat mich auch ganz schoen gefuchst: die DOUT/~DRDY-Leitung geht an IRQ und an MISO. Den IRQ hab ich auf "positive Flanke triggern" eingestellt. In der ISR starte ich nur einen Timer mit einigen Mikrosekunden, sodass die t3 (s.Datenblatt) sicher vorbei ist (unkritisch), Fall=1 und disable den IRQ. Wenn der Timer ablaeuft, gibts einen TimerOverflow-Interrupt: dieser sendet auf dem SPI ein Word (16 bits) (mein SPI kann nicht mehr auf einmal), damit bekomme ich die Clocks (MOSI ist nc -> gesendete Daten gehen ins Nirwana). Jetzt loest SPI einen RX-Interrupt aus, bei dem gibt es eine Fallunterscheidung: 1. oder 2. Datenpaket à 16 Bits. 1. Fall: Bits abholen und speichern, und einen weiteren Write auf SPI ausgeben fuer die restlichen Bits. (Eigentlich waeren nur 8 Bits noetig, ich bin aber zu bequem zum jedesmal Umschalten. Wenn Dein SPI das kann, geht es auch mit 2*12 bits.) Fall=2. 2. Fall: Bits abholen und speichern, Flag setzen, dass ein Sample zur weiteren Bearbeitung zur Verfuegung steht, IRQ wieder freigeben. Die SPI-RX-ISR wird also zweimal aufgerufen. SPI-Clock (SCLK) hab ich auch mal mit 16MHz (ausserhalb der Spec) getestet: ging auch. Alles laeuft im Interrupt, ohne dass viel Rechenleistung weg geht, die brauche ich naemlich fuer die folgenden Digitalfilter, doch das ist ein anderes Kapitel... Noch ein Tip: wenn Du wirklich hohe Aufloesung brauchst, nimm lieber die ADCs mit mehr Pins, dann hast Du getrennte Versorgung fuer Digital und Analog. Sonst schaffst Du nicht mehr als 16-18 Bits. Der ADS1251 legt sofort los, sobald er Clocks auf CLK bekommt, Du brauchst nichts konfigurieren. Bitte berichte, wie es Dir gelang! Oder noch Fragen?
Um auf Deine Fragen genau einzugehen: Nach dem Einschalten: weiss ich nicht genau, ich denke low. Das Datenblatt haelt sich zurueck: Once the ADS1251 powers up, the DOUT/DRDY line will pulse LOW on the first conversion for which the data is valid from the analog input signal. Nach einer Übertragung: low, das siehst Du in FIGURE 12. DOUT/DRDY Timing: wenn alle 24 Bits abgeholt sind, ist der Ausgang low. Wenn Du jedoch nicht alle Bits abholst, bleibt er auf dem Bit stehen, das noch nicht abgeholt wurde, wenn gar keines geholt wurde, ist es das MSB (glaube ich). Wenn eine Übertragung fertig ist, kommt wieder DRDY-Mode, also je 6 Takte high-low-high. Außerdem mußt Du aufpassen, dass Du nicht in den Sync- oder Power-Down-Modus kommst, also SCLK nie laenger high lassen.
Hallo Profi, herzlichen Dank für Deine ausführliche Antwort! Was ich nicht ganz verstehe: Du stellst quasi im Controller eine Zeit für die ganze ~DRDY-Dauer ein? Ist das also sinnvoller, als alle Pegelwechsel im ~DRDY-Mode mit getriggertem, externem Interrupt, festzustellen. Für CLK würde ich einen AT90S2343 (an 3,6864 MHz) als einstellbaren Frequenzteiler verwenden (Reset-Leitung zu Master-Controller und 3 Pins zur Kodierung). Ich denke, dass das recht praktisch wäre. Was für eine CLK-Frequenz verwendest Du? Die Datenübertragung werde ich wahrscheinlich in SW machen (da habe ich schon mit dem LTC2400 gute Erfahrungen gemacht), will mich nicht zu viel in die SPI-HW-Schnittstelle des Controllers hineindenken. Wozu verwendest Du den ADS1251? Bis dann, Peter
Holla, das gesamte Timing bestimmt nur der ADS. CLK (38.4 KHz / 384 KHz bei mir) ist die 384 fache Sample-Frequenz (100 / 1000 Hz bei mir). Wenn Dein uC SPI hat, wuerde ich das unbedingt verwenden, erleichtert die Sache wesentlich und ist gar nicht so kompliziert! Extra einen uC als Taktgenerator empfinde ich einfach als verschwenderisch, kann Dein uC nicht einen Timer frei laufen lassen und das Signal auf einem Pin ausgeben? So hab ich es gemacht (Proc = DSP56F803 von Motorola). Wenn nicht: Timer soll Interrupt ausloesen, der dann ein Pin toggelt. Ich wandle das Signal von einer DMS (Dehnungsmessstreifen)-Waage und filtere es ein wenig. Und Du?
Hi, die Frequenzerzeugung mit einem zusätzlichen Mikrocontroller hat den Vorteil, dass auch hohe Frequenzen genau erzeugt werden können, ohne dass Interrupts stören. Ist für Dich der differentielle Eingang bei der DMS-Auswertung von Vorteil? Wie filterst Du? Wie erzeugst Du die Referenzspannung? Ich will mit dem ADS einen Luftdrucksensor (MPX4100) auswerten. Grüße, Peter
Frequenzerzeugung geht immer genau, auch mit insgesamt 1 Proc. Bitte mal meine Fragen beantworten zum Timer Deines uC beantworten. diff. Eingang: eigentlich nicht, da ich vorher 1200-fach verstaerke. Filter: ziemlich kompliziert: 4-fach 24bit Digitalfilter einstellbarer Ordnung und Grenzfrequenz, das freut den DSP Vref: mit einer 2.5V Referenzdiode Und wozu muss das so genau (24bit) gehen? MPX kenne ich gerade nicht, werde mal das pdf anschauen. Bis demnaechst.
Hi Profi, verwende den ATmega32. Du hast vollkommen Recht, ein zusätzlicher uC ist Schwachsinn, die Timer des Mega haben ja eine Compare Match-Funktion. Die Auflösung benötige ich, da ich mit diesem Luftdrucksensor einen Höhenmesser (für Modellflugzeuge) bauen will. Wie versorgst Du den ADS1251? Bis dann, Peter
Was meinst Du mit versorgen, Vcc oder CLK? Vcc: 3.3V Regler mit vielen Cs CLK: ich starte einen freerunning Timer mit dem Reload-Wert 521 (40Mhz/38.4kHz/2) und sage ihm, er soll bei jedem Match ein Pin togglen, das geht zum CLK. Kann das Dein Mega nicht, ein Timersignal auf einem Port ausgeben? Schau doch mal im pdf nach, oder soll ich das tun? Luftdruck: Und was ist, wenn während des Fluges das Wetter umschlägt?
Hallo allerseits, ich habe mich auch für den ADS1251 für meine Schaltung entschieden und schon ein wenig mit dem Auslesen der Messwerte gekämpft da ich noch ein Anfänger im Programmieren bin. Dies hätte ich nun mit ein paar hilfreichen Beiträgen aus diesem Forum geschafft. Mein Problem ist nun das ich mit den Messwerten nichts anfangen kann. Ich habe mich zwar schon ein wenig in die Materie "2 Komplement" eingelesen aber mein Messwerte ergeben für mich leider keinen Sinn. Ich versorger den IC mit +5V gegen GND. Die Referenzspannung habe ich auf +2,5V gelegt und ebenfalls den IN- Eingang da ich positive und negative Spannungen messen muss. Laut dem Diagramm von TI im Anhang müsste ich daher bei +2,5V am IN+ gegen IN- den Dout Wert von 7FFFFFh erhalten. Ich erhalte diesen Wert aber schon bei +1,25V und anschließend steigt der Wert immer weiter an bis FFFFFFFh obwohl die Spannung immer positiv bleibt!!!!???? Ich habe den HEX-Wert mit Oszi und µC gemessen und er müsste daher stimmen. Mir scheint es sehr verdächtig das es genau die halbe Referenzspannung ist?? Das selbe gilt übrigends in der negativen Richtung nur umgekehrt. Bei -1,25V am IN+ gegen IN- ist der negative Maximalwert 800000h und danacht wird er linear kleiner bis annähernd 000000h. Link App Note: http://www.ti.com/lit/an/slaa242/slaa242.pdf Link Datasheet: http://www.ti.com/lit/ds/symlink/ads1251.pdf Weiß jemand was mein Fehler ist bzw hat jemand eine Vermutung?? Vielen Dank im Voraus!
Habe den Fehler inzwischen gefunden. Der µC bzw die Software hat keinen Bug, nur die Elektronik machte Probleme. Der AD-Wandler wird über einen Logik Isolator galvanisch vom µC getrennt und dieser macht mir in der Data-Ready-Phase einen Peak auf der SCLK Leitung und somit fehlte immer das erste Daten Bit für die Polarität. Anbei noch ein Screenshot vom Oszibild falls es jemanden interessiert.
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.