关于ntc测量温度的问题

[复制链接]
 楼主| 16777216 发表于 2013-5-4 21:27 | 显示全部楼层 |阅读模式
本帖最后由 16777216 于 2013-5-6 08:01 编辑

关于分辨率的文图

要求是要分辨率 0.1 精度1度

采用ntc1000的热敏电阻    ad采用了10位的  stc单片机自带的10ad转换        
ad使用查表法   
建立如下的数组
UINT16 code AD_Tab[111]={ 131, 138, 144, 151, 157, 164, 172,-------------------922, 924, 927};
共111个数字  对应 0度 1度  2度   -----------110度


在比如 109度的时候为924  110度的时候为927    那么此时我的分辨率是否为       (927-924)/10=0.3度

我得到的温度计算方法是       比如当数值为 925 的时候   T=109+(925-924)/(927-204)=  109.3度
                                                                    926的时候    T=109+(926-924)/(927-204)=109.6度

但是我的要求是要达到0.1的分辨率    那么 必须要改变我 的ad么  采用16位ad?

或者还有别的方法么  



还有一个问题 就是在20-21度的时候 俩ad采样相差大于10  但是我用液晶显示还是直接从20----20.4-----20.8----20.12

基本上都是以0.4度递增  但是理论上在这些点可以达到0.1递增的   

我通过手动赋值ad的实际采样  可以正常显示20.1  20.2   20.3  20.4  说明ad采样出问题了么   奇怪了

这个是ad采样

  1. UINT16 Get_ADC(void)
  2. {
  3.   
  4.     UINT16         Temp;
  5.         ADC_RES   = 0;            //清除结果
  6.         ADC_RESL  = 0;
  7.         ADC_CONTR &= ~(0x01<<5);    //清flag
  8.     ADC_CONTR |= 0x68;          //通道0 全速  开始转换      
  9.     while (1)                 //等待A/D转换结束
  10.     {
  11.         if (ADC_CONTR & 0x10)  //0001,0000 测试A/D转换结束否
  12.         {  
  13.                          break;
  14.                 }
  15.     }
  16.     ADC_CONTR &= ~(0x01<<5);    //清flag  
  17.         Temp = ((UINT16)ADC_RES)<<8 | ((UINT16)ADC_RESL);         
  18.     return   Temp; //返回 A/D 10 位转换结果



这个是采样与温度转换的程序
  1. UINT16 Get_Temp(void)
  2. {
  3.     UINT8 n, temp_zheng;
  4.         UINT16 ad_temp;
  5.         FP32 temp_xiao;
  6.         UINT16 temp = 0;
  7.         ad_temp = Get_ADC();
  8.         while(1)
  9.         {
  10.                 if ((ad_temp >= AD_Tab[n]) && (ad_temp <= AD_Tab[n+1]))
  11.         {
  12.             temp_zheng = n;
  13.                         temp_xiao =        (1.0*(ad_temp - AD_Tab[n]))/(AD_Tab[n+1] - AD_Tab[n]);
  14.                         temp = temp_zheng*100 + temp_xiao*100.0;
  15.             return temp;
  16.         }
  17.         n++;
  18.         if (n>110)
  19.         {
  20.             return 20000;
  21.         }
  22.         }
这个是主函数
  1. void DispNowTemp(UINT16 j)
  2. {

  3.         LCD_write_char(1, 1, j/1000 + '0');
  4.         LCD_write_char(1, 2, j%1000/100 + '0');
  5.         LCD_write_char(1, 3, '.');
  6.         LCD_write_char(1, 4, j%1000%100/10 + '0');
  7.         LCD_write_char(1, 5, j%1000%100%10 + '0');
  8. }

  9. main()
  10. {
  11.         P3M1 |= 0x01 << 2;
  12.     //P2M0 |= 0x01 << 5;
  13.         P1M0 |= 0XF9;
  14.         P1M1 = 0X01;        
  15.         sei();
  16.         LCD_start();
  17.         InitADC();
  18.         while(1)
  19.         {
  20.                 ADTemp = Get_Temp();
  21.                 DispNowTemp(ADTemp);
  22.         //LCD_write_num(1,1,ADTemp);
  23.         //LCD_clear();
  24.         }


这个是采样ad
  1. UINT16 code AD_Tab[111]={ 131,
  2. 138,
  3. 144,
  4. 151,
  5. 157,
  6. 164,
  7. 172,
  8. 179,
  9. 187,
  10. 194,
  11. 202,
  12. 210,
  13. 219,
  14. 227,
  15. 236,
  16. 245,
  17. 254,
  18. 263,
  19. 272,
  20. 282,
  21. 291,
  22. 301,
  23. 311,
  24. 321,
  25. 331,
  26. 341,
  27. 352,
  28. 362,
  29. 372,
  30. 382,
  31. 393,
  32. 403,
  33. 414,
  34. 424,
  35. 435,
  36. 445,
  37. 456,
  38. 466,
  39. 477,
  40. 487,
  41. 497,
  42. 507,
  43. 518,
  44. 528,
  45. 538,
  46. 548,
  47. 558,
  48. 568,
  49. 577,
  50. 587,
  51. 596,
  52. 606,
  53. 615,
  54. 624,
  55. 633,
  56. 642,
  57. 651,
  58. 659,
  59. 668,
  60. 676,
  61. 684,
  62. 692,
  63. 700,
  64. 708,
  65. 715,
  66. 723,
  67. 730,
  68. 737,
  69. 744,
  70. 751,
  71. 758,
  72. 764,
  73. 771,
  74. 777,
  75. 783,
  76. 789,
  77. 795,
  78. 801,
  79. 806,
  80. 812,
  81. 817,
  82. 822,
  83. 828,
  84. 832,
  85. 837,
  86. 842,
  87. 847,
  88. 851,
  89. 855,
  90. 860,
  91. 864,
  92. 868,
  93. 872,
  94. 876,
  95. 879,
  96. 883,
  97. 887,
  98. 890,
  99. 893,
  100. 897,
  101. 900,
  102. 903,
  103. 906,
  104. 909,
  105. 911,
  106. 914,
  107. 917,
  108. 919,
  109. 922,
  110. 924,
  111. 927};














本帖子中包含更多资源

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

×
 楼主| 16777216 发表于 2013-5-4 21:42 | 显示全部楼层

如果外加ad的话  采用ads1115可否

评论

全职家丁 77wx.org/read/115/index.html  发表于 2013-5-5 20:56
icecut 发表于 2013-5-4 21:46 | 显示全部楼层
你从头开始算你的设计吧.精度不是模拟定死了,再来算的...
gx_huang 发表于 2013-5-5 16:19 | 显示全部楼层
0-110,用10bit ADC,肯定达不到0.1度的分辨率。
考虑到NTC的非线性,ADC范围起码大4倍才可以,起码要用14bit的ADC。
考虑到计算速度和内存,一般很少用浮点计算。
如果是商用的通用温控仪表,一般不会使用ADC的,采用其它方式实现ADC采样,分辨率才会高。
 楼主| 16777216 发表于 2013-5-5 17:13 | 显示全部楼层
gx_huang 发表于 2013-5-5 16:19
0-110,用10bit ADC,肯定达不到0.1度的分辨率。
考虑到NTC的非线性,ADC范围起码大4倍才可以,起码要用14b ...

嗯 我现在用ads1115  16位的ad转换
有什么廉价的ad么
cauhorse 发表于 2013-5-5 22:10 | 显示全部楼层
“精度”就呵呵了,“显示分辨率”可以用过采样的方式折腾一下,10bit是可以整出来的。
 楼主| 16777216 发表于 2013-5-6 07:59 | 显示全部楼层
cauhorse 发表于 2013-5-5 22:10
“精度”就呵呵了,“显示分辨率”可以用过采样的方式折腾一下,10bit是可以整出来的。 ...

怎么折腾呢  

我通过16位的ad是成功了的 但10位的搞不出呀

理论上有些地方是0.1递增  但实际液晶最少0.4递增

精度我就要求1度 分辨率是10  就是要求液晶上能显示0.1递增在温度缓慢升高的情况下
gx_huang 发表于 2013-5-6 08:44 | 显示全部楼层
有些地方理论0.1度分辨率,实际0.4度,程序或者硬件肯定有问题的。
用12bit ADC,可以实现0.1度分辨率。
如果是10bit,即使过采样,如果本底噪声不大,无法实现0.1度分辨率。
wangyy608 发表于 2013-5-6 08:51 | 显示全部楼层
提高采样速度,连续采样多次相加当一个值,滑动平均
gx_huang 发表于 2013-5-6 09:09 | 显示全部楼层
Temp = ((UINT16)ADC_RES)<<8 | ((UINT16)ADC_RESL);
这个错了吧。
应该是Temp = (((UINT16)ADC_RES)<<2) + (ADC_RESL&0x03);
ADC_RES是ADC的高8位,ADC_RESL是低2位。
怪不得你是0.4度步进。

评分

参与人数 1威望 +2 收起 理由
16777216 + 2 很给力! 真是太感谢你了 确实这里错了 .

查看全部评分

cauhorse 发表于 2013-5-7 21:39 | 显示全部楼层
16777216 发表于 2013-5-6 07:59
怎么折腾呢  

我通过16位的ad是成功了的 但10位的搞不出呀

特别确认了一下:
使用STC12C5A60S2做的试验,MF58型NTC(25度,10K,B值约3950K),串接10k分压电阻,采样64次后求和,再将结果右移4位,可以实现所谓“温度0.1度”步进式的测量,且测量值在温度恒定时很稳定。

评论

嗯 有空试试  发表于 2013-5-7 22:47
coody 发表于 2013-5-8 11:00 | 显示全部楼层
到底是NTC还是PT1000?
ahpuhts 发表于 2013-8-3 18:39 | 显示全部楼层
学习学习,
wyq8848 发表于 2013-9-11 14:49 | 显示全部楼层
我是这里的实习生,所以不能下载您发的"热电偶“附件,劳驾您将这个附件发我邮箱一份,万分感激!13359898765@163.com

我是个菜鸟,刚学习单片机,正打算制作一个温控器,精度0.5就可以,希望能得到您的帮助!祝您万事如意。
 楼主| 16777216 发表于 2013-9-11 15:52 | 显示全部楼层
wyq8848 发表于 2013-9-11 14:49
我是这里的实习生,所以不能下载您发的"热电偶“附件,劳驾您将这个附件发我邮箱一份,万分感激!133598987 ...

这个附件里的程序有点问题 你直接百度文库搜索一下就ok了
zlo007 发表于 2013-9-15 17:18 | 显示全部楼层
正打算制作一个温控器
xumch 发表于 2017-4-15 21:05 | 显示全部楼层
还没有权限下载附件。
yzq13246068880 发表于 2020-5-20 16:55 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

399

帖子

1

粉丝