大家好:在使用AD7357时,单通道输出不准确和采样频率提高后数据采样不准确

大家好,我在使用AD7357时候,参照的推荐电路AD8138+OP177+AD7357的电路,采集10k~1MHz信号,遇到以下问题:环境(STM32F429+AD+SPI+DMA)

1. 这款AD7357芯片能够使用SPI的方式传输采集的数据吗?

1. 使用标准正弦信号通入SDATA_A中,输出采样数据为,这个波形的差分信号波形。意思也是,只有将采集的相邻两个数据分开然后形成两组数据,最后绘制为一对差分正弦信号;正确的应该是一个标准的正弦波吧?

2.在两个通道的输入都为100K正弦信号,在SDATA_B通道输出两路信号采集数据。当使用DMA+SPI的通信速度为1.4MHz采集数据时,能够输出正常数据,但是当SPI的通信速度为2.8MHz时,数据就完全不正确了,但是数据范围正确的0~16383,请问什么原因导致的呢

  • 1. AD7357芯片能够使用SPI的方式传输采集的数据.

    2. 请用示波器检查AD7357查分输入引脚上,VINA+, VINA−; VINB+, VINB−是否为正常的正弦波波形?

    3. 请用示波器同时抓AD7357数据接口/CS, SCLK, SDATAA, SDATAB的波形,检查时序是否正确?

  •    谢谢您的回复

    1. VINA+, VINA−; VINB+, VINB−中A的波形存在较大的失真,B的波形还好;CS,SCLK,SDATAA,SDATAB波形满足要求;

    2. AD7357芯片资料上说明sclk_max=80MHz,但现在提供2.8MHz不能收集到数据,可能是程序上的问题;

          请帮我看看我的程序设计思路:首先定义一个数组变量(data[500]),然后SPI设置为双线只接收模式,和使能SPI+DMA存储功能,最后设置DMA传输完成中断,并在中断服务函数中打印出500个采集数据;

    主要程序如下:

            SPIx_Init();                                                                                              //SPI初始化

            GPIO_SetBits(AD_CS_GPIO_PORT,AD_CS_PIN);                                      //CS置1

            Rheostat_DMA_Mode_Config();                                                               //DMA初始化

            DMAxx_NVIC();                                                                                       //DMA中断配置

            DMA_ITConfig(RHEOSTAT_ADC_DMA_STREAM,DMA_IT_TC,ENABLE );  //传输完成中断使能

            MyDMA_Enable(RHEOSTAT_ADC_DMA_STREAM,numlength);                //使能DMA

            SPI_I2S_DMACmd (AD_SPI,SPI_I2S_DMAReq_Rx,ENABLE);                  //SPI_DMA功能使能

           

            while @@@@@@@@

            {                

                    GPIO_ResetBits(AD_CS_GPIO_PORT,AD_CS_PIN);                       //CS置0                  

                             Delay(5);                                  

                   

                    SPI_Cmd(AD_SPI, ENABLE);                                                         //SPI开启       

                                 data=SPIx_ReadWriteByte();                                          //产生16个周期的读取数据

                    SPI_Cmd(AD_SPI, DISABLE);                                                       //SPI关闭

                        Delay(140);                                                               //延时时间稍长,为的是让CS=1前,关闭SPI,否则CS=1与sck有重合

                    GPIO_SetBits(AD_CS_GPIO_PORT,AD_CS_PIN);                          //CS置1

                        Delay(5);                                                                  

            }

    ///////////////////////////中断服务函数//////////////////////////////////

            void DMA1_Stream0_IRQHandler(void) 

           {       

                     for (j=numlength;j>1;j--)

                  {       

                    printf("%d\n",ADC_ConvertedValue[j]);

                  }

                   DMA_ClearITPendingBit(DMA1_Stream0,DMA_IT_TCIF0);         //清除完成中断标志位

           }

    3. AD7357芯片是不是不能够将CS一直拉低,然后在有sclk的情况下,输出SDATA_A+SDATA_B的数据呢?

         所以在程序中我采用将先CS=0,开启spi,执行16个周期语句,关闭spi,延时函数(此处一定要加延时,不然会有sclk与CS重合),CS=1;最后循环上过程才能产生数据;