打印

关于ntc测量温度的问题

[复制链接]
9025|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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采样

UINT16 Get_ADC(void) 
{
  
    UINT16         Temp;
        ADC_RES   = 0;            //清除结果
        ADC_RESL  = 0;
        ADC_CONTR &= ~(0x01<<5);    //清flag
    ADC_CONTR |= 0x68;          //通道0 全速  开始转换      
    while (1)                 //等待A/D转换结束
    {
        if (ADC_CONTR & 0x10)  //0001,0000 测试A/D转换结束否
        {  
                         break;
                }
    }
    ADC_CONTR &= ~(0x01<<5);    //清flag  
        Temp = ((UINT16)ADC_RES)<<8 | ((UINT16)ADC_RESL);         
    return   Temp; //返回 A/D 10 位转换结果



这个是采样与温度转换的程序
UINT16 Get_Temp(void)
{
    UINT8 n, temp_zheng;
        UINT16 ad_temp;
        FP32 temp_xiao;
        UINT16 temp = 0;
        ad_temp = Get_ADC();
        while(1)
        {
                if ((ad_temp >= AD_Tab[n]) && (ad_temp <= AD_Tab[n+1]))
        {
            temp_zheng = n;
                        temp_xiao =        (1.0*(ad_temp - AD_Tab[n]))/(AD_Tab[n+1] - AD_Tab[n]);
                        temp = temp_zheng*100 + temp_xiao*100.0;
            return temp;
        }
        n++;
        if (n>110)
        {
            return 20000;
        }
        }
这个是主函数
void DispNowTemp(UINT16 j)
{

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

main()
{
        P3M1 |= 0x01 << 2;
    //P2M0 |= 0x01 << 5;
        P1M0 |= 0XF9;
        P1M1 = 0X01;        
        sei();
        LCD_start();
        InitADC();
        while(1)
        {
                ADTemp = Get_Temp();
                DispNowTemp(ADTemp);
        //LCD_write_num(1,1,ADTemp);
        //LCD_clear();
        }


这个是采样ad
UINT16 code AD_Tab[111]={ 131, 
138,
144,
151,
157,
164,
172,
179,
187,
194,
202,
210,
219,
227,
236,
245,
254,
263,
272,
282,
291,
301,
311,
321,
331,
341,
352,
362,
372,
382,
393,
403,
414,
424,
435,
445,
456,
466,
477,
487,
497,
507,
518,
528,
538,
548,
558,
568,
577,
587,
596,
606,
615,
624,
633,
642,
651,
659,
668,
676,
684,
692,
700,
708,
715,
723,
730,
737,
744,
751,
758,
764,
771,
777,
783,
789,
795,
801,
806,
812,
817,
822,
828,
832,
837,
842,
847,
851,
855,
860,
864,
868,
872,
876,
879,
883,
887,
890,
893,
897,
900,
903,
906,
909,
911,
914,
917,
919,
922,
924,
927};






热电偶.rar (51.1 KB)







相关帖子

沙发
16777216|  楼主 | 2013-5-4 21:42 | 只看该作者

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

使用特权

评论回复
评论
水稻生产型 2013-5-5 20:56 回复TA
全职家丁 77wx.org/read/115/index.html 
板凳
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采样,分辨率才会高。

使用特权

评论回复
5
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么

使用特权

评论回复
6
cauhorse| | 2013-5-5 22:10 | 只看该作者
“精度”就呵呵了,“显示分辨率”可以用过采样的方式折腾一下,10bit是可以整出来的。

使用特权

评论回复
7
16777216|  楼主 | 2013-5-6 07:59 | 只看该作者
cauhorse 发表于 2013-5-5 22:10
“精度”就呵呵了,“显示分辨率”可以用过采样的方式折腾一下,10bit是可以整出来的。 ...

怎么折腾呢  

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

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

精度我就要求1度 分辨率是10  就是要求液晶上能显示0.1递增在温度缓慢升高的情况下

使用特权

评论回复
8
gx_huang| | 2013-5-6 08:44 | 只看该作者
有些地方理论0.1度分辨率,实际0.4度,程序或者硬件肯定有问题的。
用12bit ADC,可以实现0.1度分辨率。
如果是10bit,即使过采样,如果本底噪声不大,无法实现0.1度分辨率。

使用特权

评论回复
9
wangyy608| | 2013-5-6 08:51 | 只看该作者
提高采样速度,连续采样多次相加当一个值,滑动平均

使用特权

评论回复
10
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 很给力! 真是太感谢你了 确实这里错了 .
11
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度”步进式的测量,且测量值在温度恒定时很稳定。

使用特权

评论回复
评论
16777216 2013-5-7 22:47 回复TA
嗯 有空试试 
12
coody| | 2013-5-8 11:00 | 只看该作者
到底是NTC还是PT1000?

使用特权

评论回复
13
ahpuhts| | 2013-8-3 18:39 | 只看该作者
学习学习,

使用特权

评论回复
14
wyq8848| | 2013-9-11 14:49 | 只看该作者
我是这里的实习生,所以不能下载您发的"热电偶“附件,劳驾您将这个附件发我邮箱一份,万分感激!13359898765@163.com

我是个菜鸟,刚学习单片机,正打算制作一个温控器,精度0.5就可以,希望能得到您的帮助!祝您万事如意。

使用特权

评论回复
15
16777216|  楼主 | 2013-9-11 15:52 | 只看该作者
wyq8848 发表于 2013-9-11 14:49
我是这里的实习生,所以不能下载您发的"热电偶“附件,劳驾您将这个附件发我邮箱一份,万分感激!133598987 ...

这个附件里的程序有点问题 你直接百度文库搜索一下就ok了

使用特权

评论回复
16
zlo007| | 2013-9-15 17:18 | 只看该作者
正打算制作一个温控器

使用特权

评论回复
17
xumch| | 2017-4-15 21:05 | 只看该作者
还没有权限下载附件。

使用特权

评论回复
18
yzq13246068880| | 2020-5-20 16:55 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

399

帖子

1

粉丝