Forum: Mikrocontroller und Digitale Elektronik ads122C04 ADC 24Bit


von Leo M. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen

Ich nehme gerade meinen A/D Wandler in betrieb ADS122C04 über I2C. Der 
Bus funktioniert einwandfrei und ich kann den chip auch ansprechen und 
dieser reagiert auch. Mein Problem ist eher das ich ein Fehler bei der 
konfiguration mache den wen ich die AD-Werte herauslesen möchte bekomme 
ich kein ACK. Somit ist ein Fehler bei der Konfiguration denke ich mal. 
Nach dem icn das Datenbaltt gefühlt auswendig kann komme ich leider 
immer noch nicht drauf was ich falsch mache.


Konfiguration Register 0 bei mir  0x80 für Kanal 0 und 0x90 für Kanal 1
Bei deisem Register wähle ich den Kanal aus in meinen Fall ist das 
einmal den
1000 : AINP = AIN0, AINN = AVSS
1001 : AINP = AIN1, AINN = AVSS
Das Gain bleibt 1 somit 000
und PGA_BYPASS ist auch auf default also 0

Konfiguration Register 1
Hier soll alles auf standard sein und die Datenrate reicht die 
langsamste. Ebenfalls wird die Externe Referenz also bei mir 5,0V 
ausgewählt.
Somit steht in diesem Register 0x02

Konfiguration Register 2
Ganzese Register  0x00

Konfiguration Register 3
Ganzes Regiser 0x00

Die Adresse des Bausteins ist 0x80 und für das Herauslesen wird das 
Rister (RDATA 0x10) benutzt.

Hier mein anschliessender Code die Init Funktion wird einmal bei beginn 
aufgerufen danach immer die anderen beiden hintereinander.
Sieht jemand mein Problem das ich bei der Konfiguration oder dem 
auslesen mache?
1
func init_ADC()
2
    I2C1_Start();
3
    I2C1_Write(0x80); //device adress
4
    I2C1_Write(0x40); //registdr 0
5
    I2C1_Write(0x80); //config 0x80 = Kanal 0  0x90 = Kanal 1 
6
    I2C1_Stop();
7
8
    I2C1_Start();
9
    I2C1_Write(0x80); //device adress
10
    I2C1_Write(0x44); //registdr 1
11
    I2C1_Write(0x02); //config temp of and Ref extern
12
    I2C1_Stop();
13
14
    I2C1_Start();
15
    I2C1_Write(0x80); //device adress
16
    I2C1_Write(0x48); //registdr 2
17
    I2C1_Write(0x00); //config no changes ->default
18
    I2C1_Stop();
19
20
    I2C1_Start();
21
    I2C1_Write(0x80); //device adress
22
    I2C1_Write(0x4C); //registdr 3
23
    I2C1_Write(0x00); //config no changes ->default
24
    I2C1_Stop();
25
endfunc
26
27
func read_Kanal0()
28
    I2C1_Start();
29
    I2C1_Write(0x80); //device adress
30
    I2C1_Write(0x40); //registdr 0
31
    I2C1_Write(0x80); //config Kanal 0
32
    I2C1_Stop();
33
34
    I2C1_Start();
35
    I2C1_Write(0x80); //device adress
36
    I2C1_Write(0x10); //read out Register
37
    I2C1_Start();
38
    I2C1_Write(0x81); //device adress  + read bit
39
    dataPMSB := I2C1_Read();
40
    dataPMB := I2C1_Read();
41
    dataPLSB := I2C1_Read();
42
    I2C1_Stop();
43
endfunc
44
45
func read_Kanal1()
46
    I2C1_Start();
47
    I2C1_Write(0x80); //device adress
48
    I2C1_Write(0x40); //registdr 0
49
    I2C1_Write(0x90); //config Kanal 1
50
    I2C1_Stop();
51
52
    I2C1_Start();
53
    I2C1_Write(0x80); //device adress
54
    I2C1_Write(0x10); //read out Register
55
    I2C1_Start();
56
    I2C1_Write(0x81); //device adress  + read bit
57
    dataNMSB = I2C1_Read();
58
    dataNMB = I2C1_Read();
59
    dataNLSB = I2C1_Read();
60
    I2C1_Stop();
61
endfunc

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Leo M. schrieb:
> danach immer die anderen beiden hintereinander.
Solltest du nicht vor dem Auslesen mit /DRDY nachschauen, ob du 
überhaupt ein neues Ergebnis hast?

> den wen ich die AD-Werte herauslesen möchte bekomme ich kein ACK.
Wo bekommst du kein ACK? Beim Auslesen der AD-Werte muss laut 
Datenblatt der Master die ACK-Signale erzeugen.
Siehe die Bedeutung der grauen und weißen Kästchen im 8.5.3.1 und deren 
Anwendung z.B. in 8.5.3.5

: Bearbeitet durch Moderator
von Leo M. (Gast)


Lesenswert?

Lothar M. schrieb:

>> danach immer die anderen beiden hintereinander.
> Solltest du nicht vor dem Auslesen mit /DRDY nachschauen, ob du
> überhaupt ein neues Ergebnis hast?
Es wird geschrieben wen DRDY nicht benötigt wird offen lassen und wenn 
das Register nochmals ausgelesenwerden sollte so steht immer halt noch 
der alte wert drin.
>
>> den wen ich die AD-Werte herauslesen möchte bekomme ich kein ACK.
> Wo bekommst du kein ACK? Beim Auslesen der AD-Werte muss laut
> Datenblatt der Master die ACK-Signale erzeugen.
> Siehe die Bedeutung der grauen und weißen Kästchen im 8.5.3.1 und deren
> Anwendung z.B. in 8.5.3.5

Danke, das hab ich auch noch gesehen jedoch trotz das ich ACK dem Chip 
sende bekomme ich keinen plausiblen wert für die Analog Spannung.
Was ich auch noch gesehen habe im Register 1 muss PGA deaktiviert sein 
wenn +Vcc zu GND gemessen wir so muss neu im Register 0x81 oder 0x91

von Leo M. (Gast)


Lesenswert?

Was ich noch iritierend finde ist dass wen ich nur einen Kanal messe 
trotzdem ein anderer Kanal einfaluss hat und sich mitverändert, aber was 
sich verändert macht keinen sin es ist einfach eine Art randum.

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
Noch kein Account? Hier anmelden.