A/D Wandler über SPI ansteuern

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo liebe Raspberry Freunde, :helpnew:
    ich habe ein riesen großes Problem.
    Ich möchte meinen Raspberry als Datenlogger benutzen. Hierfür habe ich einen AD Wandler verbaut.
    Mein erstes Programm diesbezüglich sah folgendermaßen aus.

    Wie ihr sehen könnte setzte ich von Hand die steigende und fallende Flanke. Meine Aufgabe besteht darin nun dies nicht mehr von Hand sondern durch Funktionen aus einer Bibliothek ablaufen zu lassen.
    Die ganze Kommunikation soll über SPI laufen. Ich bin derzeit total überfragt. =( :s

    Zur Verfügung stehen mir die Bibliotheken pigpio.h und wiringPi.h
    Verbaut ist ein MPC3204.
    Als Anhang gebe ich euch den Verdrahtungsplan so wie das DATASHEET des A/D Wandlers


  • Ich verstehe ihr Programm.
    Bezüglich der Ausgabe des anderen Programms. Ich programmiere in NetBeans compiliere dann auf den PI und über Putty führe ich die gesamten Datein aus. Meine Verbindung wird durch LAN hergestellt. Und über Putty greife ich auf den Pi zu.
    Wo gebe ich das aus dann ? In NetBeans oder auf dem Putty?

    Das Programm laeuft ja nun auf dem PI, also wird auch die Ausgabe dort stattfinden - und wenn Putty der Weg ist mit ihm zu reden, dann erfolgt die Ausgabe auch genau da. Netbeans hat damit nichts zu tun.


    In dem Program meiner Vorgängerin hat sie die Flanken per Hand gesetzt. Meine Aufgabe ist es dies durch Funktionen aus einer Librarie zu tun. So dass ich keine Probleme mit der Delay Time habe und keine Einbrüche in der Messung von Spannungen.

    Tell hat ein anderes Programm angegeben, das solltest du also nehmen, und erstmal zum laufen bringen. Danach sehen wir weiter.

  • Ich habe jetzt eine neue Vorgabe bekommen es soll diese Library (bcm2835.h) benutzt werden und dieser Code soll als Grundlage dienen.



    Hier geht es um einen A/D Wandler und einem Temperatursensor. Das müsste in dem Fall geändert werden.
    Meine Frage wäre bei diesen Channel 0,1 auf die er zugreift sind das die Channel vom AD Wandler?
    Müsste ich dann nach meinem Verdrahtungsplan um zum Beispiel die Spannungen über die zwei Dioden abzulesen CH 4 und 5 angeben? Siehe Verdrahtungsplan..

    Einmal editiert, zuletzt von CaptainsTea (22. Juli 2016 um 11:22)

  • Ja, das sind die Kanaele am A/D-Wandler. Und ja, das muss passend gemacht werden zu dem - schon erwaehnten - Teil 6.1 des Datenblatts.

  • Danke Deets für die schnelle Antwort,
    jetzt wenn ich die Messung über meine Grüne und Rote LED machen möchte, sprich CH 4 und 5, muss ich vorher die Dioden auf 1 setzten bevor die "Messroutine" startet?

  • Habe jetzt das Programm ein wenig umgeändert..

    Bewege ich mich in die richtige Richtung oder was mache ich falsch bzw was muss geändert werden ?

    Die Ausgabe sieht folgendermaßen aus, jedoch ist diese in Netbeans unten im RUN Fenster: :s
    Gelesene Daten an CH0: 00 00 09
    Gelesene Daten an CH1: 00 00 0A

    Analoger Messwert an CH0: 16777216
    Berechnete Spannung: 16384 mV

    Analoger Messwert an CH1: 0
    Berechnete Spannung: 32768 mV


    RUN SUCCESSFUL (total time: 202ms)

    Weiß auch nicht warum das immer so "Diagonal" ausgegeben wird?!

    Vielen Dank schon mal für eure hilfen..

  • Noe, nicht so richtig die Richtung. Die Werte sind offensichtlich ein einziges gesetztes Bit - das waere schon ein ziemlicher Zufall, wenn deine Spannung genau diese Ausgabe produziert. Und was du gemachst hast ist einfach Variablennamen zu aendern - aber nicht die dazu gehoerigen Daten.

    Bitte lies dir - wie jetzt schon zum 3ten mal erwaehnt - die Sektion im Datenblatt zur Kommunikation durch, und was dieser in deinem Programm entspricht. Dann kannst du mal dir selbst, und ggf. uns hier erklaeren, was du daraus machst.


  • Noe, nicht so richtig die Richtung. Die Werte sind offensichtlich ein einziges gesetztes Bit - das waere schon ein ziemlicher Zufall, wenn deine Spannung genau diese Ausgabe produziert. Und was du gemachst hast ist einfach Variablennamen zu aendern - aber nicht die dazu gehoerigen Daten.

    Bitte lies dir - wie jetzt schon zum 3ten mal erwaehnt - die Sektion im Datenblatt zur Kommunikation durch, und was dieser in deinem Programm entspricht. Dann kannst du mal dir selbst, und ggf. uns hier erklaeren, was du daraus machst.

    Bezüglich der Kommunikation meinst du den Part 6.1 ? Using the MCP3204/3208 with Microcontroller (MCU) SPI Ports ?

  • Ja. (dumdidumm, ich muss mehr als 5 Zeichen schreiben....). Und ein Fullquote der Nachricht direkt davor ist ungern gesehen hier.

  • Ahso ja ich weiß worum es da geht..


    Um die 3 Bytes die gesendet und empfangen werden welche im Grunde die ganzen Informationen enthalten..

    1 Byte : 00000(5*0), dann eine 1 ( Startbit ) dann der MODE ( 1 BIT) und das letzte Bit ist das D2 Bit womit der Channel bestimmt wird.

    2 Byte : D1 und D0 zu erst rest "don't care" =0

    3 Byte : "Don't care " = 0

    Das ist die gesendete DATA welches bei der fallenden Flanke der Clock gemacht wird.

    Bei dem empfangen der DATA sieht es folgendermaßen aus, bin mir aber nicht sicher ob das dann bei der steigenden Flanke der Clock gemacht wird.

    1 Byte: "don't care"

    2 Byte: 000 (3*0) dann das "NULL BIT" dann B11-B8

    3 Byte: B7-B0

    Ich denke ich weiß was ich vergessen habe zu ändern.. Wie du gesagt hast habe ich nur die deklarationen verändert und nicht deren Inhalt..

    Code
    char out_ch4[] = { 0b00000101, 0b00000000, 0b00000000 };
       char ch4_data[] = { 0x00, 0x00, 0x00 };
    char out_ch5[] = { 0b00000101, 0b01000000, 0b00000000 };
      char ch5_data[] = { 0x00, 0x00, 0x00 };

    Das hier muss doch geändert werden und mein MODE ist ja 0 oder? Ich setze ja mit der FALLENDEN Flanke die Bits?

  • Sollte so stimmen. Versuch macht kluch... :) Wie die Clockpolarity und Phase liegen weiss ich im Moment nicht genau, aber das sollte eigentlich alles stimmen wenn das Programm dafuer gedacht war.

  • Deets kannst du mir nur erklären was dieser Abschnitt macht ?

    Bei dem "if " wird die Bibliothek initialisiert oder ? Wenn ja müsste er das nicht ganz am Anfang machen ?

    Einmal editiert, zuletzt von CaptainsTea (23. Juli 2016 um 11:41)

  • Das ist eine Variablendeklaration um sich das bit-geshifte zu sparen wenn man die Bytes vom SPI-Interface bekommt. Und in C kommen Deklarationen urspruenglich immer am Anfang des Codes. Insofern kann man das durchaus so machen. Was ja auch belegt ist durch die Tatsache, dass es funktioniert ;)

  • Danke Deets für deine Hilfe eine Frage habe ich dennoch

    Ich habe in meinem Code noch das setzen und rücksetzen der zwei LED's eingefügt.. Stimmt dies aber, weil mir kommt es so vor als ob da etwas anderes hin muss..
    Natürlich wäre zu erst die Frage ob man das überhaupt brauch.

  • So ich habe jetzt ein Funktionierendes Programm:

    Mit diesem kann ich die Spannung über den Poti richtig auslesen. Jedoch ist mein Problem mit den LED's noch nicht gelöst.
    Und dann hääte ich noch eine Frage.. Wie kann ich das machen das er mehrere male misst? Vielleicht nach einer gewissen Zeit?!

  • Was macht man denn beim programmieren so im allgemeinen, wenn man etwas mehrere male hintereinander machen will? Und was, wenn man warten will?

  • Habe es hinbekommen das ganze Programm sieht folgendermaßen aus:

    Ich kann in der Main-Funktion einen Channel angeben und er misst mir diesen Channel und alle weiteren Channel bis zum Channel 0 durch.
    So war es gefordert und so macht er das auch. Das Programm wurde etwas größer aber es funktioniert alles.

    :danke_ATDE:

Jetzt mitmachen!

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