Hi, Ich habe folgenden Sensor: http://www.ti.com/lit/ds/symlink/fdc1004.pdf Das auslesen über I2C funktioniert soweit, jedoch kann ich den Offset irgendwie nicht richtig setzen und komme bei angehängten Kabeln sehr schnell in die Sättigung. Im Measurement Configuration Register habe ich bereits CAPDAC auf 0b11111 gesetzt, jedoch ändert sich das auslesen nur minim. Jemand eine Idee, was man da sonst noch ändern muss um den Offset herunterzusetzen?
Bert S. schrieb: > ... und komme bei angehängten Kabeln sehr schnell in die Sättigung. Vielleicht überschreitet deine Kabelkapazität den lt. Datenblatt möglichen Offset-Bereich von 100pF?
Wolfgang schrieb: > Vielleicht überschreitet deine Kabelkapazität den lt. Datenblatt > möglichen Offset-Bereich von 100pF? Wenn ich den Offset auf 0b11111 setzte ohne irgend ein Sensor angehängt, dann lese ich folgendes aus (MSBH, MSBL,LSBH,LSBL): (4,180,120,0) Wenn der Offset auf 0b00000 ist ohne angehängten Sensor, dann lese ich folgendes aus: (2,49,120,0) Wobei die LSB Werte natürlich stärker schwanken. Der maximale ausschlag für diese Werte ist: (127,255,255,0) und sollte eigentlich +15pF entsprechen, oder? Daher müssten ja bei einer Offset Änderung sofort die Werte (0,0,0,0) erscheinen?
Ich habe mal Tests mit Kapazitäten im pF Bereich gemacht: 2.2pF führt zu (26,123,166,0) 15pF führt zu (127,255,255,0) wie erwartet. Daher scheint einfach der Offset nicht zu greifen. Das Measurement Register 0x08 beschreibe ich mit dem Wert (0x1FE0), was den Offset eigentlich auf 100pF setzen sollte.
Ich habe hier mal noch den Code:
1 | #include "Wire.h" |
2 | |
3 | #define ADDR 0x50
|
4 | #define FDC 0x0C
|
5 | |
6 | #define SIZE 2
|
7 | |
8 | uint8_t lower[SIZE]; |
9 | uint8_t higher[SIZE]; |
10 | |
11 | uint32_t corr_factor=524288; //2^19 |
12 | |
13 | void setup() { |
14 | // put your setup code here, to run once:
|
15 | Wire.begin(); |
16 | Serial.begin(9600); |
17 | |
18 | Wire.beginTransmission(ADDR); //Repeated reading channel 1 |
19 | Wire.write(0x0C); |
20 | Wire.write(0x05); |
21 | Wire.write(0x80); |
22 | Wire.endTransmission(); |
23 | delay(5); |
24 | |
25 | Wire.beginTransmission(ADDR); //Set offset to 100pF |
26 | Wire.write(0x08); //ConfigMes1 |
27 | Wire.write(0x1C); //High bytes |
28 | Wire.write(0x00); //Low bytes |
29 | Wire.endTransmission(); |
30 | delay(5); |
31 | }
|
32 | |
33 | void loop() { |
34 | Wire.beginTransmission(ADDR); //MSB Channel 1 |
35 | Wire.write(0x00); |
36 | Wire.endTransmission(); |
37 | delay(5); |
38 | |
39 | Wire.requestFrom(ADDR , SIZE); // request 2 bytes from slave device 0x30 |
40 | |
41 | for(uint8_t i=0;i<SIZE;i++) { |
42 | higher[i]=Wire.read(); |
43 | }
|
44 | |
45 | Wire.beginTransmission(ADDR); //LSB Channel 1 |
46 | Wire.write(0x01); |
47 | Wire.endTransmission(); |
48 | delay(5); |
49 | |
50 | Wire.requestFrom(ADDR , SIZE); // request 2 bytes from slave device 0x30 |
51 | |
52 | for(uint8_t i=0;i<SIZE;i++) { |
53 | lower[i]=Wire.read(); |
54 | }
|
55 | |
56 | Serial.print(higher[0]); |
57 | Serial.print(","); |
58 | Serial.print(higher[1]); |
59 | Serial.print(","); |
60 | Serial.print(lower[0]); |
61 | Serial.print(","); |
62 | Serial.print(lower[1]); |
63 | Serial.println(""); |
64 | |
65 | uint32_t cap = (((uint32_t)higher[0])<<24) | (((uint32_t)higher[1])<<16) | (((uint32_t)lower[0])<<8) | ((uint32_t)0x00); |
66 | cap = cap/corr_factor; |
67 | Serial.println(cap); |
68 | |
69 | delay(500); |
70 | |
71 | }
|
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.