我得到了错误的温度值。没有达到标准。 就像如果我将加热器的温度值从 40 摄氏度更改为 60 摄氏度,那么输出就会有 55 或更多的差异。
#define ANF6 46
#define ADC_VREF 3.3
#define ADC_FACTOR (ADC_VREF/1023.0)
#define RESISTANCE_REF 4700
#define RESISTANCE_FROM_VOLTAGE(v) (((ADC_VREF/v)-1) * RESISTANCE_REF)
float temperature_from_resistance(float resistance) {
const float A = 0.001112048;
const float B = 0.000224458;
const float C = 1.1114E-06;
const float D = 5.09066E-08;
return 1/(A + B*log(resistance) + C*pow(log(resistance), 2) + D*pow(log(resistance), 3)) - 273.00;
}
float get_temperature_from_sensor_1() {
return temperature_from_resistance(RESISTANCE_FROM_VOLTAGE((float)(ADC_FACTOR * ADC_Read(ANF6))));
}
int main(){
float temperature = get_temperature_from_sensor_1();
printf("%.2f\n", temperature);
}
我在这段代码中做错了什么吗? 我正在 mikroC pro for pic 编译器中运行此代码。 这是传感器代码:NTC 热敏电阻(ntcascwe3103f)
我已经尝试过给定的代码,但它给了我错误的结果。 有人正在使用这个传感器或者有人曾经研究过这个传感器吗?
我建议您首先使用经过校准的合适万用表在室温下测量传感器上的电压,然后再寻找软件故障。最可能的故障原因是参考电阻和传感器的值相差很大。
否则,除了计算 log(r) 中的多项式的可怕方式之外,该软件看起来并没有太大错误,这种方式不仅非常慢而且有些不准确。优化器可能会拯救你,但我对此表示怀疑。
还要注意,如果没有尾随 f 浮点常量,则在标准 C 中默认为双精度,尽管在某些嵌入式编译器上不一定如此。
#define ANF6 46
#define ADC_VREF 3.3f
#define ADC_FACTOR (ADC_VREF/1023.0f)
#define RESISTANCE_REF 4700.0f
#define RESISTANCE_FROM_VOLTAGE(v) (((ADC_VREF/v)-1.0f) * RESISTANCE_REF)
float temperature_from_resistance(float resistance) {
const float A = 0.001112048f;
const float B = 0.000224458f;
const float C = 1.1114E-06f;
const float D = 5.09066E-08f;
float lnr = log(resistance);
// evaluated using Horner's method with minimum multiplies
return 1.0f/(A + (B + (C + D*lnr)*lnr)*lnr) - 273.00f;
}
float get_temperature_from_sensor_1() {
return temperature_from_resistance(RESISTANCE_FROM_VOLTAGE((float)
(ADC_FACTOR * ADC_Read(ANF6))));
}
Vishay 不在其数据表上提供校准系数,并坚持要求您将其臃肿的计算工具下载为支持宏的 Excel 电子表格。检查你的计算结果...
在电子表格中模拟它以检查其校准图可能会帮助您检查公式是否正常工作。