38浏览
查看: 38|回复: 0

[ESP8266/ESP32] FireBeetle 2 ESP32-C5 ADC + NTC实现测温功能

[复制链接]
简介

在本文中,我们主要利用 ESP32-C5ADC 模块NTC 热敏电阻 输出的模拟信号进行采集,并结合热敏电阻的 B 值K 值,计算出当前的环境温度。


FireBeetle 2 ESP32-C5 ADC + NTC实现测温功能图3


根据乐鑫的文档得知ESP32-C5 具备一个12位的ADC,其分辨率为4096 (Power(2,12) 0-4095);


FireBeetle 2 ESP32-C5 ADC + NTC实现测温功能图1


根据ESP-IDF指南得知,如果需要测量不同电压范围的模拟量则需要配置ADC的衰减,默认的测量0 - 1000MV (不知道为什么我在其他地方还见到过1.1V的)根据不同的衰减配置可以将其配置到3.3v的测量范围。(不确定,在其他的地方看到过是3.1V的)


FireBeetle 2 ESP32-C5 ADC + NTC实现测温功能图2

可以看到上述的测量条件还是比较苛刻的。  



NTC测温


我手头的这个NTC传感器是之前某宝买的。B值是3450, 10K。 根据串联的分压原理,我们只需要将电源接线 VCC -> NTC -ADC - 10K电阻 - GND . 我们就可以从ADC处读取到我们期望的电压(因为NTC会根据温度的不同电阻发生变化,从而电压发生变化)因此我手焊了一个板子。


正面

FireBeetle 2 ESP32-C5 ADC + NTC实现测温功能图4

背面

FireBeetle 2 ESP32-C5 ADC + NTC实现测温功能图5




代码如下
  1. #include <Arduino.h>
  2. #define ADC_PIN 6
  3. #define ADC_RESOLUTION 4095.0f
  4. const float ADC_SCALE  = 1.0f;
  5. //
  6. const float ADC_OFFSET = 0.43f;
  7. float readTemperature()
  8. {
  9.     const float Vref    = 3.1f;       // 实际参考电压(可测量确认)
  10.     const float R_fixed = 9940.0f;    // 实测上拉电阻
  11.     const float T0      = 298.15f;    // 25°C in Kelvin
  12.     const float B       = 3450.0f;    // B值
  13.     const float R0      = 10000.0f;   // 25°C 时的阻值
  14.     const float Ka      = 273.15f;
  15.     analogRead(ADC_PIN);  // 虚读一次给采样电容充电
  16.     delay(2);
  17.     const int samples = 20;
  18.     uint32_t sum = 0;
  19.     for (int i = 0; i < samples; ++i) {
  20.         sum += analogRead(ADC_PIN);
  21.         delay(3);
  22.     }
  23.     float adc_avg = (float)sum / (float)samples;
  24.     // ---- 原始电压 ----
  25.     float V_raw = (adc_avg / ADC_RESOLUTION) * Vref;
  26.     // ---- 应用校准(先比例后偏移) ----
  27.     float V_corr = V_raw * ADC_SCALE + ADC_OFFSET;
  28.     // ---- 限幅,避免除以0或负值 ----
  29.     if (V_corr <= 0.001f) V_corr = 0.001f;
  30.     if (V_corr >= (Vref - 0.001f)) V_corr = Vref - 0.001f;
  31.     // ---- 计算 R_ntc(NTC 在下方)----
  32.     // 电路:Vref → R_fixed → ADC_PIN → NTC → GND
  33.     float R_ntc = R_fixed * (Vref - V_corr) / V_corr;
  34.     // ---- 温度换算 ----
  35.     float tempK = 1.0f / (1.0f / T0 + log(R_ntc / R0) / B);
  36.     float tempC = tempK - Ka;
  37.     // ---- 串口输出 ----
  38.     Serial.print("adc_avg=");
  39.     Serial.print(adc_avg, 1);
  40.     Serial.print("  V_raw=");
  41.     Serial.print(V_raw, 4);
  42.     Serial.print(" V  V_corr=");
  43.     Serial.print(V_corr, 4);
  44.     Serial.print(" V  Rntc=");
  45.     Serial.print(R_ntc, 1);
  46.     Serial.print(" Ω  T=");
  47.     Serial.print(tempC, 2);
  48.     Serial.println(" °C");
  49.     return tempC;
  50. }
  51. void setup()
  52. {
  53.     Serial.begin(115200);
  54.     analogSetAttenuation(ADC_11db);  // 允许测量 0~3.3V
  55.     analogReadResolution(12);        // 12 位分辨率(0~4095)
  56.     delay(1000);
  57.     Serial.println("ESP32-S2 NTC Temperature Test (NTC at bottom, corrected)");
  58. }
  59. void loop()
  60. {
  61.     readTemperature();
  62.     delay(1000);
  63. }
复制代码



这边实际测量出来的电压和ADC的读数完全对不上, 万用表测量大概在1.8V左右,但是ESP-32C5读取出来的仅仅只有1.4左右。误差非常大,这边尝试了ESP32-S2, ESP32-S3 和 C5. 都是一样的问题。 无奈只能手动减去一个误差值然后获得一个近似的电压进行计算。

FireBeetle 2 ESP32-C5 ADC + NTC实现测温功能图6


实际的读数如下所示

FireBeetle 2 ESP32-C5 ADC + NTC实现测温功能图7
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail