主题中讨论的其他部件: 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; }