ADC的存储

[复制链接]
2365|16
 楼主| pinghpu 发表于 2013-5-28 18:10 | 显示全部楼层 |阅读模式
求教各位大侠:ADC采集5次后存放在数组里A[5]里,为什么第一次循环从A[1]开始存储,第二次循环从A[0]开始存储。第一次存储在A[1]/A[2]/A[3]/A[4],A[0]为0,之后存储为A[0]/A[1]/A[2]/A[3]/A[4],
这是什么原因?
grasswolfs 发表于 2013-5-28 18:34 | 显示全部楼层
你是说手册里面这样写的么?还是你自己这样应用的?
dzguang 发表于 2013-5-28 19:52 | 显示全部楼层
你自己看看自己的代码。
mmuuss586 发表于 2013-5-28 21:29 | 显示全部楼层
 楼主| pinghpu 发表于 2013-5-28 22:00 | 显示全部楼层
grasswolfs 发表于 2013-5-28 18:34
你是说手册里面这样写的么?还是你自己这样应用的?

我这样子用,Samplesize=5;
Sampletim=0;
    for(;Sampletim<Samplesize;)
     {   if(flagdma==1)
         {  SampleEach[Sampletim][n]=temp;
            Sample[Sampletim]+=temp;
            flagdma=0;
         }
         if(flagtim2==1)
         {
           Sampletim=Sampletim+1;
           flagtim2=0;
         }
         
     }


下面是dma中断返回temp
  if(DMA_GetFlagStatus(DMA1_FLAG_TC1))
  {
    DMA_ClearITPendingBit(DMA1_IT_TC1);//清除标志位
   for(i=0;i<2;i++)
    {
     result+=ADC1_Value;
    }
     result=result>>1;
     temp =(float)(((unsigned long)result)*3317/4096);
     result=0;
     n++;
  }
  flagdma=1;
 楼主| pinghpu 发表于 2013-5-28 22:01 | 显示全部楼层
dzguang 发表于 2013-5-28 19:52
你自己看看自己的代码。

tim2定义了采样时长
 楼主| pinghpu 发表于 2013-5-28 22:14 | 显示全部楼层
mmuuss586 发表于 2013-5-28 21:29


第二次执行代码

第二次执行代码
这是第一次执行,Sample[0]为0,

第一次执行代码

第一次执行代码
这是第二次执行
grasswolfs 发表于 2013-5-29 09:28 | 显示全部楼层
pinghpu 发表于 2013-5-28 22:14
这是第一次执行,Sample[0]为0,
这是第二次执行

显然是第一次定时DMA中断早于AD采样DMA返回数据呗
 楼主| pinghpu 发表于 2013-5-30 09:36 | 显示全部楼层
grasswolfs 发表于 2013-5-29 09:28
显然是第一次定时DMA中断早于AD采样DMA返回数据呗

这个原因真没想到。怎么让DMA中断和AD同步呢?
grasswolfs 发表于 2013-5-30 11:05 | 显示全部楼层
pinghpu 发表于 2013-5-30 09:36
这个原因真没想到。怎么让DMA中断和AD同步呢?

不知道你TIM2定时是怎么写的,反正肯定是第一次flagtim2==1早于flagdma==1,增加tim2延时,或者看看初始化的时候是不是先开定时,后开AD的
 楼主| pinghpu 发表于 2013-5-30 15:36 | 显示全部楼层
grasswolfs 发表于 2013-5-30 11:05
不知道你TIM2定时是怎么写的,反正肯定是第一次flagtim2==1早于flagdma==1,增加tim2延时,或者看看初始 ...

tim2定时是2000us,AD的采样周期为6.75us,按道理不会flagtim2早于flagdma呀?
hkcj 发表于 2013-5-30 19:08 | 显示全部楼层
问题看来还是没有解决   楼主   帮你顶一个   看看别人的意见   应该会有高手帮忙解决的   顶起来
hkcj 发表于 2013-5-30 19:08 | 显示全部楼层
作为电子工程师   其实就是需要静下心来  慢慢调试   早晚能够出来的  相信自己   呵呵
grasswolfs 发表于 2013-5-31 11:00 | 显示全部楼层
你把这段注释掉试一下        if(flagtim2==1)
         {
           Sampletim=Sampletim+1;
           flagtim2=0;
         }
 楼主| pinghpu 发表于 2013-5-31 16:37 | 显示全部楼层
grasswolfs 发表于 2013-5-31 11:00
你把这段注释掉试一下        if(flagtim2==1)
         {
           Sampletim=Sampletim+1;

多谢指点。是定时器2 的设置,使能后就进入一次中断,Sampletim加1。
开始因为循环第二次就正常,我一直把问题放在DMA和ADC上,总找不到错误。
多谢多谢!
grasswolfs 发表于 2013-5-31 17:30 | 显示全部楼层
pinghpu 发表于 2013-5-31 16:37
多谢指点。是定时器2 的设置,使能后就进入一次中断,Sampletim加1。
开始因为循环第二次就正常,我一直 ...

嗯,其实这样的问题也是常见的,解决了就好~
hkcj 发表于 2013-5-31 21:06 | 显示全部楼层
问题应该解决了不  楼主  继续帮你顶一个
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

30

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部