Kapazitiver Sensor Offset Problem

OP #5431587
Lesenswert?

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?
OP #5431603
Lesenswert?

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?
OP #5431647
Lesenswert?

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.
OP #5431663
Lesenswert?

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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren