电子工程师联盟
认证:VIP会员
作者动态
解决Altium Designer PCB预拉线消失问题的三板斧
18小时前
stm32复位引脚的弱上拉电阻,你们利用吗?
3天前
波特率 and 比特率,有啥区别???
4天前
模块化编程常规需要遵守的一些规则记录(为了调代码时少揪头发所做的努力~)
5天前
关于串口RS232的一些基础知识及调试技巧
6天前

基于NTC电阻的温度采集软硬件设计与实现

一、NTC测温原理

NTC热敏电阻测温,本质是将温度变化转化为可测量的电阻变化,再通过电路和算法转换为温度读数。

1. NTC的核心特性 - 负温度系数

 NTC由对温度敏感的半导体金属氧化物材料制成。其内部的导电机制是“跃迁”导电。当温度升高时,材料中被束缚的电子获得更多能量,更容易挣脱束缚成为自由电子参与导电,同时材料本身也会产生更多的电子-空穴对。这导致材料的导电能力急剧增强,电阻值(Rt)呈指数规律显著下降。这种电阻随温度升高而减小的特性称为负温度系数(NTC)。

2. 电路实现 - 分压测量

为了测量NTC的电阻变化,最常用的方法是将其与一个精度和温漂都很好的固定参考电阻(Rs)串联,接入稳定的直流电压源(Vcc),形成一个分压器。NTC电阻(Rt)上的分压(Vout)即为测量点电压:Vout = Vcc * (Rt / (Rs + Rt))。

3. 信号采集 - ADC转换

使用微控制器(MCU)或其他数据采集系统内置的模数转换器(ADC) 通道,采集NTC两端的电压Vout。这个模拟电压值被ADC转换为数字量(ADC Code)。

4. 数学转换 - 温度计算

得到ADC值后,结合已知的Vcc、Rs和ADC的参考电压/分辨率,可以计算出当前的Rt值。最关键的一步是将Rt值转换为温度值。 由于NTC的Rt-T关系是高度非线性的,不能简单地用线性公式。通常采用精度较高的Steinhart-Hart方程:1/T = A + B * ln(Rt) + C * (ln(Rt))^3其中,T是绝对温度(单位:开尔文K),A, B, C 是NTC元件特定的常数(可从厂家数据手册获取)。或者使用精度稍低但计算更简单的B值方程(β值方程):1/T = 1/T0 + (1/B) * ln(Rt/R0)其中,T0是参考温度(通常为25°C=298.15K),R0是NTC在T0温度下的标称电阻值,B是材料常数(B值)。MCU通过程序执行这些数学计算,最终得到精确的温度值(通常转换为摄氏度℃)。

二、NTC温度采集实现

1、理论计算

我选用了一个B值是3950,25℃下阻值为10KΩ,精度为1%的NTC电阻,来实现温度采集。首先是电路设计,使用3.3V供电,考虑到我的主要应用场景就是测室温,所以分压电阻选择10K,目的是为了让常温下的ADC阻值刚好落在整个测温范围的中间。C16用来滤除电源上过来的干扰。如下图所示:

下图是该NTC电阻所匹配的温度阻值对照表,一般NTC厂家均可提供。

下图是根据温度阻值表中各个温度值对应的实时阻值、串联电阻的阻值、ADC满量程的数字值,计算出来对应温度值的ADC数值。

2、代码实现

然后使用查表及二分法实现温度采集后的计算,以下代码经过测试验证。

/********************************************************************
* name:        : TspBinaryTableSearch( uint16_t adc_val )
* description  : Calculation of NTC temperature by binary table lookup method (二分法)
* Input   : adc_val  current adc value 
* Output   : uint16_t  tempdat
* Return   : None
********************************************************************/
static uint16_t TspBinaryTableSearch( uint16_t adc_val )
{
  uint16_t start = 0U, end = 0U, mid = 0U,tempdat = 0U;
  /* Get the arry length */
  end = ( sizeof( NTC_adc_table )/ sizeof( NTC_adc_table[0] ) ) - 1U;
  /* Data anomaly judgment */
  if( adc_val <= TSP_SHORT_CIRCUIT_THRESHOLD )
  {  
    return 1U;
  }
  else if( adc_val >= TSP_OPEN_CIRCUIT_THRESHOLD )
  {  
    return 2U;
  }  
  else if( adc_val > NTC_adc_table[0] )
  {
    return 3U;
  }  
  else if( adc_val < NTC_adc_table[end - 1U] )
  {
    return 4U;
  }
  while ( start <= end )
  {
    /* Get the mid value */
    mid = (start + end) >> 1; 
    /* Just find */
    if( adc_val ==  NTC_adc_table[mid] )
    {
      break;
    }
    /* Right in between two temperature points */
    if( ( adc_val < NTC_adc_table[mid] ) && ( adc_val > NTC_adc_table[mid+1U] ) )
    {
      break;
    }
    /* The current AD value less than the middle of the array indicates 
    /* the second half of the number to look for 
    */
    if( adc_val < NTC_adc_table[mid] )
    {
      start = mid + 1U; 
    }
    /* The current AD value greater than the middle of the array indicates 
     * that the number to be found is in the first half 
    */
    else if( adc_val > NTC_adc_table[mid] )
    {
      end = mid - 1U;  
    }
  }
  tempdat = ( NTC_Temperature_table[mid] + (float)( NTC_adc_table[mid] - adc_val ) / (float)( NTC_adc_table[mid] - NTC_adc_table[mid+1] ) + 0.5)*10;

  return  tempdat;
}

以上就是今天的内容,书不尽言,难免有疏漏之处,还请多加斟酌,这里做个记录。

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 3
收藏 4
关注 40
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧