Forum: Mikrocontroller und Digitale Elektronik Kapazitiver Sensor Offset Problem


von Bert S. (kautschuck)


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?

von Wolfgang (Gast)


Lesenswert?

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?

von Bert S. (kautschuck)


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?

von Bert S. (kautschuck)


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.

von Bert S. (kautschuck)


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
}

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.