|
![]()
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[gStruAD7705.CurrentSamplePtr]=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[0];
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[0];
u8 i=0;
for(i=0;i<len;i++)
{
if(val<=min)
{
min=val;
}
}
return min;
}
代码中ADvalue是读的温度的10倍,,我读回来显示的温度差距太大,温度10几度,我显示的30多度,应该怎么变换这里的公式或者AD的模式怎么改变,求教!!!! |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|