数码之家

 找回密码
 立即注册
搜索
查看: 1730|回复: 15

[C51] 温度计的查表法怎么使用表格?

[复制链接]
发表于 2022-4-16 20:34:08 | 显示全部楼层 |阅读模式
我想用NTC热敏电阻做温度计,很多人都说用查表法比较简单和精准,
那问题来了,使用使用这个表格,比如我用ADC转换和计算得到当时的NTC阻值是520K, 这个520K并没有出现在表格里,那怎么计算?

请有经验的大神来指导下。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
发表于 2022-4-16 20:44:06 | 显示全部楼层
不懂,不过我觉得可以找最近的,误差那一点算个啥...
回复 支持 反对

使用道具 举报

发表于 2022-4-16 20:48:10 | 显示全部楼层
直线拟合啊。两点可确定一条直线……
回复 支持 反对

使用道具 举报

发表于 2022-4-16 20:55:25 | 显示全部楼层
520K不是-54度吗? 在表格内啊
回复 支持 1 反对 0

使用道具 举报

发表于 2022-4-16 22:17:30 | 显示全部楼层
gy9319 发表于 2022-4-16 20:55
520K不是-54度吗? 在表格内啊

楼主估计用的运算符估计是“==”,而不是"<="
回复 支持 反对

使用道具 举报

发表于 2022-4-16 23:22:36 | 显示全部楼层
一般用分段线性法。
回复 支持 反对

使用道具 举报

发表于 2022-4-17 08:07:32 | 显示全部楼层
本帖最后由 ftp0823 于 2022-4-17 08:09 编辑

这个表格有问题,比如540在两个温度范围内
回复 支持 反对

使用道具 举报

发表于 2022-4-17 17:27:48 | 显示全部楼层
把值整理出来然后放坐标系里面画线
回复 支持 反对

使用道具 举报

发表于 2022-4-17 21:58:16 来自手机浏览器 | 显示全部楼层
要求不高,直接查表格。520离54℃的中值525最近,那就是54℃啦。要求高点,做线性插值。表上连续2个点确定了一条斜线,斜率和横坐标(也就是电阻值)知道了,算出纵坐标(温度值)就可以了。要更精确,3个点拟合曲线,再根据横坐标,算出纵坐标。
回复 支持 反对

使用道具 举报

发表于 2022-4-17 21:59:20 | 显示全部楼层
我也闹不清楚。。。做了个t12.。。线性不会弄。。。虽然能正常用。。但是温度不是线性
回复 支持 反对

使用道具 举报

发表于 2022-4-20 08:23:40 | 显示全部楼层
一般是按照中心值计算表格, 取临近的两个点, 用两点法计算目标点的对应值, 这就是所谓的曲线拟合,
如果要的精度更高, 使用更好的传感器或者每个单独重新校准, 修正手册的理论曲线
回复 支持 反对

使用道具 举报

发表于 2022-4-20 10:41:13 | 显示全部楼层

/************************************************************
* 函数名        :         Get_Temp()
* 功能说明        :         获取NTC温度值
*
* 输入参数        :        无
* 输出参数        :         uint16 温度值*100,单位摄氏度
************************************
* 修改记录        :        
* 历次作者        :        
* 日期                :        
************************************
* 修改记录        :        新增函数,第一次编辑
* 历次作者        :        Huo_xp
* 日期                :        2019/08/12
*************************************************************/        

uint16 Get_Temp(void)
{
    uint8 count = 0;
    static uint8 adccount;
    static uint8 Temp_Buf[AVE_N+1];
    uint16 temp = 0;
    uint16 sum = 0;

    temp=(uint16)ADC_SAR_SEQ_GetResult16(HEAT_TEMP)*2; //Psoc ADC实际只有11Bit,所以*2,方便查表计算温度
   
//        Temp_Buf[AVE_N]=temp;//ADC_SAR_SEQ_GetResult16(HEAT_TEMP)*2;  //将ADC转换结果放数组最高位
//        if( ++adccount < 8)      //采样初期不使用递推滤波算法
//    {   
//        for(count=0;count<8;count++)  //准备递推滤波算法的数据
//                {
//                    Temp_Buf[count]=Temp_Buf[count+1];//所有数据循环左移
//                }
//                temp=Temp_Buf[8];//采样初期使用当前采样值
//        }
//    else    //只有采样次数大于8次以后才使用递推滤波算法
//    {
//        adccount=8; //采样次数超过8次后,固定设置为8
//        for(count=0;count<8;count++)  //递推滤波算法
//        {
//            Temp_Buf[count]=Temp_Buf[count+1];//所有数据循环左移
//            sum += Temp_Buf[count];  //求和
//        }
//        temp=sum/8;        //求平均值      
//    }   
//    count=0;
    while( temp < NTC_Table[count] ) //将当前温度值与温度表对比,得到所在位置
    {   count++;   }

    NTC_Temp = count*100 +(1-((temp - NTC_Table[count+1])*100 )/( NTC_Table[count] - NTC_Table[count+1]));
   // 插值法计算温度,将数据全部扩大100倍,使小数变为整数,

//    if(count >=39)    //温度高于0度
//    {
//        temp=NTC_Temp-3900;//修正温度,0~120
//        sprintf(
//            uartLine, "Heat temp is: %dC %d %d %d",
//            (uint16) temp,ADC_SAR_SEQ_GetResult16(HEAT_TEMP),count,TIMER.mSec //ADCcount//
//            );
//
//            UART_PutString(uartLine);
//            UART_PutCRLF();
//     }
//     else
//    {
//        temp=4000-NTC_Temp;//修正温度,-40~0
//        sprintf(
//            uartLine, "Heat temp is: -%dC %d %d ",
//            (uint16) temp,ADC_SAR_SEQ_GetResult16(HEAT_TEMP),count //ADCcount//
//            );
//
//            UART_PutString(uartLine);
//            UART_PutCRLF();  
//    }
       return NTC_Temp;
   

}

/************************************************************
* 函数名        :         NTC_Table[]
* 功能说明        :         NTC温度阻止表,不同的NTC需按照规格书重新计算
*
* 输入参数        :        无
* 输出参数        :        无
************************************
* 修改记录        :        
* 历次作者        :        
* 日期                :        
************************************
* 修改记录        :        新增函数,第一次编辑
* 历次作者        :        Huo_xp
* 日期                :        2019/08/12
*************************************************************/        

   
const uint16  NTC_Table[] = {    //NTC温度转换12 Bit ADC 各温度对应的值
   
//hex                          temp C      
   
0xF8B,                          //-40
0xF85,                          //-39
0xF7F,                          //-38
0xF78,                          //-37
0xF70,                          //-36
0xF69,                          //-35
0xF61,                          //-34
0xF59,                          //-33
0xF50,                          //-32
0xF48,                          //-31
0xF3E,                          //-30
0xF35,                          //-29
0xF2B,                          //-28
0xF20,                          //-27
0xF15,                          //-26
0xF0A,                          //-25
0xEFE,                          //-24
0xEF2,                          //-23
0xEE5,                          //-22
0xED8,                          //-21
0xECA,                          //-20
0xEBC,                          //-19
0xEAE,                          //-18
0xE9E,                          //-17
0xE8F,                          //-16
0xE7E,                          //-15
0xE6E,                          //-14
0xE5C,                          //-13
0xE4A,                          //-12
0xE38,                          //-11
0xE25,                          //-10
0xE11,                          //-9
0xDFD,                          //-8
0xDE9,                          //-7
0xDD3,                          //-6
0xDBD,                          //-5
0xDA7,                          //-4
0xD90,                          //-3
0xD78,                          //-2
0xD60,                          //-1
0xD47,                          //0
0xD2E,                          //1
0xD14,                          //2
0xCFA,                          //3
0xCDF,                          //4
0xCC3,                          //5
0xCA7,                          //6
0xC8B,                          //7
0xC6E,                          //8
0xC50,                          //9
0xC32,                          //10
0xC14,                          //11
0xBF5,                          //12
0xBD6,                          //13
0xBB5,                          //14
0xB96,                          //15
0xB75,                          //16
0xB54,                          //17
0xB32,                          //18
0xB11,                          //19
0xAEF,                          //20
0xACC,                          //21
0xAAA,                          //22
0xA87,                          //23
0xA64,                          //24
0xA41,                          //25
0xA1E,                          //26
0x9FA,                          //27
0x9D7,                          //28
0x9B3,                          //29
0x98F,                          //30
0x96C,                          //31
0x948,                          //32
0x924,                          //33
0x900,                          //34
0x8DC,                          //35
0x8B8,                          //36
0x895,                          //37
0x871,                          //38
0x84D,                          //39
0x82A,                          //40
0x807,                          //41
0x7E4,                          //42
0x7C1,                          //43
0x79E,                          //44
0x77C,                          //45
0x75A,                          //46
0x738,                          //47
0x717,                          //48
0x6F5,                          //49
0x6D4,                          //50
0x6B3,                          //51
0x693,                          //52
0x673,                          //53
0x653,                          //54
0x634,                          //55
0x615,                          //56
0x5F6,                          //57
0x5D8,                          //58
0x5BA,                          //59
0x59D,                          //60
0x580,                          //61
0x563,                          //62
0x547,                          //63
0x52B,                          //64
0x510,                          //65
0x4F5,                          //66
0x4DB,                          //67
0x4C1,                          //68
0x4A8,                          //69
0x48E,                          //70
0x476,                          //71
0x45E,                          //72
0x446,                          //73
0x42F,                          //74
0x418,                          //75
0x401,                          //76
0x3EB,                          //77
0x3D6,                          //78
0x3C1,                          //79
0x3AC,                          //80
0x397,                          //81
0x384,                          //82
0x370,                          //83
0x35D,                          //84
0x34A,                          //85
0x338,                          //86
0x326,                          //87
0x315,                          //88
0x304,                          //89
0x2F3,                          //90
0x2E3,                          //91
0x2D2,                          //92
0x2C3,                          //93
0x2B3,                          //94
0x2A5,                          //95
0x296,                          //96
0x287,                          //97
0x279,                          //98
0x26C,                          //99
0x25E,                          //100
0x251,                          //101
0x244,                          //102
0x238,                          //103
0x22C,                          //104
0x220,                          //105
0x214,                          //106
0x209,                          //107
0x1FE,                          //108
0x1F3,                          //109
0x1E8,                          //110
0x1DE,                          //111
0x1D4,                          //112
0x1CA,                          //113
0x1C0,                          //114
0x1B6,                          //115
0x1AD,                          //116
0x1A4,                          //117
0x19B,                          //118
0x193,                          //119
0x18A,                          //120
};

打赏

参与人数 1家元 +70 收起 理由
广东梁百万 + 70 謝謝分享

查看全部打赏

回复 支持 1 反对 0

使用道具 举报

发表于 2022-4-22 15:24:06 | 显示全部楼层
本帖最后由 chenghelin 于 2022-4-22 15:26 编辑

根本不需要表格,有个公式,使用起来很准很方便的,我好几年前搞过,在网上找到的,直接把ADC转换成电压值代入公式就得到温度值,和表格上的结果一模一样
回复 支持 反对

使用道具 举报

发表于 2022-4-23 21:23:07 | 显示全部楼层
本帖最后由 lyy-cy 于 2022-4-23 21:24 编辑

以前折腾过,供参考:

  1. NTC_ADC_Tab=[
  2. 372 , 392 , 413 , 434 , 457 , 480 , 504 , 529 , 554 , 581 , 609 , 637 ,
  3. 666 , 696 , 727 , 759 , 792 , 825 , 859 , 894 , 930 , 967 , 1004 ,
  4. 1043 , 1081 , 1121 , 1161 , 1202 , 1243 , 1285 , 1327 , 1370 , 1413 ,
  5. 1457 , 1501 , 1545 , 1589 , 1634 , 1678 , 1723 , 1768 , 1813 , 1858 ,
  6. 1903 , 1947 , 1992 , 2036 , 2080 , 2124 , 2167, 2210, 2253, 2295, 2337,
  7. 2378, 2419, 2460, 2499, 2539, 2577, 2615, 2653, 2689, 2725, 2761, 2796,
  8. 2830, 2863, 2896, 2928, 2959,]# -20--50 ℃

  9. def get_temp_value(adc_nub):#传感器的ADC值
  10.     if adc_nub>NTC_ADC_Tab[-1] or adc_nub< NTC_ADC_Tab[0] :  #判断ADC值是否在表内
  11.         return "%0.1f"%(99) #保持格式一致都是str
  12.     front = 0
  13.     end = len(NTC_ADC_Tab)  #表内数据个数
  14.     half = (end + front) //2
  15.     while end - front != 1:
  16.         if adc_nub > NTC_ADC_Tab[half] :
  17.             front = half
  18.             half = (end + front) //2
  19.         elif adc_nub < NTC_ADC_Tab[half] :
  20.             end = half
  21.             half = (end + front) //2
  22.         if adc_nub == NTC_ADC_Tab[half] : #正好等于表格中的值数值正好在表内
  23.             temp_val = half
  24.             break
  25.     if half and end - front == 1: #在表格两个值之间的数 if half 排除 half = 0 的情况
  26.         #数值在两个已知值之间,差值计算得出近似值'
  27.         temp_val= half + (adc_nub-NTC_ADC_Tab[half]) /(NTC_ADC_Tab[half+1] - NTC_ADC_Tab[half])

  28.     temp_val = "%0.1f"%(temp_val-20)  #第一个温度是 -20
  29.     return temp_val

  30. print(get_temp_value(380))  #模拟温度ADC值
复制代码

打赏

参与人数 1家元 +70 收起 理由
广东梁百万 + 70

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2022-4-29 09:51:36 | 显示全部楼层
用单片机查表应该比算公式压快一点吧?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-20 05:57 , Processed in 0.327600 second(s), 15 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表