ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

ESP-IoT-Solution NTC 热敏电阻驱动:原理、电路设计与温度采集实战

ESP-IoT-Solution NTC 热敏电阻驱动:原理、电路设计与温度采集实战 物联网嵌入式驱动开发硬件开发【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址https://gitcode.com/GitHub_Trending/es/esp-iot-solution点击查看免费下载导读NTCNegative Temperature Coefficient负温度系数热敏电阻是家用电器与工业设备中应用最广泛的低成本温度传感器之一。本文以 ESP-IoT-Solution 仓库中的 NTC Driver 组件为核心系统讲解 NTC 的工作原理、关键选型参数、两种典型分压电路及其circuit_mode配置、基于 β 公式的数字化温度换算并结合组件源码与官方示例给出可复制的完整代码。读完本文你将能在 ESP32 系列芯片上独立完成 NTC 测温电路的设计、驱动初始化和高精度温度采集。NTC 热敏电阻基础什么是负温度系数NTC 是Negative Temperature Coefficient的缩写。NTC 热敏电阻是一种具有负温度系数的热敏电阻其主要特点是在工作温度范围内电阻随温度升高而降低。利用其基本的电阻温度特性、电压电流特性NTC 系列热敏电阻已广泛应用于家用电器产品中以达到自动增益调整、过负荷保护、温度控制、温度补偿、稳压稳幅等作用。NTC 常见的封装/形态如下探针式 NTC 热敏电阻适合多种应用场景尤其适合极高温或极低温探测探头可灵活布放到被测环境中贴片式 NTC 热敏电阻一次性贴装在 PCB 上适合温度补偿电路、LED 照明温度监测、电池组温度监测等板级测温场景。NTC 关键参数在选择和使用 NTC 时需要重点关注以下参数参数说明阻值规格25℃ 阻值常见 1K、5K、10K、50K、100K 等阻值精度0.5%、1%、2%、3%、5%使用温度范围依据探头与材料决定的可测温度区间B 值材料常数B 值越高电阻随温度的变化率越高探头外形探头外形、探头材料、导线材料、导线长度等物理规格其中 B 值β 值是决定电阻-温度曲线陡峭程度的关键材料常数直接参与后续的温度换算公式。适用电路两种单 ADC 通道分压测量方案NTC Driver 采用单 ADC 通道测量方案将 NTC 与固定分压电阻Rref串联后接入 ADC 采样。由于 NTC 阻值随温度反向变化其在分压电路中的位置会直接影响输出电压的方向设计时需要特别留意。电路模式一NTC 靠近 VccCIRCUIT_MODE_NTC_VCCVcc -------- Rt -------- Rref -------- GND当 NTC 在上面靠近 Vcc时随着温度升高NTC 的电阻值下降导致分压电路中 NTC 端的电压下降固定电阻端的电压上升最终输出电压会随之变化。使用这种电路时应通过ntc_config_t中的circuit_mode字段选择CIRCUIT_MODE_NTC_VCC。电路模式二NTC 靠近 GNDCIRCUIT_MODE_NTC_GNDVcc -------- Rref -------- Rt -------- GND当 NTC 在下面靠近 GND时情况正好相反NTC 的电阻值下降会导致分压电路中 NTC 端的电压上升固定电阻端的电压下降输出电压也会相应变化。此时应选择CIRCUIT_MODE_NTC_GND。注意NTC 在上面和下面会得到相反的输出电压-温度曲线。这一点在设计和使用 NTC 测量电路时需要特别注意确保正确理解和处理 NTC 的温度特性并在代码中选择匹配的circuit_mode。分压电阻 Rref 的取值原则关于分压电阻Rref取值Rref 的阻值一般取 Rt 在 25 摄氏度时的阻值即Rref ≈ R25。这样设计可以在室温附近使分压点处于 ADC 量程的中间区域获得最优的分辨率与线性度。温度换算原理NTC 数字温度转换公式驱动内部将 ADC 电压还原为 NTC 当前阻值后通过热敏电阻经典公式换算温度公式为Rt R * EXP(B * (1/T1 - 1/T2))其中Rt热敏电阻在 T1 温度下的电阻R室温下热敏电阻在 T2 时的标称电阻B热敏电阻的 B 值材料常数EXPe 的 n 次方T1、T2指开尔文温度K 度K 度 273.15绝对温度 摄氏度源码中的具体实现在 ntc_driver.c 的ntc_voltage_to_temperature函数中驱动首先根据电路模式将采样电压反推为 NTC 当前阻值r_ntc_ohmCIRCUIT_MODE_NTC_VCCr_ntc (vdd - voltage) * fixed / voltageCIRCUIT_MODE_NTC_GNDr_ntc voltage * fixed / (vdd - voltage)随后代入公式换算温度*temperature 1.0 / (log(1.0 * r_ntc_ohm / ndd-s_ntc_config.r25_ohm) * 1.0 / ndd-s_ntc_config.b_value 1.0 / 298.15) - 273.0;其中298.15即 25℃ 对应的开尔文温度- 273.0将结果从开尔文转换为摄氏度r25_ohm即上文公式中的标称电阻 Rb_value即 B 值。可以看到实现完全遵循上述 β 公式。驱动配置结构体ntc_config_t 字段详解NTC Driver 的核心配置结构体定义在 ntc_driver.h 中typedef struct { ntc_circuit_mode_t circuit_mode; /*! ntc circuit mode */ adc_unit_t unit; /*! adc unit */ adc_atten_t atten; /*! adc atten */ adc_channel_t channel; /*! adc channel */ uint32_t b_value; /*! beta value of NTC (K) */ uint32_t r25_ohm; /*! 25℃ resistor value of NTC (Ω) */ uint32_t fixed_ohm; /*! fixed resistor value (Ω) */ uint32_t vdd_mv; /*! vdd voltage (mV) */ } ntc_config_t;各字段含义与取值建议字段含义取值建议circuit_mode分压电路模式CIRCUIT_MODE_NTC_VCC或CIRCUIT_MODE_NTC_GND需与实际电路严格匹配unitADC 单元ADC_UNIT_1/ADC_UNIT_2由芯片型号决定attenADC 衰减量程如ADC_ATTEN_DB_11约 0~3.3V 量程channelADC 通道如ADC_CHANNEL_3需与硬件接线一致b_valueNTC 的 B 值由 NTC 数据手册给出单位 K如 3950r25_ohm25℃ 时 NTC 标称阻值由 NTC 规格决定如 10000Ωfixed_ohm分压电阻 Rref 阻值一般取等于 R25如 10000Ωvdd_mv分压电路供电电压如 3300mV配套的电路模式枚举定义在 ntc_driver.htypedef enum { CIRCUIT_MODE_NTC_VCC 1, // Vcc -------- Rt -------- Rref -------- GND CIRCUIT_MODE_NTC_GND 2, // Vcc -------- Rref -------- Rt -------- GND } ntc_circuit_mode_t;应用示例创建 NTC 驱动并读取温度以下示例完整演示了从配置初始化到温度读取、资源释放的全流程代码同时出现在 docs/zh_CN/sensors/ntc_driver.rst、README_CN.md 与示例工程 ntc_temperature_example_main.c 中。// 1. 选择 ntc 传感器并进行硬件参数初始化配置 ntc_config_t ntc_config { .b_value 3950, .r25_ohm 10000, .fixed_ohm 10000, .vdd_mv 3300, .circuit_mode CIRCUIT_MODE_NTC_GND, .atten ADC_ATTEN_DB_11, .channel ADC_CHANNEL_3, .unit ADC_UNIT_1 }; // 2. 创建 NTC 驱动并初始化 ADC ntc_device_handle_t ntc NULL; adc_oneshot_unit_handle_t adc_handle NULL; ESP_ERROR_CHECK(ntc_dev_create(ntc_config, ntc, adc_handle)); ESP_ERROR_CHECK(ntc_dev_get_adc_handle(ntc, adc_handle)); // 3. 循环调用温度读取函数 float temp 0.0; for (int i 0; i 10; i) { if (ntc_dev_get_temperature(ntc, temp) ESP_OK) { ESP_LOGI(TAG, NTC temperature %.2f ℃, temp); } } // 4. 删除句柄释放资源 ESP_ERROR_CHECK(ntc_dev_delete(ntc));示例工程位于 examples/sensors/ntc_temperature_sensor可直接编译运行。底层初始化流程ntc_dev_create 都做了什么从 ntc_driver.c 的源码可以看到ntc_dev_create内部依次完成内存分配通过calloc创建ntc_driver_dev_t设备结构体保存用户传入的ntc_config_tADC 单元创建若调用方未传入已初始化的adc_handle驱动内部通过adc_oneshot_new_unit以config-unit创建 one-shot ADC 单元并回填到adc_handle输出参数这就是示例中随后调用ntc_dev_get_adc_handle能取到句柄的原因通道配置通过adc_oneshot_config_channel配置config-channel与config-attenADC 校准初始化调用adc_calibration_init优先尝试 Curve Fitting 校准方案adc_cali_create_scheme_curve_fitting不支持时回退到 Line Fitting 方案adc_cali_create_scheme_line_fitting若 eFuse 未烧录校准数据则打印警告跳过软件校准失败回滚任一步骤失败都会走init_fail标签释放 ADC 单元与已分配内存避免资源泄漏。温度读取链路ntc_dev_get_temperaturentc_dev_get_temperature的调用链ntc_driver.c为adc_oneshot_read(adc_handle, channel, raw) // 读取 ADC 原始值 → adc_cali_raw_to_voltage(cali_handle, raw, voltage) // 原始值转电压 (mV) → ntc_voltage_to_temperature(ndd, voltage, temp) // 电压反推阻值 → β 公式换算温度需要注意的是驱动对adc_raw 0与voltage 0做了防护检查并返回ESP_FAIL避免除零导致异常结果。ADC 滤波降低采样噪声Kconfig 可配置为抑制 ADC 采样噪声组件在 Kconfig 中提供两项可配置项CONFIG_ENABLE_NTC_ADC_FILTER默认y开启 NTC ADC 滤波。开启后驱动会连续进行多次 ADC 测量并做滤波处理CONFIG_NTC_FILTER_WINDOW_SIZE默认 50滤波窗口大小即滤波前进行的 ADC 测量次数。窗口值越大NTC 值越稳定但温度更新耗时越长。滤波算法实现在 ntc_driver.c 的adc_oneshot_get_filtered_result中连续采样窗口大小次数的电压值计算平均值与标准差将偏离平均值超过一个标准差的离群采样点剔除再对剩余有效采样取平均从而得到更平滑稳定的电压结果。若关闭滤波则直接采用单次adc_oneshot_read的采样值。API 参考以下 API 实现了对热敏电阻传感器的硬件抽象用户可直接调用该层代码编写传感器应用程序也可以使用 sensor_hub 中的传感器接口实现更简单的调用。核心接口均声明于 ntc_driver.h函数功能返回值ntc_dev_create(config, ntc_handle, adc_handle)初始化 NTC 驱动与 ADC 通道配置创建设备句柄ESP_OK/ESP_FAIL/ESP_ERR_INVALID_ARG/ESP_ERR_NO_MEMntc_dev_get_adc_handle(ntc_handle, adc_handle)获取驱动内部创建的 ADC 句柄ESP_OK/ESP_FAILntc_dev_get_temperature(ntc_handle, temperature)读取当前 NTC 温度摄氏度float输出ESP_OK/ESP_FAILntc_dev_delete(ntc_handle)删除 NTC 驱动设备释放 ADC 校准句柄与 ADC 单元ESP_OK/ESP_FAIL测试与验证组件自带完整测试工程 test_ntc_driver.c测试用例按与示例相同的配置创建驱动、连续读取 10 次温度后删除句柄并通过setUp/tearDown对MALLOC_CAP_8BIT与MALLOC_CAP_32BIT堆内存做泄漏检测阈值 -500 字节确保驱动创建-读取-删除全生命周期无内存泄漏。测试支持 ESP32-C2 / ESP32-C3 / ESP32 / ESP32-C6 / ESP32-S3 等系列芯片可通过 pytest_ntc_driver.py 在 CI 中自动运行。总结NTC Driver 组件为开发者屏蔽了 ADC 初始化、校准与 β 公式换算等底层细节只需正确填写ntc_config_t中与硬件对应的电路模式、分压参数与 NTC 规格即可快速获得稳定的温度读数。设计硬件时重点确认两点一是circuit_mode与分压电路拓扑严格一致NTC 靠近 Vcc 选CIRCUIT_MODE_NTC_VCC靠近 GND 选CIRCUIT_MODE_NTC_GND二是Rref取 25℃ 时 NTC 标称阻值以获得最佳量程利用。配合可配置的 ADC 滤波与传感器抽象层 sensor_hub该方案可灵活集成到温度监控、过温保护、温度补偿等各类应用场景中。赞分享物联网嵌入式驱动开发硬件开发【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址https://gitcode.com/GitHub_Trending/es/esp-iot-solution点击查看免费下载相关推荐ESP-IoT-Solution NTC 热敏电阻驱动分压电路选型、温度换算原理与实战指南ESP IoT Solution NTC 热敏电阻驱动分压电路选型、温度换算原理与实战指南 本文基于 esp iot solution 仓库中的 NTC dr物联网嵌入式驱动开发硬件开发esp-iot-solution NTC 温度传感器驱动负温度系数热敏电阻测温原理与 ESP32 ADC 接入实战esp iot solution NTC 温度传感器驱动负温度系数热敏电阻测温原理与 ESP32 ADC 接入实战 本指南以 esp iot solution物联网嵌入式驱动开发硬件开发ESP32 NTC 热敏电阻测温实战esp-iot-solution ntc_driver 组件的电路模式、温度换算与 ADC 滤波机制详解ESP32 NTC 热敏电阻测温实战esp iot solution ntc_driver 组件的电路模式、温度换算与 ADC 滤波机制详解 ntc_driv物联网嵌入式驱动开发硬件开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表