wumin0566 发表于 2012-2-16 13:18:19

AD7705和pt100的使用请教

http://cache.amobbs.com/bbs_upload782111/files_52/ourdev_719319QUU3CT.jpg
pt100和ad7705的原理图 (原文件名:(4Z~FW~08S5]TSFJBEXW6@8.jpg)

我用ad7705测量pt100的温度,想测量的温度在-20度到110度之间,精度在+-0.3,我选ad7705的转换频率为20hz,用自校准和64倍增益,带缓存的模式
u16 AD7705_GetCurVoltageVal(u8 channel)
{
    u16 tmp;
    CS_OUT_LOW();
    AD7705_Writebyte(RD_DATA_REG);
    tmp = AD7705_ReadDword();//读ad数据
    if((tmp==0x0000)||(tmp==0xFFFF))
      gStruAD7705.Error = TRUE;
    CS_OUT_HIGH();
    return (tmp);
}
void AD7705_Event(void)
{
    u8 i;
    int AdValue;
    float temp=0.0;

    WatchDogFeed();                   // 喂狗
    gStruAD7705.CurrentSampleVal=AD7705_GetCurVoltageVal(0);//存放读回的数据

    if(gStruAD7705.Error == TRUE)      // gai
    {
      gStruAD7705.ErrorCnt++;

      if(gStruAD7705.ErrorCnt > 3)
            Process_EnterSysErrorMode();
      else
            AD7705_Initial();

      return;
    }
    else
    {
      gStruAD7705.ErrorCnt = 0;
    }

    if(++gStruAD7705.CurrentSamplePtr >= MAX_SAMPLE_CNT)/*连续一组采样结束*/
    {
      gStruAD7705.CurrentSamplePtr = 0;
    }
    for(i=0;i<MAX_SAMPLE_CNT;i++)
      temp += gStruAD7705.CurrentSampleVal;
    temp -= AD7705_GetMaxVal(gStruAD7705.CurrentSampleVal,MAX_SAMPLE_CNT);
    temp -= AD7705_GetMinVal(gStruAD7705.CurrentSampleVal,MAX_SAMPLE_CNT);
    temp = temp/(MAX_SAMPLE_CNT-2);//去掉最大最小值
    temp-=(-0.0000010053942*temp*temp+0.04551514*temp-104.1201); // 桥路非线性修正
    AdValue=(int)(temp/(float)VAULEPER+(float)TEMPBASE);//VALEPER =2.8469286,TEMPBASE = -550;
       AdValue = (AdValue+5)/10;
    gStruSystem.CurrentTemp.H = AdValue/10;
    gStruSystem.CurrentTemp.L = AdValue%10;
}
u16 AD7705_GetMaxVal(u16 val[],u8 len)
{
    u16 max=val;
    u8 i=0;
    for(i=0;i<len;i++)
      {
            if(val>= max)
                {
                  max=val;
                }
      }
    return max;
}

u16 AD7705_GetMinVal(u16 val[],u8 len)
{
    u16 min=val;
    u8 i=0;
    for(i=0;i<len;i++)
      {
            if(val<=min)
                {
                  min=val;
                }
      }
    return min;
}

代码中ADvalue是读的温度的10倍,,我读回来显示的温度差距太大,温度10几度,我显示的30多度,应该怎么变换这里的公式或者AD的模式怎么改变,求教!!!!

wumin0566 发表于 2012-2-16 13:20:37

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

http://cache.amobbs.com/bbs_upload782111/files_52/ourdev_719322BXF1SC.jpg
这张清楚些 (原文件名:CQ}]9W{Q(}1WY{QU5(H37C8.jpg)

qwerttt 发表于 2012-2-16 14:46:26

2线制的PT100?
程序没细看,你可以先换算成欧姆,然后网上下个软件验证
就知道你是AD换算成欧姆错,还是欧姆换算温度错了

wumin0566 发表于 2012-2-16 16:08:31

回复【2楼】qwerttt
-----------------------------------------------------------------------

公式以前算0-100度的时候可以的,但是我把pt100的电阻换了后,测-20到110度范围的时候,这个公式应该不对,我不知道用哪个公式

marshallemon 发表于 2012-9-28 15:52:55

pt100在负温度时的计算公式和正温度时是不一样的,建议先由桥路计算出RTD的电阻,由电阻再求温度,当然你也可以直接由输出电压直接求温度,这估计需要2阶以上的矩阵求出
页: [1]
查看完整版本: AD7705和pt100的使用请教