打印

请教AD转换的程序问题

[复制链接]
2950|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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;
  }
}

仿真图.jpg (30.28 KB )

仿真图.jpg

相关帖子

沙发
liang7143| | 2011-7-1 20:33 | 只看该作者
采样未完成 数据一般都是 不对的

使用特权

评论回复
板凳
feng2011|  楼主 | 2011-7-1 20:42 | 只看该作者
2# liang7143

嗯嗯~ 如果每次循环只是进行一个单次的软件启动转换,那么说结果就不会受while循环影响咯。   奇怪的是,我用keil MDK软件仿真,第一个while循环转换结果是对的。而后的每一个while循环转换结果都是有误差的,而且是固定的误差。

使用特权

评论回复
地板
linkasp| | 2011-7-1 22:14 | 只看该作者
上一个源码 分析一下哦!!

使用特权

评论回复
5
linkasp| | 2011-7-1 22:15 | 只看该作者
请查看 。
变量清零了没。

使用特权

评论回复
6
feng2011|  楼主 | 2011-7-1 22:31 | 只看该作者
5# linkasp

嗯,几经清了。

使用特权

评论回复
7
feng2011|  楼主 | 2011-7-1 22:31 | 只看该作者
4# linkasp

嗯嗯

使用特权

评论回复
8
linkasp| | 2011-7-2 12:35 | 只看该作者
请问你是 什么单片机哦
是 16位吗?
ADCDAT 是 16位的?

使用特权

评论回复
9
linkasp| | 2011-7-2 12:53 | 只看该作者
数组 都这样 清零试试!
void clr_num()
{
  unsigned char i;
  for(i=0;i<20;i++)
   {
     num[i]=0;
   }
}

其他 数组也这样操作!

使用特权

评论回复
10
feng2011|  楼主 | 2011-7-2 15:31 | 只看该作者
8# linkasp

是32位的ARM7,不懂操作系统,当单片机用。 :lol

使用特权

评论回复
11
feng2011|  楼主 | 2011-7-2 15:35 | 只看该作者
9# linkasp

非常感谢您。

问题解决了,真是羞死人了:后来不得不单步调试发现关键是变量j没清0,而数组也没清0.所以从第二次循环开始的数据都是残存在数组里的第一次转换结果,事实上只进行了一次的AD转换。把j清0后就正常了。 :$

使用特权

评论回复
12
linkasp| | 2011-7-2 18:21 | 只看该作者
:lol
解决了 就好!!
工作了吗?】
加QQ群:22694599

使用特权

评论回复
13
feng2011|  楼主 | 2011-7-2 21:27 | 只看该作者
12# linkasp

嗯,好的。    还在学校呆着。

使用特权

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

本版积分规则

1

主题

49

帖子

1

粉丝