资讯详情

HAL库教程14:查表法测量NTC热敏电阻

??STM32F4的AD采样结果为12位,即采样最大值为4096。参考电压为3.3V,所以3.3V对应4096。.3V只是理想状态,实际上可能有轻微的偏差。假设单片机AD引脚电压采集为x,实际单片机的参考电压为z伏,读取AD值与x的对应关系如下: 在这里插入图片描述 ??分析温度采集电路中电压值与电阻值的关系。 ??可以得出两个等式联立AD与电阻的关系: ??可以在程序中获得AD计算电阻值后,检查表格,根据电阻值计算温度值。 ??这里可以做一些优化。既然要查表,能不能干脆不算,把所有的计算工作都放在查表里? ??在一定温度下,将相应的电阻值带入公式,计算相应的温度AD值。我把零下30℃到150℃的 算出来,放在了数组中:

const u16 tempRes_buf[181] = { 
          3876, 3863, 3849, 3835, 3819, 3804, 3787,  3769, 3751, 3732, 3712, 3692, 3670, 3648, 3625, 3601, 3576, 3550, 3523, 3496,    3467, 3438, 3408, 3377, 3344, 3312, 3278, 3243, 3208, 3171, 3134, 3096, 3057,  3018, 2978, 2937, 2896, 2854, 2811, 2768,   2725, 2681, 2637, 2592, 2547, 2502,  2457, 2411, 2366
      
       , 
       2320
       , 
       2274
       , 
       2229
       , 
       2183
       , 
       2138
       , 
       2092
       , 
       2048
       , 
       2003
       , 
       1958
       , 
       1914
       , 
       1871
       , 
       1827
       , 
       1784
       , 
       1742
       , 
       1700
       , 
       1659
       , 
       1618
       , 
       1578
       , 
       1538
       , 
       1499
       , 
       1461
       , 
       1423
       , 
       1386
       , 
       1350
       , 
       1314
       , 
       1279
       , 
       1245
       , 
       1211
       , 
       1179
       , 
       1146
       , 
       1115
       , 
       1084
       , 
       1054
       , 
       1025
       , 
       996
       , 
       968
       , 
       941
       , 
       915
       , 
       889
       , 
       864
       , 
       839
       , 
       815
       , 
       792
       , 
       769
       , 
       747
       , 
       726
       , 
       705
       , 
       685
       , 
       665
       , 
       646
       , 
       628
       , 
       610
       , 
       592
       , 
       575
       , 
       558
       , 
       542
       , 
       527
       , 
       512
       , 
       497
       , 
       483
       , 
       469
       , 
       456
       , 
       443
       , 
       430
       , 
       418
       , 
       406
       , 
       395
       , 
       383
       , 
       373
       , 
       362
       , 
       352
       , 
       342
       , 
       333
       , 
       323
       , 
       314
       , 
       306
       , 
       297
       , 
       289
       , 
       281
       , 
       273
       , 
       266
       , 
       259
       , 
       252
       , 
       245
       , 
       238
       , 
       232
       , 
       225
       , 
       219
       , 
       214
       , 
       208
       , 
       202
       , 
       197
       , 
       192
       , 
       187
       , 
       182
       , 
       177
       , 
       173
       , 
       168
       , 
       164
       , 
       160
       , 
       155
       , 
       152
       , 
       148
       , 
       144
       , 
       140
       , 
       137
       , 
       133
       , 
       130
       , 
       127
       , 
       124
       , 
       121
       , 
       118
       , 
       115
       , 
       112
       , 
       109
       , 
       107
       , 
       104
       , 
       102
       , 
       99
       , 
       97
       , 
       94
       , 
       92
       , 
       90
       , 
       88
       , 
       86
       , 
       84
       , 
       82
       , 
       80
       , 
       78
       , 
       76
       , 
       75
       , 
       73
       }
       ; 
      

  然后可以编写查表函数:

/** * @brief 通过查表法,根据AD值计算温度 * @param AD值 * @Note 温度范围是-30~150度 如果超过范围,返回32767 ℃。10K上拉,3950 10K热敏电阻 * @retval 温度值 */  
short calcuTem(u16 ad_value)
{ 
       
  short tempValue= 0x7fff;
  if ((ad_value < 3877)&&(ad_value > 72))
  { 
       
    for (short i = 0 ; i < 181 ; i++)
    { 
       
      if (ad_value > tempRes_buf[i])
      { 
       
        tempValue = i-30;
        break;
      }
    }
  }
  //else err return 0x7fff
  return tempValue;
}

  主函数的打印语句也做相应修改:

  while (1)
  { 
       
    HAL_Delay(1000);
    short tempA = calcuTem(ADC1_RANK1_AVG);
    short tempB = calcuTem(ADC1_RANK2_AVG);
    printf("采样次数: %d\n",ADC_CHANNEL_CNT/2);
    printf("温度A的AD值是 %d ;温度是%d ℃\n ",ADC1_RANK1_AVG,tempA);
    printf("温度B的AD值是 %d ;温度是%d ℃\n ",ADC1_RANK2_AVG,tempB);
  }

附上源码

标签: 150kntc电阻

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台