电桥测ntc,ad读到的值如何转换为温度

2020-01-26 12:49发布

电桥测ntc,ad读到的值如何转换为温度?
MF                             52        103                      H        3435                 F                    A
NTC热敏电阻        环氧系列        电阻值        阻值允差        B值              B值允差        B值类别
                                        10KΩ          ±5%              3435K        ±1%                B25/50
程序应该怎么写
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
10条回答
techbaby
2020-01-27 05:36
  1. /*
  2. *******************************************************************************
  3. *                             ntc对应采样电压值数组
  4. *------------------------------------------------------------------------------
  5. * 注释第一行:对应温度
  6. *-------------------------------------------------------------------------------
  7. * 测量温度范围定为-10℃-150℃(可能会有零点几的数据出入)
  8. ********************************************************************************
  9. */
  10. static int16u code ntc_adc[] =
  11. {      
  12.         62454 ,   61415 ,  60359 ,  59286 ,  58199 ,  57098 ,  55985 ,  54862 ,  
  13.         53730 ,   52592 ,  51448 ,  50302 ,  49153 ,  48005 ,  46858 ,  45715 ,  
  14.         44576 ,   43444 ,  42320 ,  41205 ,  40101 ,  39009 ,  37930 ,  36865 ,  
  15.         35816 ,   34783 ,  33767 ,  32769 ,  31790 ,  30829 ,  29889 ,  28968 ,  
  16.         28068 ,   27189 ,  26331 ,  25494 ,  24678 ,  23883 ,  23110 ,  22358 ,  
  17.         21627 ,   20916 ,  20226 ,  19557 ,  18908 ,  18279 ,  17669 ,  17078 ,  
  18.         16506 ,   15952 ,  15416 ,  14898 ,  14396 ,  13912 ,  13444 ,  12991 ,  
  19.         12554 ,   12132 ,  11724 ,  11331 ,  10951 ,  10584 ,  10230 ,   9889 ,  
  20.          9559 ,    9241 ,   8935 ,   8639 ,   8353 ,   8078 ,   7813 ,   7557 ,  
  21.          7310 ,    7072 ,   6842 ,   6620 ,   6407 ,   6201 ,   6002 ,   5810 ,  
  22.          5625 ,    5446 ,   5274 ,   5108 ,   4948 ,   4793 ,   4644 ,   4500 ,  
  23.          4361 ,    4227 ,   4098 ,   3973 ,   3852 ,   3735 ,   3623 ,   3514 ,  
  24.          3409 ,    3308 ,   3210 ,   3115 ,   3024 ,   2936 ,   2850 ,   2768 ,  
  25.          2688 ,    2611 ,   2536 ,   2464 ,   2394 ,   2327 ,   2262 ,   2198 ,  
  26.          2137 ,    2078 ,   2021 ,   1966 ,  
  27. };                                                                                       
  28. #define NTC_ADC_ARRAY_NUM (sizeof(ntc_adc)/sizeof(int16u))
  29. #define INDEX_MAX       NTC_ADC_ARRAY_NUM-2            /* 数组下标的最大可用取值,对应 80℃采样值下标 */
  30. #define INDEX_MIN       2                            /* 数组下标的最小可用取值,对应-10℃采样值下标 */
  31. #define TEMPER_REF      -15                     /* 温度基准点,即下标为0时对应的温度                    */
  32. #define TEMPER_LAST     100                     /* 温度最后值,即数组最后一个对应的温度        */

  33. /*
  34. *******************************************************************************
  35. * 函数名称: search_data()
  36. * 输   入: search_value  查找基准值
  37. * 输   出:
  38. * 作   者:
  39. * 日   期: 2010.08.11
  40. * 功能描述: 二分查找adc采样值
  41. *------------------------------------------------------------------------------
  42. *注     意:
  43. *    1.    返回值为查找表格中第一个小于查找值(search_value)的下标;
  44. *    2.    查找值(search_value)大于查找表格中最大值时,返回1
  45. *          查找值(search_value)小于查找表格中最小值时,返回查找表格数量,即最大下标+1
  46. *******************************************************************************
  47. */
  48. static int16u search_data(int16u search_value)
  49. {
  50.    register int16u  max = NTC_ADC_ARRAY_NUM - 1;
  51.    register int16u  min = 1;
  52.    register int16u  mid;

  53.    while(min <= max)
  54.    {
  55.        mid = (max + min) / 2;

  56.        if(search_value > ntc_adc[mid])
  57.        {
  58.            max = mid - 1;
  59.        }
  60.        else
  61.        {
  62.            min = mid + 1;
  63.        }
  64.    }

  65.    return min;
  66. }

  67. /*
  68. *******************************************************************************
  69. * 函数名称: temper_calc()
  70. * 输   入: index       数组下标
  71. *           adc0_value  ad滤波后的采样值
  72. * 输   出: ntc温度测量值
  73. * 作   者:
  74. * 日   期: 2010.10.26
  75. * 功能描述: 温度计算(分段线性插值算法)
  76. *******************************************************************************
  77. */
  78. static int16s temper_calc(int16u index, int16u adc0_value)
  79. {
  80.         if (index > INDEX_MAX || index < INDEX_MIN)
  81.         {
  82.                 return TEMPER_ERROR;        //  返回错误采样温度
  83.         }
  84. //     else if (index < INDEX_MIN)
  85. //     {
  86. //         return -150;        //  返回-15.0℃
  87. //     }
  88.         else
  89.         {
  90.        /*************************************************
  91.         === 直线近似计算 ===
  92.         y1 = kx1+b       x <-> adc_value
  93.         y2 = kx2+b       y <-> temper
  94.         yn = kxn+b
  95.               y2 - y1     yn - y1
  96.         k  = --------- = ---------
  97.               x2 - x1     xn - x1
  98.               (y2 - y1)*(xn - x1)
  99.         yn = --------------------- + y1
  100.                     (x2 - x1)
  101.         *************************************************/

  102.        int16s temper;
  103.                                        
  104.        temper  = 10*(ntc_adc[index-1] - adc0_value);   //  放大10倍,temper放大10倍
  105.        temper /= (ntc_adc[index-1] - ntc_adc[index]);  //  (xn - x1)
  106.        temper += 10*(index + TEMPER_REF - 1);
  107.       
  108.        return temper;            
  109.         }      
  110. }

  111. /*
  112. *******************************************************************************
  113. * 函数名称: adc0_battery_temper_calc()
  114. * 输   入: adc0_sample_num            ad采样次数
  115. *           adc0_sample_sum                ad采样总和
  116. * 输   出:
  117. * 作   者:
  118. * 日   期: 2011.11.23
  119. * 功能描述: 输出220V电压计算
  120. *******************************************************************************
  121. */
  122. void adc0_battery_temper_calc(int16u adc_value)
  123. {                     
  124.         register int16s temper;              // 温度值
  125.         register int16u index;               // 查表下标值

  126.         index  = search_data(adc_value);                     // 取温度数组下标
  127.         temper = temper_calc(index, adc_value);              // 温度计算

  128.         battery_sample.battery_temper = temper;  
  129. }
复制代码

一周热门 更多>