[技术求助] AD采集数据不稳定怎么回事

[复制链接]
5019|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 );
}









本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 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信号
nigx 发表于 2017-8-1 11:25 | 显示全部楼层
1) 最好有示波器测试的波形
2) 初步看你的时序不符合要求吧。仿真的红色是CS还是conv?cs应该是23个时钟吧,conv应该是21,你的不是。
 楼主| qmmdzd 发表于 2017-8-1 13:10 | 显示全部楼层
nigx 发表于 2017-8-1 11:25
1) 最好有示波器测试的波形
2) 初步看你的时序不符合要求吧。仿真的红色是CS还是conv?cs应该是23个时 ...

时钟周期只要够20个就可以,CS在开始前置低了,到最后再置高,这应该没问题吧,COV时钟是从1到21,后面空些时钟我感觉没太大影响
 楼主| qmmdzd 发表于 2017-8-1 13:11 | 显示全部楼层
现在采集100个点大约有十几个坏点,我程序中没有取极值滤波,是不是应该加一下滤波呢?
airwill 发表于 2017-8-2 20:45 | 显示全部楼层
滤波,  是个解决异常数据的方法.
不过, 这个办法不能解决问题, 最多只是躲着点
如果异常数据很多, 那么这个办法就无效了
你应该优先寻找导致异常的原因
shoushou1 发表于 2017-8-3 10:28 | 显示全部楼层
学习了
 楼主| qmmdzd 发表于 2017-8-3 13:32 | 显示全部楼层
airwill 发表于 2017-8-2 20:45
滤波,  是个解决异常数据的方法.
不过, 这个办法不能解决问题, 最多只是躲着点
如果异常数据很多, 那么这 ...

可是至今我没找到问题出在哪里
 楼主| qmmdzd 发表于 2017-8-3 13:33 | 显示全部楼层
nigx 发表于 2017-8-4 21:42 | 显示全部楼层
既然人家没有提示你多输出时钟,你为什么要多输出,而且自我感觉没有问题。

真正的开发感觉是 你应先输出21个时钟时序,再看数据是否还是合理的。
 楼主| qmmdzd 发表于 2017-8-5 09:27 | 显示全部楼层
nigx 发表于 2017-8-4 21:42
既然人家没有提示你多输出时钟,你为什么要多输出,而且自我感觉没有问题。

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

我改过了,并没有用,数据还是不稳定
airwill 发表于 2017-8-5 09:33 | 显示全部楼层
也可能是时序问题, 你的软件在时钟信号下降沿后马上读取端口, 可能 芯片的数据还没有来得及输出信号, 或者信号还没有稳定呢, 试试加个延迟时间进去
 楼主| qmmdzd 发表于 2017-8-15 10:38 | 显示全部楼层
调了好几天没找到问题所在,现在速度只能到300K,远达不到接近1M的目标,我还是换硬件SPI吧
shenmu2012 发表于 2017-8-15 18:53 | 显示全部楼层
这个跟时钟有关系的
vivilzb1985 发表于 2017-8-15 21:58 | 显示全部楼层
这个对IO端口的配置是非常详细的。
firstblood 发表于 2017-8-16 20:54 | 显示全部楼层
这个跟ad的参考电压的稳定性相关系的。
firstblood 发表于 2017-8-16 20:55 | 显示全部楼层
多采集些数据的,利用软件算法进行处理的就可以;
uiint 发表于 2017-8-16 23:18 | 显示全部楼层
不稳定是外部信号干扰
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

93

帖子

0

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