本帖最后由 feng2011 于 2011-7-1 22:33 编辑
可能是点错按钮了,刚发就结贴了,重发一下。
请问,一个单片机程序是一个while循环,如果单片机自带的AD采集时间设为远小于一次while循环执行的时间。会不会给AD转换结果造成误差呢? 谢谢!
我用keil MDK软件仿真,第一个while循环转换结果是对的。而后的每一个while循环转换结果都是有误差的,而且是固定的误差。图如下:
源代码:只用了adc0的数据,没有用adc1的数据。
unsigned char flowbiaoti[]={" 流量为:"};
int i=0,j=0,adc0=0,adc1=0,flow=0;
int wan=0,qian=0,bai=0,shi=0,ge=0;
unsigned char rchar[],floww[];
float num[20],total0=0,total1=0,tem=0;
int main ()
{
.......... //一些初始化的配置及其他处理
..........
while(1)
{
Infor_Collection(); //传感器信号采集
}
}
void Infor_Collection(void)
{
while(j<20)
{
ADCCON = 0x7E3; // ADC config: fADC/2, acq. time = 16 clocks => ADC Speed = 1MSPS
while (!ADCSTA){} // 等待转换结束
ADCCP ^=1; // 转换通道
num[j]=(ADCDAT>>16); // 将转换后的数据存入数组
j++;
}
for(j=0;j<20;j+=2)
{
total0+=num[j];
total1+=num[j+1];
}
total0/=10; // 取平均值
total0=total0*2.5/4096;
tem=total0;
adc0=10000*total0; // 取小数点后四位
total1/=10; // 取平均值
adc1=(total1*2.5/4096)*10000; // 取小数点后四位
wan=adc0/10000;
qian=(adc0%10000)/1000;
bai=((adc0%10000)%1000)/100;
shi=(((adc0%10000)%1000)%100)/10;
ge=(((adc0%10000)%1000)%100)%10;
rchar[0]=wan+0x30; //数字与相对应的ASCII码相差
rchar[1]='.';
rchar[2]=qian+0x30;
rchar[3]=bai+0x30;
rchar[4]=shi+0x30;
rchar[5]=ge+0x30;
rchar[6]=0x56;
rchar[7]=' ';
rchar[8]=' ';
rchar[9]=' ';
write(0,rchar,10); // 发送数据到串口
write(0,flowbiaoti,11); // 发送数据到串口
flow=tem*1000/200/0.0502*100; //1L对应输出电压是0.0502mv
qian=flow/1000;
bai=(flow%1000)/100;
shi=((flow%1000)%100)/10;
ge= ((flow%1000)%100)%10;
floww[0]=qian+0x30; //数字与相对应的ASCII码相差
floww[1]=bai+0x30;
floww[2]='.';
floww[3]=shi+0x30;
floww[4]=ge+0x30;
floww[5]='L';
floww[6]='\n';
write(0,floww,7); // 发送数据到串口
total0=0; //将变量清0
total1=0;
tem=0;
flow=0;
}
} |