MCUAVR 发表于 2007-12-21 11:32:48

用MEGA16 AD 测量-20~400°C温度,温度波动大(内有原理图和程序)没找到原因??传感器PT100

我用MEGA16 AD 测量-20~400°C   温度波动较大,有时有6~7°C。我第一次做PT100,搞几天了,没找到原因。那位前辈有这方便的经验,请指点,谢谢了!
参考电压内部2.56V.原理图如下,调试时将-20°C 的阻值输入,输出为0V,输入,将400°C 的阻值输入,输出2.56V.
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_191652.JPG

/********************************************************************
函 原 型:unsigned int filter(unsigned int *p)
功    能:温度AD滤波
说    明:采样10次,去掉最大值和最小值求平均数
涉及变量:P为缓存数组
入口参数:无
出口参数:无
设    计:               日    期:2006-08-10
修    改:               日    期:
***********************************************************************/
unsigned int filter(unsigned int *p)
{

   unsigned int temp;
   
   signed char i;
   
   //p=AD_data;
   for(i=1;i<10;i++)
    {
               if(*(p+i-1)>*(p+i))
                     {
                      temp=*(p+i-1);
                      *(p+i-1)=*(p+i);
                           *(p+i)=temp;
               }
                        
   }       
   for(i=9;i>0;i--)
    {
               if(*(p+i-1)>*(p+i))
                      {
                     temp=*(p+i-1);
                    *(p+i-1)=*(p+i);
                        *(p+i)=temp;
                    }
                        
   }
   
   return ((*(p+1)+*(p+2)+*(p+3)+*(p+4)+*(p+5)+*(p+6)+*(p+7)+*(p+8))/8);

}
/******************************************************************************
功能:温度测量转换
说明:温度段分8段,输入一个AD值,然后计算出温度.步进放大10倍处理
*******************************************************************************/
signed int PT100_Change(unsigned int AD)
{      
      
       signed int tp_temp=0;
      
       if(AD<52)               //基度-20 --0步进2.6
       {
            tp_temp=(20-(AD*10/26))*-1;
       }
       if((AD>=52)&&(AD<180))//基度0 --50步进2.6
       {
            tp_temp=(AD-52)*10/26;
       }
       if((AD>=180)&&(AD<306)) //基度50 --100步进2.5
       {
            tp_temp=(AD-144)*10/25+50;
       }
       if((AD>=306)&&(AD<431)) //基度100 --150 步进2.5
       {
            tp_temp=(AD-306)*10/25+100;   
       }
       if((AD>=431)&&(AD<553)) //基度150 --200 步2.4
       {
            tp_temp=(AD-431)*10/24+150;
       }
       if((AD>=553)&&(AD<674)) //基度200 --250 步进2.4
       {
            tp_temp=(AD-553)*10/24+200;
       }
       if((AD>=674)&&(AD<792)) //基度250 --300 步进2.4
       {
             tp_temp=(AD-674)*10/24+250;
       }
       if((AD>=792)&&(AD<909)) //基度300 --350 步进2.3
       {
            tp_temp=(AD-792)*10/23+300;
       }
       if((AD>=909)&&(AD<1024)) //基度350 ---400 步进2.3
       {
            tp_temp=(AD-909)*10/23+350;
       }

shaozh 发表于 2007-12-21 12:16:56

仔细看看图吧!好像画错啦吧!

_yuming 发表于 2007-12-21 12:23:03

图画错啦


http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_191553.JPG

h82763800 发表于 2007-12-21 12:23:21

好复杂啊,我也在做PT100测温(0-70°),误差也很大,郁闷哪位高手 指导一下啊   给个图让我们参考参考,这里的R67 这么画 放大倍数怎么算?

qkj1575 发表于 2007-12-21 12:50:20

最好不要用内部2.56V参考电压,那个变化大,不准看手册,误差大

chuchu3030 发表于 2007-12-21 12:54:15

基准不准,还有,电路画得不对,我做的,只有1度不稳

chuchu3030 发表于 2007-12-21 12:56:33

uint AdcConvert(void)
{
        uchar j;
    uint Temp_v;
        uint ret;
       uint Temp;
       uint Temp1;
       uint Temp2;
       uint i;
       //Temp=AD_Temp;
        uchar max_id,min_id,max_value,min_value;
for(j=0;j<16;j++)
      { ADMUX=(0x01|ad_channel_1);
       ADCSRA=0xD6;
       ADCSRA|=_BV(ADSC);
       loop_until_bit_is_set(ADCSRA,ADIF);
      
       ADCSRA|=_BV(ADIF);
   
                ret=ADCL;
                ret|=(uint)(ADCH<<8);
                g_aAdValue=ret;
}
ret=0;
        for(j=0;j<16;j++)
        ret+=g_aAdValue;
        //找到最大和最小值索引
        ret/=16;
        max_id=min_id=1;
        max_value=min_value=0;
        for(j=0;j<16;j++)
        {
                if(g_aAdValue>ret)
                {
                        if(g_aAdValue-ret>max_value)
                        {
                                max_value=g_aAdValue-ret;
                                max_id=j;
                        }
                }
                else
                {
                        if(ret-g_aAdValue>min_value)
                        {
                                min_value=ret-g_aAdValue;
                                        min_id=j;
                        }
                }
        }
//去掉第一个和最大最小值后的平均值
        ret=0;
        for(j=0;j<16;j++)
        {
                if((j!=min_id)&&(j!=max_id))
                        ret+=g_aAdValue;
        }
             if(min_id!=max_id)
                  ret/=14;
             else
                  {ret/=15;}
         
        //ADCSRA=0;//关闭ADC

       
       if(((ret<=AD_TempZero)&&ret>=16))                                                                             // 大于等于零度,正温度AD_TempZero=988
               {// Clr_Sensor_Warn;
                       for(i=0;i<=TempMax;i++)                                                                                               //总有350个温度点TempMax=350,根据实际情况而定
                               {
                                       if((ret>=Temperature_Table_b)&&(ret<=Temperature_Table_b))   //实际温度在两个AD值之间
                                               {
                                                       Temp1=g_aAdValue-Temperature_Table_b;   
                                                       Temp2=Temperature_Table_b-g_aAdValue;
                                                       if(Temp1<=Temp2)                                                                                    //判断AD值离上限或者下限那个值更近则实际温度为偏差小的那个值
                                                                {Temp_v=i;}
                                                       else
                                                                {Temp_v=i+1;}
                                                                       
                                                       //if((Temp_v>350)||(Temp_v<0))
                                                               //Temp_v=1000;
                                               }
                               }
               }
    //else
          //   {
                  
         //   Set_Sensor_Warn;                                                                                                 
                // }
    return Temp_v;
   //return ret;
}

zhpowerpcb 发表于 2007-12-21 13:07:16

看看我做的直发器,误差就在2 /3度
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_191592.jpg
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_191593.jpg

MCUAVR 发表于 2007-12-21 13:50:11

是我粗心,电路错了,我已修改了,再试试先/

h82763800 发表于 2007-12-21 17:55:55

7楼的,能弄个原理图吗?

haizhilan 发表于 2007-12-25 16:17:20

我做的PT100多路温度检测精度能够做到0.5左右,方案是:做一个恒流源通过PT100,把PT100这点的电压经过运放放大,送入AD采集,每次采集12个点,进行数字滤波处理。其温度的计算采用了简单的方法:采集的电压的值求出对应的电阻减去100欧姆,然后除以0.39就可以得到温度的值了。

hxlwb 发表于 2007-12-26 16:57:59

我们也有做,很稳的呀。

nicksean 发表于 2007-12-27 13:27:22

只要电路没问题, 关键就是要加数字滤波.

cs1qq 发表于 2010-3-31 10:35:47

回复【10楼】haizhilan 小马哥
我做的PT100多路温度检测精度能够做到0.5左右,方案是:做一个恒流源通过PT100,把PT100这点的电压经过运放放大,送入AD采集,每次采集12个点,进行数字滤波处理。其温度的计算采用了简单的方法:采集的电压的值求出对应的电阻减去100欧姆,然后除以0.39就可以得到温度的值了。
-----------------------------------------------------------------------

小马哥你好,我现在也是做PT100多路温度检测,我是用PIC做主控芯片的,可以把你做的那个PT100多路温度检测系统发给我参考一下么?我的邮箱是cs1qq@163.com,谢谢哦

czhongli 发表于 2010-4-1 12:41:50

回复【13楼】cs1qq
-----------------------------------------------------------------------

记下

encrytotion 发表于 2010-4-11 14:48:08

czhongli,
请把电路图给我发一份吧,谢谢!我的邮箱:encrytotion@163.com

gxy508 发表于 2010-4-11 16:18:57

mark

ouravrwoai 发表于 2010-5-12 19:48:43

回复【10楼】haizhilan 小马哥
-----------------------------------------------------------------------

小马哥,多路温度检测系统电路能给我一份吗,谢谢,我邮箱:cangqiongwl2009@163.com

xiaowu191 发表于 2010-6-21 12:05:35

关注

anxiangbo 发表于 2010-7-30 13:56:53

记号

master5888 发表于 2010-7-30 14:01:03

mark

cuikai12345 发表于 2010-7-30 19:55:09

mark

dengxiaofeng 发表于 2011-1-6 09:54:02

呵呵呵呵

tingbin 发表于 2011-1-6 10:29:48

回复【楼主位】MCUAVR
-----------------------------------------------------------------------

用过采样,把AD分辨率扩展到16位,把PT00的基准弄个好点的,我用的是430内部的12位AD,做出来很稳啊

lzx996 发表于 2011-1-6 11:02:42

标记学习

D.lovers 发表于 2011-4-12 21:59:01

标志,正在整PT100测温

522yt 发表于 2011-4-17 21:42:30

学习

pengknight 发表于 2011-4-22 01:32:59

mark

jhjkdz 发表于 2013-11-22 10:04:22

学习。。。
页: [1]
查看完整版本: 用MEGA16 AD 测量-20~400°C温度,温度波动大(内有原理图和程序)没找到原因??传感器PT100