Analogsignal per SPI auslesen: ASD1256 auf Waveshare High-Precision AD/DA Board

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Moin zusammen,
    ich habe ein Waveshare High-Precision AD/DA Board gekauft, um ein Analogsignal (0-2V) zu digitalisieren und zu messen. Auf der Platine ist ein Texas Instruments ADS1256 Chip (Datenblatt) verbaut. Mit dem vom Hersteller zur Verfügung gestellten Beispiel-Programm werden auch Werte ausgegeben. Das Programm ist allerdings in C geschrieben, was ich erstens höchstens radebrechend kann und zweitens brauche ich die Messwerte in Java, d.h. per Pi4J. Trotz sehr viel Herumsuchens und Herumprobierens gelingt es mir einfach nicht, irgendwelche Daten von dem Chip zu bekommen. Immer nur "0". :(

    Kann mir vielleicht einer von euch auf die Sprünge helfen? Es kann eigentlich nur eine Kleinigkeit sein. Ich nehme an, dass irgendwelche Initialisierungs-Werte fehlen oder ein Modus gesetzt werden muss oder so ähnlich. Mit SPI oder auch mit irgendeiner Art der Hardware-Programmierung hatte ich bislang noch nicht zu tun.

    Meine Quellen:

    • Das Waveshare-Beispiel (s.o.)
    • Eine offenbar angefangene Python-Portierung davon (die aber leider auch nicht funktioniert)
    • Ein Java-Beispiel, dass sich aber auf den MCP3008 bezieht und den SPI manuell einstellt, gehört zu diesem Tutorial
    • Das Pi4J-SPI-Beispiel, dass sich ebenfalls auf den MCP3008 bezieht
    • Ein Kommandozeilen-Tool mit dem ich versucht habe, das SPI ganz low level zu nutzen (sudo ./spincl -ib -m1 -c10s1 -p0 -ie 2 0x10 0x00), das aber überhaupt keine Ausgabe macht


    Das Minimum, das ich zum Loslegen als funktionierendes Beispiel suche, um zu sehen, dass der Zugriff in Java funktioniert, ist das Auslesen der Chip-ID aus dem STATUS-Register per RREG-Kommando. Es muss "3" rauskommen, das geht in C, aber nicht einmal in der Python-Portierung, dort wird immer nur "0" ausgegeben.

    Hier mal der Code:

    Mich überrascht sehr, dass ich zu dem Chip und dem Board kaum Threads oder Code im Netz finden konnte, obwohl das eigentlich so praktische Hardware zu sein scheint.

    Für jeden Tipp oder Hinweis bin ich sehr dankbar!

    Cheers,
    Hanno

    Noch eine kleine Anmerkung: Die älteren Beispiele scheinen die SPI-Kommunikation manuell aufzubauen (Pins einzeln setzen etc.), ich würde aber gerne die etwas schönere Pi4J SPI-API nutzen.

    PS:
    Hier mal eine Beispielausgabe von dem C-Programm (auch um zu zeigen, dass SPI an sich geht):

    Code
    ID=
    Ok, ASD1256 Chip ID = 0x3
    0=091395,   594837 ( 0.356 189 V) 
    1=0078EA,    30954 ( 0.018 535 V) 
    2=0001C4,      452 ( 0.000 270 V) 
    3=000135,      309 ( 0.000 185 V) 
    4=000105,      261 ( 0.000 156 V) 
    5=000153,      339 ( 0.000 202 V) 
    6=0000E8,      232 ( 0.000 138 V) 
    7=000132,      306 ( 0.000 183 V)
  • Analogsignal per SPI auslesen: ASD1256 auf Waveshare High-Precision AD/DA Board? Schau mal ob du hier fündig wirst!

    • Offizieller Beitrag
    Zitat

    Mich überrascht sehr, dass ich zu dem Chip und dem Board kaum Threads oder Code im Netz finden konnte, obwohl das eigentlich so praktische Hardware zu sein scheint.

    Für das Geld? Da kommt der Chinamann und kippt mir "Eimerweise" AD/DA Wandler vor die Haustür ;).

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

  • Ich seh da jetzt nix auffälliges. Die Klassiker wären der Mode, und das Chipselect. Stimmen die?

  • Vielen Dank schon mal für die Antworten!

    Zwischenzeitlich habe ich auch eine Antwort vom Waveshare-Support bekommen: Die können (bzw. wollen?) leider kein Java-Beispiel liefern.

    Außerdem habe ich noch diesen recht aktuellen Thread aus dem englischen Forum gefunden, der sich mit dem Board beschäftigt und ein funktionierendes Python-Skript enthält. Leider ist das pigpio und nicht wiringPi, was das Portieren auf Java etwas erschweren könnte, aber ich versuche mal mein Glück mit jpigpio.

    Wenn ich den Code so sehe, scheint man außer den "normalen" SPI-Pins (MISO/MOSI) zusätzlich noch CE0 und CE1 als DRDY und RESET nutzen und Timing berücksichtigen zu müssen, was ich in dem "naiven Versuch" nicht tat...

    Chip Select sollte 0 sein und Mode 1, so hab ich es jedenfalls aus dem C-Code abgeguckt.

    dbv: Welchen AD-Wandler (mit Infrastruktur, also entweder HAT/Board oder USB) empfiehlst Du denn? Ich hatte im Vorfeld ziemlich ausgiebig rumgesucht, aber immer nur einzelne Chips o.ä. gefunden, keine integrierte Lösung, an die man einfach zwei Drähte anschließt und läuft.

    Einmal editiert, zuletzt von pokerazor (30. November 2016 um 15:26)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!