ESP32 NTC热敏电阻测温全攻略:从ADC采样到线性插值算法详解
一、NTC介绍
NTC 是Negative Temperature Coefficient 的缩写,一般指负温度系数半导体器件,而在我们物联网实验中,称为NTC热敏电阻。NTC热敏电阻阻值计算公式如下:
式中RT、RT0分别为温度T、T0时的电阻值,Bn为材料常数。
对于T0=25℃,R0=10KΩ,Bn=3950的电阻-温度曲线如下所示
由此可见,温度越高,阻值越小。对于NTC的电路相对简单,如下图
当NTC阻值发生变化时,Vout也随之发生变化,通过采样Vout电压,然后根据欧姆定律计算出电阻值,再由电阻值可算出对应的温度值。
二、NTC例程
由上节可知,我们需要采样Vout的值,需要用到ESP32的ADC功能,esp-idf库对ADC的操作已经封装的相当好,直接引出API给我们使用,虽然如此,但依然有一些东西我们要注意,开发板中的Vout接到了GPIO36上,关于ESP32的ADC,ESP32上具有两个ADC转化模块,分别是ADC1和ADC2,每个ADC模块均具有8路,由于在启用ADC2时,无法使用WIFI功能,因此本例程不介绍ADC2,也不推荐大家使用ADC2。然后并不是所有的GPIO口都具有ADC功能,只有如下GPIO口具有ADC功能
- GPIO32 ADC1_CH4
- GPIO33 ADC1_CH5
- GPIO34 ADC1_CH6
- GPIO35 ADC1_CH7
- GPIO36 ADC1_CH0
- GPIO37 ADC1_CH1
- GPIO38 ADC1_CH2
- GPIO39 ADC1_CH3
以下是部分初始化代码
这里先说下adc_oneshot_new_unit 这个函数,这个函数是启用单次转换,ESP32中有两种转化模式,分别是单次转换和连续转换,单次转换的意思是,我启动ADC转换,ADC模块就只转换一次值然后停止,连续转换是启动ADC转换后,ADC模块会不断地执行ADC转换,除非我们手动调用停止。经过我本人亲自的试验,连续转换的精度非常差,而且还受其他通道影响,可能之后乐鑫官方后续推出的系列芯片会修复这些问题,因此本教程只用单次转换。然后需要填充adc_oneshot_chan_cfg_t 结构体,这个结构体只有两项,分辨率和衰减系数,分辨率的意思是,采样回来的最大值,比如说我们满量程是2450mV,分辨率设置成12位,如果外部输入的电压是2450mV则,我们通过adc_oneshot_read读取到的值是2^12-1=4095。本例程中ADC_BITWIDTH_12 配置成12位分辨率。.atten=ADC_ATTEN_DB_12 这个特性可以说是ESP32较特殊的特性,ESP32内部的ADC参考电压只有1100mV,理论上最大只能采样1100mV,如果我们要采样大于这个值,我们就必须设置衰减,让外部电压到了ESP32内部后进行衰减,然后整体来看,我们就可以采用大于1100mV电压。以下是衰减对应的测量范围
- ADC_ATTEN_DB_0100 mV~950mV
- ADC_ATTEN_DB_2_5 100mV~1250mV
- ADC_ATTEN_DB_6150 mV~1750mV
- ADC_ATTEN_DB_12150 mV~2450mV
由此可见,最大的衰减倍数,最高能测量的电压是2450mV,当输入大于这个值(注意,不能超过3300mV,否则会损坏芯片),程序中读取到的值都是4095。example_adc_calibration_init 函数里面用 ESP32 芯片内部预烧录的参数值对电压采样结果进行校准。
最后新建一个temp_adc_task函数不断读取ADC值
我们接下来看一下temp_adc_task这个函数
点击链接ESP32 NTC热敏电阻测温全攻略:从ADC采样到线性插值算法详解阅读原文