Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

Wert auslesen über I2C und ADC Microchip MCP3426?

hako
2015-01-05
2015-01-09
  • hako - 2015-01-05

    Hallo Freunde des Codesys,

    ich bin aktuell am experimentieren mit einem RaspberryPi + Codesys + MC3426 Delta/Sigma-A/D Wandler.
    Ich möchte mit dem bereits über I2C angeschlossenen ADC eine Spannung an einem Spannungsteiler (Kanal 1) und eine Spannungsdifferenz über einen Shunt (Kanal 2) messen. Im Oszi sehe ich auch SCL und SDA, Adresse 0x68 passt auch. So weit - so gut - Ich habe auch schon eine größeres Projekt erstellt und möchte nun hier den ADC integrieren. Ich habe bereits eine Gerätebeschreibungsdatei erstellt und im Projekt eingebunden. Eine Bibliothek ist bereits erstellt für den ADC aber noch nicht mit Leben gefüllt. Dies teste ich momentan über einen Stück Code im Hauptprogramm. Hier ist mein Ansatz:

    PROGRAM Stepper
    VAR
    index          : SINT;
    readBytes       : DINT;   
    sendbuffer      : ARRAY[0..1] OF BYTE;
    readbuffer      : ARRAY[0..3] OF BYTE;
    value         : REAL;  //V
    END_VAR
    
    CASE index OF
    0:   sendbuffer[1] := 2#1101_0001; //byte 0 Address-Byte (write)
       sendbuffer[0] := 2#0001_0000; //byte 1 Config-Byte //Default config: 12 bit, continuous mode, CH0, Gain = 1x
       readBytes := MCP3426ADC.write(ADR(sendbuffer),2);
       IF (readBytes <> 2) THEN
          ;
       ELSE
          index := index + 1;
       END_IF
       
    1:   readBytes := MCP3426ADC.read(ADR(readbuffer),4);
       IF (readBytes <> 4) THEN
          ;
       ELSE
          value := (readbuffer[1]*256+readbuffer[0])*(2*2.048/4096); //output code*2*RefVoltage/2E12/Gain
       END_IF
    END_CASE
    

    Habe mir mal eine Mini-Schrittkette gebaut. Das was ich raus bekomme ist besser als nicht aber immer noch falsch :
    readbuffer[0] = 0 = 1. byte??
    readbuffer[1] = 26 = 2. byte??
    readbuffer[2] = 16 = 3. byte??
    readbuffer[3] = 144 = 4. byte??
    value = 6.656 --> Falsch, am Eingang des ADC liegen rund 0,7 V an. Der Wert ändert sich aber, wenn ich die Spannung am Eingang verändere.

    Ich habe noch etwas von einem ACK bzw. NACK bit gelesen und glaube, das muss ich noch berücksichtigen. Hat jemand eine Idee, wo der (Denk)Fehler steckt oder kann jemand eine Beispielcode liefern?

    Habe das Datenblatt und meine Gerätebeschreibung mal angehängt ...

    MCP3426 27 28.pdf [944.92 KiB]

    device.xml [2.34 KiB]

     

    Related

    Talk.ru: 1
    Talk.ru: 2
    Talk.ru: 3

  • Moderator3S

    Moderator3S - 2015-01-09

    Topic moved to here!

     

Log in to post a comment.