打印
[技术求助]

AD采集数据不稳定怎么回事

[复制链接]
4059|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qmmdzd|  楼主 | 2017-8-1 10:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

void ADC_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStructure;
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD, ENABLE);

  /*!< Configure  pins: SCK */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  /*!< Configure pins: MOSI */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  /*!< Configure CS_PIN pin:  CS pin */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  /*!< Configure NOUSE_PIN pin: NOUSE pin */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  /*!< Configure SPI_ADC_SPI pins: RD/CONST */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

    /*!< Configure pins: MISO  SDOA SDOB*/
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  /* Deselect the FLASH: Chip Select high */
  CS_HIGH();
  RDCO_LOW();

}

void ADC_SendData(u32 data)//??SPI??
{
  u8 i;
        CS_LOW();
  SCK_L();
  RDCO_LOW();
  SCK_H();   
  RDCO_HIGH();
// NOUSE_L();
  for(i=0;i<23;i++)
  {  
         
         if(i>0)
        {
        if(data & 0x80000000)  //ÅжϷ¢ËÍ×î¸ßλ   
     SDI_H();        //           
    else
     SDI_L();       //
    data <<= 1;            //×óÒÆÅ×ÆúÒѾ­Êä³öµÄ×î¸ßλ
        }                           
        SCK_L();
        if(i==0)        RDCO_LOW();
   if(i>0) NOUSE_L();
        SCK_H();                                       
   }
}
u32 ADC_Read_ONE_Data()
{
  u32 i;
  u32 data=0,date=0;
   CS_LOW();
  SCK_L();
  RDCO_LOW();          
  SCK_H();
  RDCO_HIGH();
  NOUSE_L();//???,?????
  for(i=0;i<20;i++)
  {  
         
         if(i>0)
        {
     SDI_L();

        data=data|SDOA();
        date=date|SDOB();
        data=data<<1;
        date=date<<1;
               
        }                           
        SCK_L();
        if(i==0)        RDCO_LOW();
    if(i>0) {NOUSE();NOUSE_L(); }
        SCK_H();                                       
   }
   data=data>>4;
   data=data&0x0ffff;
         date=date>>4;
   date=date&0x0ffff;
         data=data<<16;
         data=data|date;
   return data;
}

void ADC_Read_ALL_Data(u32 number)
{
   u16 i;
   for(i=0;i<number;i++)
   {
                   value=ADC_Read_ONE_Data();
                  valueA=value>>16;
                  valueB=value&0x0000ffff;
                  
   }
}
void  ADC_Init()
{

        CS_LOW(); //Ƭѡ
        Delay( 200 );
        ADC_SendData(0x10020000);//ADC1
        ADC_SendData(0x03ff0000);
        ADC_SendData(0x10050000);//ADC2
        ADC_SendData(0x03ff0000);//
        ADC_SendData(0x10200000);//

        SCK_L();
           Delay( 200 );
}









74PA_TBFG2XWG`)T92IB0X9.png (83.55 KB )

ADS8363半时钟模式时序图

ADS8363半时钟模式时序图

相关帖子

沙发
qmmdzd|  楼主 | 2017-8-1 10:12 | 只看该作者
本帖最后由 qmmdzd 于 2017-8-1 10:16 编辑

芯片是ADS8363,采用的是模拟SPI的方式,半时钟差分输入

使用特权

评论回复
板凳
xyz549040622| | 2017-8-1 10:16 | 只看该作者
描述不全面,ad数据不稳,数据读出来是什么情况,哪个应该是数据脚的波形,不稳差距在哪,还需要详细的描述

使用特权

评论回复
地板
qmmdzd|  楼主 | 2017-8-1 10:23 | 只看该作者
通道给1.65V的信号,采集出来的数据有1.23,1.67,1.65,1.41,1.89这些值,有正确的值也有错误的数,相间出现。上面的模拟信号第一行是CLOCK,第二行为CONVST/RD(两个引脚绑定在了一起),第三行为SDI信号

使用特权

评论回复
5
nigx| | 2017-8-1 11:25 | 只看该作者
1) 最好有示波器测试的波形
2) 初步看你的时序不符合要求吧。仿真的红色是CS还是conv?cs应该是23个时钟吧,conv应该是21,你的不是。

使用特权

评论回复
6
qmmdzd|  楼主 | 2017-8-1 13:10 | 只看该作者
nigx 发表于 2017-8-1 11:25
1) 最好有示波器测试的波形
2) 初步看你的时序不符合要求吧。仿真的红色是CS还是conv?cs应该是23个时 ...

时钟周期只要够20个就可以,CS在开始前置低了,到最后再置高,这应该没问题吧,COV时钟是从1到21,后面空些时钟我感觉没太大影响

使用特权

评论回复
7
qmmdzd|  楼主 | 2017-8-1 13:11 | 只看该作者
现在采集100个点大约有十几个坏点,我程序中没有取极值滤波,是不是应该加一下滤波呢?

使用特权

评论回复
8
airwill| | 2017-8-2 20:45 | 只看该作者
滤波,  是个解决异常数据的方法.
不过, 这个办法不能解决问题, 最多只是躲着点
如果异常数据很多, 那么这个办法就无效了
你应该优先寻找导致异常的原因

使用特权

评论回复
9
shoushou1| | 2017-8-3 10:28 | 只看该作者
学习了

使用特权

评论回复
10
qmmdzd|  楼主 | 2017-8-3 13:32 | 只看该作者
airwill 发表于 2017-8-2 20:45
滤波,  是个解决异常数据的方法.
不过, 这个办法不能解决问题, 最多只是躲着点
如果异常数据很多, 那么这 ...

可是至今我没找到问题出在哪里

使用特权

评论回复
11
qmmdzd|  楼主 | 2017-8-3 13:33 | 只看该作者

程序有问题

使用特权

评论回复
12
nigx| | 2017-8-4 21:42 | 只看该作者
既然人家没有提示你多输出时钟,你为什么要多输出,而且自我感觉没有问题。

真正的开发感觉是 你应先输出21个时钟时序,再看数据是否还是合理的。

使用特权

评论回复
13
qmmdzd|  楼主 | 2017-8-5 09:27 | 只看该作者
nigx 发表于 2017-8-4 21:42
既然人家没有提示你多输出时钟,你为什么要多输出,而且自我感觉没有问题。

真正的开发感觉是 你应先输出 ...

我改过了,并没有用,数据还是不稳定

使用特权

评论回复
14
airwill| | 2017-8-5 09:33 | 只看该作者
也可能是时序问题, 你的软件在时钟信号下降沿后马上读取端口, 可能 芯片的数据还没有来得及输出信号, 或者信号还没有稳定呢, 试试加个延迟时间进去

使用特权

评论回复
15
qmmdzd|  楼主 | 2017-8-15 10:38 | 只看该作者
调了好几天没找到问题所在,现在速度只能到300K,远达不到接近1M的目标,我还是换硬件SPI吧

使用特权

评论回复
16
shenmu2012| | 2017-8-15 18:53 | 只看该作者
这个跟时钟有关系的

使用特权

评论回复
17
vivilzb1985| | 2017-8-15 21:58 | 只看该作者
这个对IO端口的配置是非常详细的。

使用特权

评论回复
18
firstblood| | 2017-8-16 20:54 | 只看该作者
这个跟ad的参考电压的稳定性相关系的。

使用特权

评论回复
19
firstblood| | 2017-8-16 20:55 | 只看该作者
多采集些数据的,利用软件算法进行处理的就可以;

使用特权

评论回复
20
uiint| | 2017-8-16 23:18 | 只看该作者
不稳定是外部信号干扰

使用特权

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

本版积分规则

8

主题

93

帖子

0

粉丝