主题中讨论的其他部件: Tida-0.0317万
您好,我正在使用FDC1004开发远程液位传感器。 我严格遵循参考设计,使用CIN1测量电平电极,CIN2液体电极和CIN3环境电极。
所有测量值都与水的高度呈相当线性,但由于某种原因,环境通道(CIN3)会偏移。 例如,当水箱中没有水时,电容如下所示:
级别:8.75pF
液体:0.88pF
环境:9.43 pF
我希望你们对造成偏差的原因有一些了解,这使得无法补偿温度/湿度。
谢谢!
Aidan
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好,我正在使用FDC1004开发远程液位传感器。 我严格遵循参考设计,使用CIN1测量电平电极,CIN2液体电极和CIN3环境电极。
所有测量值都与水的高度呈相当线性,但由于某种原因,环境通道(CIN3)会偏移。 例如,当水箱中没有水时,电容如下所示:
级别:8.75pF
液体:0.88pF
环境:9.43 pF
我希望你们对造成偏差的原因有一些了解,这使得无法补偿温度/湿度。
谢谢!
Aidan
嗨,John,感谢您回复我。 是的,TIDA-0.0317万是我使用的参考。 我一直在CINx和CIN4之间触发单差分测量(浮动,无电极)。 如果您有任何想法,请告诉我。
我不确定如何在此处上传文件,请参阅下面的imgur链接了解原理图,图层和代码。 或者告诉我是否有其他方式可以向您发送文件,例如通过电子邮件。
谢谢!
Aidan
哎呀,我没有看到灰色 的"上传"按钮。
float CapacitiveSensor::singleMeasurement(int measurementNumber)
{
if (measurementNumber < 1 || measurementNumber > 4)
return -1000.0;
// Trigger Measurement
uint16_t sensorConfig = read16(FDC_CONF);
sensorConfig |= 1 << (8 - measurementNumber);
write16(FDC_CONF, sensorConfig);
long start_time = millis();
while (millis() - start_time < TIMEOUT_MS)
{
sensorConfig = read16(FDC_CONF);
if (sensorConfig & (1 << (4 - measurementNumber))) // Check if measurement is completed
return readMeasurement(measurementNumber);
}
return -3000.0;
}
float CapacitiveSensor::readMeasurement(int measurementNumber)
{
// Returns the capacitance of the measurmenet in pF
if (measurementNumber < 1 || measurementNumber > 4)
return -2000.0;
uint16_t sensorConfig = read16(FDC_CONF);
if (!(sensorConfig & (1 << (4 - measurementNumber)))) // Check if measurement is completed
return -3000.0;
uint8_t registerMSB = (measurementNumber-1) * 2;
uint8_t registerLSB = registerMSB + 1;
// Read 24-bit measurement. Capacitance has a fixed decimal point with 5 bits before and 19 bits after
uint16_t msb = read16(registerMSB); // D[15:0] contains the most significant 16 bits of the measurement
uint16_t lsb = read16(registerLSB) >> 8; // D[15:8] contains the least significant 8 bits of the measurement
// Serial.println(msb, BIN);
// Serial.println(lsb, BIN);
int32_t rawValue = (((uint32_t)(msb)) << 8) | lsb;
int sign = 1;
if (rawValue & 0x800000) { // Negative number
sign = -1;
rawValue |= 0xFF000000;
rawValue = ~rawValue + 1;
}
uint16_t left_bits = rawValue >> 19;
uint32_t right_bits = rawValue & 0x7FFFF;
float capacitance = sign * (left_bits + (float)right_bits/524288.0);
return capacitance;
}