一、原理
其实电池内部有个热敏电阻, 与外部分压电阻构成一个简单的分压电路, 根据ADC采样得到的电压j计算热敏阻值再反推此时的温度, 首先我们要先了解热敏电阻阻值和温度一个公式:
/* NTC热敏电阻公式 Rt = R * exp(B*(1/T1-1/T2)) Rt:在T1下的电阻值 T1/T2: 指的是K度,即开尔文温度, T=273.15 + 摄氏度 R: 在T2下的标称阻值,比如在25摄氏度10000欧, T2=273.15 + 25 B:热敏电阻一个参数, 比如3950 exp:e的n次方 我们可以通过温度得到阻值, 也可以通过阻值得到温度 Rt = 10000 * exp(3950*(1/(273.15+t1) - 1/298.15)) t1=1/(ln(Rt/10000)/3950+1/298.15)-273.15 */
我的外部电路如下:
J2是电池插座, 三根线, 中间的就是NTC, BAT_DET连接处理器的ADC采样引脚, 分压电阻阻值47k, 参考电压1.8v, 所以:
Rt = Vadc * Rf / (Vin-Vadc) Vadc: 热敏电阻对应的电压值 Rf: 分压电阻 对应电路47k Vin: 参考电压 1.8v
至于Vadc采样电压就是各个处理器自己的事了, 只要确保采集的电压是准确的, 可以和万用表对比
二、示例代码
下面就演示温度从零下-10度到60度 热敏电阻阻值以及根据采样电压反推热敏电阻的温度, 需要注意的是,代码需要包含math.h函数库的支持, 同时, 数学ln()的叫法在C库是log()
/* gcc test.c -lm */
#include<stdio.h> #include <math.h> int main() {
int t1; double Rt, Vadc; /* 温度从零下-10度到60度 热敏电阻阻值 */ for(t1=-10; t1<60; t1++) { Rt = 10000 * exp(3950*(1/(273.15+t1) - 1/298.15)); Vadc = 1800*Rt/(Rt + 47000); printf("%d = %.10fmv\n", t1, Vadc); } /* 根据采样电压反推热敏电阻的温度 */ for(Vadc=100; Vadc<1000; Vadc+=100) { Rt = Vadc * 47000 / (1800-Vadc); t1=1/(ln(Rt/10000)/3950+1/298.15)-273.15; printf("