精华内容
下载资源
问答
  • AD7606串行程序

    2018-03-15 17:09:00
    AD7606串行程序,c语言 与单片机的串行通讯,内含程序和相关文档
  • AD7606代码

    2014-07-22 13:16:06
    AD7606代码,SPI及总线模式下读写各通道的操作模式。
  • ad7606模块8通道,ad7606模块程序并行方式采集
  • ad7606的verilog实现

    热门讨论 2014-04-17 15:39:07
    基于verilog的ad7606多通道数据采样实现,支持串口,RAM数据存储
  • AD采样及读取程序

    2013-12-26 12:04:48
    运用DSP28335集成AD采样,然后读取,各种功能寄存器配置,可自己设计的开发板上已实现工程需要,下载下来直接可以用,编译无错误。
  • 8通道,16位AD转换芯片AD7606使用Verilog实现,调试完成,可用
  • AD7606读取逻辑,并行16位模式

    千次阅读 2019-08-07 11:42:42
    初态:CONVSTAB高,CS高,RESET低,RD高 开始 复位一次 ...读取V1通道的值 RD拉高 for(i=0;i<7;i++) { 延时20ns RD拉低 延时10ns 读取Vi通道的值 延时20ns RD拉高 } RD拉高 CS拉高 CONVSTAB拉高 ...

    初态:CONVSTAB高,CS高,RESET低,RD高
    开始
    复位一次
    CONVSTAB转换信号
    等待忙
    CS拉低
    RD拉低
    等待FRSDATA==高电平
    读取V1通道的值
    RD拉高
    for(i=0;i<7;i++)
    {
    延时20ns
    RD拉低
    延时10ns
    读取Vi通道的值
    延时20ns
    RD拉高
    }
    RD拉高
    CS拉高
    CONVSTAB拉高

    展开全文
  • AD7606调试过程与源码

    千次阅读 多人点赞 2019-08-02 18:28:08
    公司有一个项目用到了AD7606,控制器用的STM32,使用的模式是并行16位模式,程序刷好之后发现读取AD数据乱码,结果发现是因为AD7606的接地不对,当然这个问题是我师傅找出来的,查找的过程如下: 用示波器看了BUSY...

    公司有一个项目用到了AD7606,控制器用的STM32,使用的模式是并行16位模式,程序刷好之后发现读取的AD数据乱码,结果发现是因为AD7606的接地不对,当然这个问题是我师傅找出来的,查找的过程如下:
    用示波器看了BUSY线,转换线等各种线的波形,目的是确定芯片是否正常工作。
    师傅又测量了V1通道两端的波形,在没有给输入的情况下发现存在波形。
    后面师傅又去看了下手册,发现V1通道需要接AGND,基准电压接地脚同样要接AGND,但是在电路中,V1与V8通道与基准电压接地脚的地线都分开了,通道接到了24V地,基准接到了3V3,所以导致读取的数据乱码。
    原因就是地线分开了。

    #include "delay.h"     //.C文件
    #include "ad7606.h"
    #include "dac.h"
    
    void AD7606_reset(void);
    void AD7606_startConv(void);
    u16 AD7606_readFirstData(void);
    
    /************************************************
    函数名称 : AD7606_config
    功    能 : 初始化AD7606引脚
    参    数 : 无
    返 回 值 : 无
    *************************************************/
    void AD7606_config(void)
    {
        GPIO_InitTypeDef GPIO_initStructure;
        
        RCC_APB2PeriphClockCmd(AD7606_PORT_RCC,ENABLE);  		//开启AD7606引脚时钟
        
        GPIO_initStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;		//16位数据端输入
        GPIO_initStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_initStructure.GPIO_Pin = AD7606_DATA_PORT;
        
        GPIO_Init(AD7606_DATA_GPIOx,&GPIO_initStructure);
        
        GPIO_initStructure.GPIO_Pin = AD7606_FRST_PORT;     //FRST引脚配置,浮空输入
        GPIO_Init(AD7606_FRST_GPIOx,&GPIO_initStructure);
        
        GPIO_initStructure.GPIO_Pin = AD7606_BUSY_PORT;	//BUSY引脚,浮空输入
        GPIO_Init(AD7606_BUSY_GPIOx,&GPIO_initStructure);
        
        GPIO_initStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出方式
        
        GPIO_initStructure.GPIO_Pin = AD7606_RANGE_PORT;    //RANGE配置
        GPIO_Init(AD7606_RANGE_GPIOx,&GPIO_initStructure);
        
        GPIO_initStructure.GPIO_Pin = AD7606_OS0_PORT;    //过采样引脚配置
        GPIO_Init(AD7606_OS0_GPIOx,&GPIO_initStructure);
        
        GPIO_initStructure.GPIO_Pin = AD7606_OS1_PORT;
        GPIO_Init(AD7606_OS1_GPIOx,&GPIO_initStructure);
        
        GPIO_initStructure.GPIO_Pin = AD7606_OS2_PORT;
        GPIO_Init(AD7606_OS2_GPIOx,&GPIO_initStructure);
        
        GPIO_initStructure.GPIO_Pin = AD7606_CONAB_PORT;   //转换配置
        GPIO_Init(AD7606_CONAB_GPIOx,&GPIO_initStructure);
        
        GPIO_initStructure.GPIO_Pin = AD7606_RST_PORT;    //复位
        GPIO_Init(AD7606_RST_GPIOx,&GPIO_initStructure);
        
        GPIO_initStructure.GPIO_Pin = AD7606_RD_PORT;    //RD
        GPIO_Init(AD7606_RD_GPIOx,&GPIO_initStructure);
        
        GPIO_initStructure.GPIO_Pin = AD7606_CS_PORT;    //CS
        GPIO_Init(AD7606_CS_GPIOx,&GPIO_initStructure);
        
        AD7606_RANGE_10V();
        AD7606_CS_HIGH();
        AD7606_RST_LOW();
        AD7606_RD_HIGH();
        AD7606_CONAB_HIGH();
        
        AD7606_SampleRate(AD7606_SAMPLE_200K);
    }
    
    /**
     @brief 设置AD7606采样频率
     @param -sampleRate-   AD7606_SAMPLE_200K: 采样频率200kHz \n
                           AD7606_SAMPLE_100K: 采样频率100kHz \n
                           AD7606_SAMPLE_50K:  采样频率50kHz \n
                           AD7606_SAMPLE_25K:  采样频率25kHz \n
                           AD7606_SAMPLE_12K5: 采样频率12.5kHz \n
                           AD7606_SAMPLE_6K25: 采样频率6.25kHz \n
                           AD7606_SAMPLE_3K125:采样频率3.125kHz \n
    */
    void AD7606_SampleRate(u8 sampleRate)
    {
        switch(sampleRate)
        {
            case AD7606_SAMPLE_200K:	//采样频率200kHz
                AD7606_OS0_LOW();
                AD7606_OS1_LOW();
                AD7606_OS2_LOW();
            break;
            
            case AD7606_SAMPLE_100K:	//采样频率100kHz
                AD7606_OS0_HIGH();
                AD7606_OS1_LOW();
                AD7606_OS2_LOW();
            break;
            
            case AD7606_SAMPLE_50K:	//采样频率50kHz
                AD7606_OS0_LOW();
                AD7606_OS1_HIGH();
                AD7606_OS2_LOW();
            break;
            
            case AD7606_SAMPLE_25K:	//采样频率25kHz
                AD7606_OS0_HIGH();
                AD7606_OS1_HIGH();
                AD7606_OS2_LOW();
            break;
            
            case AD7606_SAMPLE_12K5:	//采样频率12.5kHz
                AD7606_OS0_LOW();
                AD7606_OS1_LOW();
                AD7606_OS2_HIGH();
            break;
            
            case AD7606_SAMPLE_6K25:	//采样频率6.25kHz
                AD7606_OS0_HIGH();
                AD7606_OS1_LOW();
                AD7606_OS2_HIGH();
            break;
            
            case AD7606_SAMPLE_3K125:	//采样频率3.125kHz
                AD7606_OS0_LOW();
                AD7606_OS1_HIGH();
                AD7606_OS2_HIGH();
            break;
            
            default:
                AD7606_OS0_LOW();	//采样频率200kHz
                AD7606_OS1_LOW();
                AD7606_OS2_LOW();
            break;
        }
    }
    
    /**
     @brief AD7606读取转换值
     @param -data- 8个16位元素的数组,用来存储8通道转换值。参数为数组首地址。
     @return 0: 转换成功 \n
            其他值: 转换失败
     @warning data数组的长度必须大于等于8
    */
    u8 AD7606_readConversionValue(u16 *data)
    {
        u8 i;
        u16 counter;
    		static uint8_t a=1;
        GPIO_InitTypeDef GPIO_initStructure;
        
        GPIO_initStructure.GPIO_Mode = GPIO_Mode_IPU;  //AD7606数据输出端引脚配置,上拉输入模式
        GPIO_initStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_initStructure.GPIO_Pin = AD7606_DATA_PORT;
        
        GPIO_Init(AD7606_DATA_GPIOx,&GPIO_initStructure);
        
        AD7606_CS_RD_HIGH();   //CS\RD引脚配置为高电平
        if(a==1)
    		{
    			a=0;
          AD7606_reset();     //复位信号
        }
        i = AD7606_BUSY_STATE();    //判断BUSY
        
        AD7606_startConv();    //转换信号
        
        counter = 0;
        i = AD7606_BUSY_STATE();   //判断BUSY
        while(i)
        {
            i = AD7606_BUSY_STATE();   //判断BUSY
            //delay_us(0);
            counter ++;
            if(counter > 50000)    //判断超时
                return 1;
        }
        
        AD7606_CS_LOW();    //CS拉低
        
        i = AD7606_FRST_STATE();    //判断FRST
        AD7606_RD_HIGH();     //RD下降沿,V1通道开始转换
    		delay_us(1);
        AD7606_RD_LOW();
        
        delay_us(2);
        
        counter = 0;
        i = AD7606_FRST_STATE();    //判断FRST
        while(!i)
        {
            //delay_us(1);
            i = AD7606_FRST_STATE();     //判断FRST
            counter ++;
            if(counter > 50000)   //判断超时
                return 2;
        }
        
        data[0] = AD7606_READ_DATA();     //V1通道数据传入data中
        
        AD7606_RD_HIGH();      //---------AD7606_RD_HIGH
        
        for(i=1;i<=7;i++)
        {
            delay_us(2);
            AD7606_RD_LOW();    //RD下降沿数据转换完
    
            delay_us(2);
            data[i] = AD7606_READ_DATA();   //读取数据
            //data[i] = ((data[i] & 0xff) << 8) + (data[i] >> 8);
    
    //        data[i] = GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_15)  |
    //              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_14) << 1 |
    //              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_13) << 2 |
    //              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_12) << 3 |
    //              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_11) << 4 |
    //              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_10) << 5 |
    //              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_9) << 6 |
    //              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_8) << 7 |
    //              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_7) << 8 |
    //              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_6) << 9 |
    //              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_5) << 10 |
    //              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_4) << 11 |
    //              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_3) << 12 |
    //              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_2) << 13 |
    //              GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_1) << 14 |
    //                GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_0) << 15;
    
            delay_us(2);
            AD7606_RD_HIGH();    //--------
        }
        
        AD7606_CS_HIGH();
        AD7606_CONAB_HIGH();     //用于判定
        return 0;
    }
    /************************************************
    函数名称 : AD7606_reset
    功    能 : 复位AD7606
    参    数 : 无
    返 回 值 : 无
    *************************************************/
    void AD7606_reset(void)
    {
        AD7606_RST_HIGH();
        delay_us(1);
        AD7606_RST_LOW();
        delay_us(1);
    }
    /************************************************
    函数名称 : AD7606_startConv
    功    能 : 转换信号
    参    数 : 无
    返 回 值 : 无
    *************************************************/
    void AD7606_startConv(void)
    {
    	  AD7606_CONAB_HIGH();
    	  delay_us (2);
        AD7606_CONAB_LOW();
        delay_us(2);
        AD7606_CONAB_HIGH();
        //delay_us(1);
    }
    
    
    #ifndef _AD7606_H_
    #define _AD7606_H_
    
    #include "stm32f10x.h"
    
    #define     AD7606_PORT_RCC     RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOB     //时钟引脚
    #define     AD7606_DATA_GPIOx   GPIOD     //数据引脚
    #define     AD7606_DATA_PORT    GPIO_Pin_All
    
    #define     AD7606_FRST_GPIOx   GPIOB     //FRST
    #define     AD7606_FRST_PORT    GPIO_Pin_3
    
    #define     AD7606_BUSY_GPIOx   GPIOB     //BUSY
    #define     AD7606_BUSY_PORT    GPIO_Pin_4
    
    #define     AD7606_RANGE_GPIOx  GPIOB     //RANGE
    #define     AD7606_RANGE_PORT   GPIO_Pin_8
    
    #define     AD7606_OS0_GPIOx    GPIOB      //OS0
    #define     AD7606_OS0_PORT     GPIO_Pin_2
    
    #define     AD7606_OS1_GPIOx    GPIOB      //OS1
    #define     AD7606_OS1_PORT     GPIO_Pin_1
    
    #define     AD7606_OS2_GPIOx    GPIOB      //OS2
    #define     AD7606_OS2_PORT     GPIO_Pin_0
    
    #define     AD7606_CONAB_GPIOx  GPIOB        //CONAB
    #define     AD7606_CONAB_PORT   GPIO_Pin_9
    
    #define     AD7606_RST_GPIOx    GPIOB      //RST
    #define     AD7606_RST_PORT     GPIO_Pin_7
    
    #define     AD7606_RD_GPIOx     GPIOB     //RD
    #define     AD7606_RD_PORT      GPIO_Pin_6
    
    #define     AD7606_CS_GPIOx     GPIOB     //CS
    #define     AD7606_CS_PORT      GPIO_Pin_5
    
    #define     AD7606_CS_HIGH()        GPIO_SetBits(AD7606_CS_GPIOx,AD7606_CS_PORT)    //CS高电平
    #define     AD7606_CS_LOW()         GPIO_ResetBits(AD7606_CS_GPIOx,AD7606_CS_PORT)   //CS低电平                           
    
    #define     AD7606_RST_HIGH()       GPIO_SetBits(AD7606_RST_GPIOx,AD7606_RST_PORT)    //RST高
    #define     AD7606_RST_LOW()        GPIO_ResetBits(AD7606_RST_GPIOx,AD7606_RST_PORT)   //RST低
    
    #define     AD7606_RD_HIGH()        GPIO_SetBits(AD7606_RD_GPIOx,AD7606_RD_PORT)
    #define     AD7606_RD_LOW()         GPIO_ResetBits(AD7606_RD_GPIOx,AD7606_RD_PORT)
    
    #define     AD7606_RANGE_10V()      GPIO_SetBits(AD7606_RANGE_GPIOx,AD7606_RANGE_PORT)    //范围正负10
    #define     AD7606_RANGE_5V()       GPIO_ResetBits(AD7606_RANGE_GPIOx,AD7606_RANGE_PORT)   //5V
                /*******转换信号*****************************************/
    #define     AD7606_START_CONV()     do{GPIO_SetBits(AD7606_CONAB_GPIOx,AD7606_CONAB_PORT);\
                                            GPIO_ResetBits(AD7606_CONAB_GPIOx,AD7606_CONAB_PORT);\
                                            delay_us(1);\
                                            GPIO_SetBits(AD7606_CONAB_GPIOx,AD7606_CONAB_PORT);}while(0)
    
    #define     AD7606_OS0_HIGH()       GPIO_SetBits(AD7606_OS0_GPIOx,AD7606_OS0_PORT)   //过采样
    #define     AD7606_OS0_LOW()        GPIO_ResetBits(AD7606_OS0_GPIOx,AD7606_OS0_PORT)
    
    #define     AD7606_OS1_HIGH()       GPIO_SetBits(AD7606_OS1_GPIOx,AD7606_OS1_PORT)
    #define     AD7606_OS1_LOW()        GPIO_ResetBits(AD7606_OS1_GPIOx,AD7606_OS1_PORT)
    
    #define     AD7606_OS2_HIGH()       GPIO_SetBits(AD7606_OS2_GPIOx,AD7606_OS2_PORT)
    #define     AD7606_OS2_LOW()        GPIO_ResetBits(AD7606_OS2_GPIOx,AD7606_OS2_PORT)
    
    #define     AD7606_CONAB_HIGH()     GPIO_SetBits(AD7606_CONAB_GPIOx,AD7606_CONAB_PORT)    //转换
    #define     AD7606_CONAB_LOW()      GPIO_ResetBits(AD7606_CONAB_GPIOx,AD7606_CONAB_PORT)
    
    #define     AD7606_READ_DATA()      GPIO_ReadInputData(AD7606_DATA_GPIOx)
    
    #define     AD7606_BUSY_STATE()     GPIO_ReadInputDataBit(AD7606_BUSY_GPIOx,AD7606_BUSY_PORT)
    #define     AD7606_FRST_STATE()     GPIO_ReadInputDataBit(AD7606_FRST_GPIOx,AD7606_FRST_PORT)
    
    #define     AD7606_CS_RD_LOW()      AD7606_CS_LOW();AD7606_RD_LOW()
    #define     AD7606_CS_RD_HIGH()      AD7606_CS_HIGH();AD7606_RD_HIGH()
                                          
    
    #define     AD7606_SAMPLE_200K      0    //过采样200K
    #define     AD7606_SAMPLE_100K      1    //过采样100K
    #define     AD7606_SAMPLE_50K       2    //过采样50K
    #define     AD7606_SAMPLE_25K       3    //过采样25K
    #define     AD7606_SAMPLE_12K5      4    //过采样12.5K
    #define     AD7606_SAMPLE_6K25      5    //过采样6.25K
    #define     AD7606_SAMPLE_3K125     6    //过采样3.125K
    
    #define     AD7606_VOLT_0V5         1638
    #define     AD7606_VOLT_3V3         10813
    #define     AD7606_VOLT_3V5         11469
    
    
    void AD7606_config(void);    //AD7606初始化
    void AD7606_SampleRate(u8 sampleRate);   
    u8 AD7606_readConversionValue(u16 *data);   //数据读取函数
    
    #define     AD7606_1LSB_VOLT        0.00030518   //最小精度
    
    #endif
    
    
    展开全文
  • STM32F407-基于AD7606进行多路数据采集

    千次阅读 多人点赞 2020-11-10 15:54:49
    当PAR/SER/BYTE SEL = 1且DB15/BYTE SEL = 0时,AD7606工作在串行接口模式。当PAR/SER/BYTE SEL = 1且DB15/BYTE SEL= 1时,AD7606工作在并行字节接口模式。 2.10 V1-V6 模拟输入,此引脚为单端模拟输入,此通道的模拟...

    1.原理图

    2.管脚定义

    2.1 OS2,OS1,OS0

    查阅数据手册

     这三个管脚组合控制过采样模式。

    • 000 表示无过采样,最大 200Ksps 采样速率。
    • 001 表示 2 倍过采样, 也就是硬件内部采集 2 个样本求平均。
    • 010 表示 4 倍过采样, 也就是硬件内部采集 4 个样本求平均。
    • 011 表示 8 倍过采样, 也就是硬件内部采集 8 个样本求平均。
    • 100 表示 16 倍过采样, 也就是硬件内部采集 16 个样本求平均。
    • 101 表示 32 倍过采样, 也就是硬件内部采集 32 个样本求平均。
    • 110 表示 64 倍过采样, 也就是硬件内部采集 64 个样本求平均。

    过采样倍率越高,ADC 转换时间越长,可得到的最大采样频率就越低。

    2.2 CONVSTA/B

    转换开始输入A和转换开始输入B。逻辑输入。这些逻辑输入用来启动模拟输入通道转换。要对所有输入通道同时采样,可以将CONVST A和CONVSTB短接在一起,并施加一个转换开始信号。或者,可以用CONVST A启动以下通道的同步采样:AD7606的V1、V2、V3和V4;AD7606-6的V1、V2和V3;AD7606-4的V1和V2。可以用CONVSTB启动对其它模拟输入通道的同步采样:AD7606的V5、V6、V7和V8;AD7606-6的V4、V5和V6;AD7606-4的V3和V4。这只有在过采样未开启时才可行。当CONVST A或CONVSTB引脚从低电平变为高电平时,相应模拟输入的前端采样保持电路被设置为保持。这两个管脚可以并联,我用的AD7606-6,其中CONVSTA 决定 1-3 通道,CONVSTB 决定 4-6 通道。2 个信号可以错开短暂的时间。 这里只用到了5个输入通道。

    2.3 RANGE

    模拟输入范围选择。逻辑输入。此引脚的极性决定模拟输入通道的输入范围。如果此引脚与逻辑高电平相连,则所有通道的模拟输入范围为±10 V。如果此引脚与逻辑低电平相连,则所有通道的模拟输入范围为±5 V。此引脚的逻辑状态改变会立即影响模拟输入范围。对于快速吞吐速率应用,转换期间建议不要更改此引脚的逻辑状态。详细信息请参见"模拟输入"部分。我用的板子设计的是用VDRIVE控制,VDRIVE为高电平就表示用的10V量程。

    2.4 ADRD :

    读信号。选择并行接口时为并行数据读取控制输入(RD)/选择串行接口时为串行时钟输入(SCLK)。在并行模式下,如果CS和RD均处于逻辑低电平,则会启用输出总线。在串行模式下,此引脚用作数据传输的串行时钟输入。CS下降沿使数据输出线路DourA和DouB脱离三态,并逐个输出转换结果的MSB。SCLK上升沿将随后的所有数据位逐个送至串行数据输出DouA和DouB。

    2.5 ADRESET:

    复位信号。当设置为逻辑高电平时,RESET上升沿复位AD7606/AD7606-6/AD7606-4。器件应该在上电后收到一个RESET脉冲。RESET高脉冲宽度典型值为50ns。如果在转换期间施加RESET脉冲,转换将中断。如果在读取期间施加RESET脉冲,输出寄存器的内容将复位至全0。

    2.6 ADBUSY :

    忙信号。CONVST A和CONVST B均达到上升沿之后,此引脚变为逻辑高电平,表示转换过程已开始。BUSY输出保持高电平,直到所有通道的转换过程完成为止。BUSY下降沿表示转换数据正被锁存至输出数据寄存器,经过时间t,之后便可供读取。在BUSY为 高电平时执行的数据读取操作应当在BUSY下降沿之前完成。当BUSY信号为高电平时,CONVST A或CONVST B的上升沿不起作用。

    2.7 ADCS :

    片选信号。此低电平有效逻辑输入使能数据帧传输。在并行模式下,如果CS和RD均处于逻辑低电平,则会使能输出总线DB[15:0],使转换结果输出在并行数据总线上。在串行模式下,利用Cs使能串行数据帧传输,并逐个输出串行输出数据的最高有效位(MSB)。

    2.8 FRSTDATA

    数字输出。FRSTDATA输出信号指示何时在并行、字节或串行接口上回读第-通道V1。当CS输入为高电平时,FRSTDATA输 出引脚处于三态。CS下降沿使FRSTDATA脱离三态。在并行模式下,与V1结果相对应的RD下降沿随后将FRSTDATA引脚设为高电平,表示输出数据总线可以提供V1的结果。在RD的下一个下降沿之后,FRSTDATA输出恢复逻辑低电平。在串行模式下,FRSTDATA在CS下降沿变为高.电平,因为此时将在DourA上输出V1的MSB。在CS 下降沿之后的第16个SCLK下降沿,它恢复低电平。

    2.9 DB0-DB15 

    数据总线。

    并行输出数据位DB6至DB0:

    当PAR/SER/BYTE SEL = 0时,这些引脚充当三态并行数字输入/输出引脚。当PARCS和RD均处于低电平时,这些引脚用来输出转换结果的DB6至DB0。当PAR/SER/BYTE SEL = 1时,这些引脚应与AGND相连。当工作在并行字节接口模式时,DB[7:0]通 过2个RD操作输出16位转换结果。DB7(引脚24)为MSB,DB0为LSB。逻辑电源输入。此引脚的电源电压(2.3 V至5.25 V)决定逻辑接口的工作电压。此引脚的标称电源与主机接口(即DSP和FPGA)电源相同。


    并行输出数据位7(DB7)/串行接口数据输出引脚(DouA):
    当PAR/SER/BYTE SEL = 0时,此引脚充当三态并行数字输入/输出引脚。当CS和RD均处于低电平时,此引脚用来输出转换结果的DB7。当PAR/SER/BYTE SEL= 1时,此引脚用作DouA,并输出串行转换数据,当工作在并行字节模式时,DB7为该字节的MSB。

     

    并行输出数据位8(DB8)/串行接口数据输出引脚DO_B):

    当PAR/SER/BYTESEL= 0时,此引脚充当三态并行数字输入/输出引脚。当CS和RD均处于低电平时,此引脚用来输出转换结果的DB8。当PAR/SER/BYTE SEL= 1时,此引脚用作Dou B,并输出串行转换数据。


    并行输出数据位DB13至DB9:

    当PAR/SER/BYTESEL= 0时,这些引脚充当三态并行数字输入/输出引脚。当CS和RD均处于低电平时,这些引脚用来输出转换结果的DB13至DB9。当PAR/SER/BYTESEL= 1时,这些引脚应与AGND相连。


    并行输出数据位14 (DB14)/高字节使能(HBEN):

    当PAR/SER/BYTE SEL = 0时,此引脚充当三态并行数字输出引脚。当CS和RD均处于低电平时,此引脚用来输出转换结果的DB14。当PAR/SER/BYTE SEL = 1且DB15/BYTESEL = 1时,AD7606/ AD7606-6/AD7606-4.工作在并行字节接口模式。在并行字节模式下,HBEN引脚用来选择是首先输出转换结果的高字节(MSB)还是低字节(LSB)。当HBEN= 1时,首先输出MSB,然后输出LSB。当HBEN= 0时,首先输出LSB,然后输出MSB。

     

    并行输出数据位15(DB15)/并行字节模式选择(BYTESEL):

     当PAR/SER/BYTE SEL = 0时,此引脚充当三态并行数字输出引脚。当CS和RD均处于低电平时,此引脚用来输出转换结果的DB15。当PAR/SER/BYTESEL= 1时,BYTE SEL引脚用来在串行接口模式与并行字节接口模式之间做出选择。当PAR/SER/BYTE SEL = 1且DB15/BYTE SEL = 0时,AD7606工作在串行接口模式。当PAR/SER/BYTE SEL = 1且DB15/BYTE SEL= 1时,AD7606工作在并行字节接口模式。

    2.10 V1-V6

    模拟输入,此引脚为单端模拟输入,此通道的模拟输入范围由 RANGE 引脚决定。

     

    3. 时序图

    3.1 转换时序

    t5:

    CONVST A 和 CONVST B 上升沿之间最大允许的延迟时间。一般是用一根控制线同时控制CONVST A 和 CONVST B,因此可以不用管这个时间。

    t3 :

    最短的 CONVST A/B 电平脉冲,最小值 25ns。

    t4 :

    BUSY 下降沿到 CS 下降沿设置时间,最小值 0ns,所以可以忽略。

    tCYCLE:

    并行模式,无过采样,转换后并读取数据的最大值是 5us,即最高支持的时钟速度是 20MHz 及其以上。

    tCONV :

    转换时间。

    3.2 驱动时序

     

    t8 :

    CS 到 RD 的设置时间,最小值是 0ns,可以忽略。

    t10 :

    RD 读信号的低电平脉冲宽度,通信电压不同,时间不同。对于 STM32 来说,FMC 通信电平一般是3.3V,即最小值 21ns。

    t11 :

    RD 高电平脉冲宽度,最小值 15ns。

    t9 :

    CS 到 RD 保持时间,最小值 0ns,可以忽略。

     

    4.配置过程

    4.1 IO配置

    void AD7606_CtrlLinesConfig(void)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;
    
    	/* 使能FSMC时钟 */
    	RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);
    
    	/* 使能 GPIO时钟,数据总线 */
    	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOG, ENABLE);
    
    	//7管脚GPIOD
    	GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FSMC);
    	GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FSMC);
    	GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FSMC);
    	GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_FSMC);
    	GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FSMC);
    	GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FSMC);
    	GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FSMC);
    	GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FSMC);
    	GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FSMC);
    
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 |
    																GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10  | GPIO_Pin_14 | 
    																GPIO_Pin_15;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    	GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
    	GPIO_Init(GPIOD, &GPIO_InitStructure);
    	
    	GPIO_PinAFConfig(GPIOE, GPIO_PinSource4 , GPIO_AF_FSMC);
    	GPIO_PinAFConfig(GPIOE, GPIO_PinSource5 , GPIO_AF_FSMC);
    	GPIO_PinAFConfig(GPIOE, GPIO_PinSource7 , GPIO_AF_FSMC);
    	GPIO_PinAFConfig(GPIOE, GPIO_PinSource8 , GPIO_AF_FSMC);
    	GPIO_PinAFConfig(GPIOE, GPIO_PinSource9 , GPIO_AF_FSMC);
    	GPIO_PinAFConfig(GPIOE, GPIO_PinSource10 , GPIO_AF_FSMC);
    	GPIO_PinAFConfig(GPIOE, GPIO_PinSource11 , GPIO_AF_FSMC);
    	GPIO_PinAFConfig(GPIOE, GPIO_PinSource12 , GPIO_AF_FSMC);
    	GPIO_PinAFConfig(GPIOE, GPIO_PinSource13 , GPIO_AF_FSMC);
    	GPIO_PinAFConfig(GPIOE, GPIO_PinSource14 , GPIO_AF_FSMC);
    	GPIO_PinAFConfig(GPIOE, GPIO_PinSource15 , GPIO_AF_FSMC);
    
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |
    	                            GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 |
    	                            GPIO_Pin_15;
    	GPIO_Init(GPIOE, &GPIO_InitStructure);
    
    	{
    		RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOE, ENABLE);
    
    		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    		GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    		GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
    
    		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
    		GPIO_Init(GPIOD, &GPIO_InitStructure);
    
    		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    		GPIO_Init(GPIOE, &GPIO_InitStructure);
    		
    		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
    		GPIO_Init(GPIOF, &GPIO_InitStructure);
    	}
    }

    4.2 FSCM访问时序

    AD7606规格书要求(3.3V时):RD读信号低电平脉冲宽度最短21ns,高电平脉冲最短宽度15ns。

     按照如下配置读数均正常。为了和同BANK的配置相同,选择3-0-6-1-0-0
            3-0-5-1-0-0 : RD高持续75ns, 低电平持续50ns.  1us以内可读取8路样本数据到内存。
            1-0-1-1-0-0 : RD高75ns,低电平执行12ns左右,下降沿差不多也12ns.  数据读取正确。

    采用A模式

    	fsmcStructure.FSMC_AddressSetupTime = 3;
    	fsmcStructure.FSMC_AddressHoldTime = 0;
    	fsmcStructure.FSMC_DataSetupTime = 6;
    	fsmcStructure.FSMC_BusTurnAroundDuration = 1;
    	fsmcStructure.FSMC_CLKDivision = 0;
    	fsmcStructure.FSMC_DataLatency = 0;
    	fsmcStructure.FSMC_AccessMode = FSMC_AccessMode_A;
    	init.FSMC_Bank = FSMC_Bank1_NORSRAM4;
    	init.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
    	init.FSMC_MemoryType = FSMC_MemoryType_SRAM;
    	init.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
    	init.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
    	init.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
    	init.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
    	init.FSMC_WrapMode = FSMC_WrapMode_Disable;
    	init.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
    	init.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
    	init.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
    	init.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
    	init.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
    
    	init.FSMC_ReadWriteTimingStruct = &timing;
    	init.FSMC_WriteTimingStruct = &timing;
    
    	FSMC_NORSRAMInit(&init);
    
    	FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);

    4.3 过采样配置

    void AD7606_SetOS(uint8_t _ucOS) 
    { 
    g_tAD7606.ucOS = _ucOS; 
    switch (_ucOS) 
    { 
    case AD_OS_X2: 
    OS2_0(); 
    OS1_0(); 
    OS0_1(); 
    break; 
    case AD_OS_X4: 
    OS2_0(); 
    OS1_1(); 
    OS0_0(); 
    break; 
    case AD_OS_X8:
    OS2_0(); 
    OS1_1(); 
    OS0_1(); 
    break; 
    case AD_OS_X16: 
    OS2_1(); 
    OS1_0(); 
    OS0_0(); 
    break; 
    case AD_OS_X32: 
    OS2_1(); 
    OS1_0(); 
    OS0_1(); 
    break; 
    case AD_OS_X64: 
    OS2_1(); 
    OS1_1(); 
    OS0_0(); 
    break; 
    case AD_OS_NO: 
    default: 
    g_tAD7606.ucOS = AD_OS_NO; 
    OS2_0(); 
    OS1_0(); 
    OS0_0(); 
    break; 
    } 
    } 

    4.4 复位函数

    void AD7606_Reset(void)
    {
    	RESET_0();	/* 退出复位状态 */
    
    	RESET_1();	/* 进入复位状态 */
    	RESET_1();	/* 仅用于延迟。 RESET复位高电平脉冲宽度最小50ns。 */
    	RESET_1();
    	RESET_1();
    
    	RESET_0();	/* 退出复位状态 */
    }

    4.5 开启转换

    void AD7606_StartConvst(void)
    {
    	CONVST_0();
    	CONVST_0();
    	CONVST_0();
    
    	CONVST_1();
    }
    

    4.6 读取函数

    void AD7606_ReadNowAdc(void)
    {
    	g_tAD7606.sNowAdc[0] = AD7606_RESULT();	/* 读第1路样本 */
    	g_tAD7606.sNowAdc[1] = AD7606_RESULT();	/* 读第2路样本 */
    	g_tAD7606.sNowAdc[2] = AD7606_RESULT();	/* 读第3路样本 */
    	g_tAD7606.sNowAdc[3] = AD7606_RESULT();	/* 读第4路样本 */
    	g_tAD7606.sNowAdc[4] = AD7606_RESULT();	/* 读第5路样本 */
    }

     

     

     

    展开全文
  • DSP28335与AD7606通过SPI的串行数据交互

    万次阅读 2016-11-25 17:35:35
    弄了三天的DSP28335与AD7606的通信终于实现了。最终的方案是通过DSP28335控制AD7606的采样,采集的数据通过SPI串口发送给28335,然后28335通过串口发送给上位机显示。 其实程序第一天就写好了,但是一直读不出AD...

    弄了三天的DSP28335与AD7606的通信终于实现了。最终的方案是通过DSP28335控制AD7606的采样,采集的数据通过SPI串口发送给28335,然后28335通过串口发送给上位机显示

    其实程序第一天就写好了,但是一直读不出AD7606采集到的数据,所以后两天主要是调试。

    对于程序员来说,调试是最重要的能力,也还最考验人的耐心的,因为很小的细节出错就可能导致意想不到的结果,而且明明感觉是对的东西,有时确是错误的。

    下面就说下这个调试过程。

    首先程序是一部分一部分的实现的,这样的话容易定位出错的模块,首先实现的是DSP与上位机的串口通信,这个在上篇的博客中有说明。

    另一个模块即是DSP控制AD7606的采样与通信。AD7606购买的是一个模块,外围的电路已经设计好,各功能引脚已经引出,而且给出了STM32与AD7606的控制程序,但这个程序只是用于STM32,而且中间的设置及寄存器配置都是根据STM32来的,所以说要用到28335上需要大量的修改。所以还是相当于从头来写,因为程序的框架可以按照给的程序来写,所以还是节省了许多的工作。不过写好之后发现上位机什么也没有显示。之后漫长的调试过程就来了。

    既然读不到数据,首先想到的是SPI的控制是不是有问题,利用DSP28335自有的SPI回环测试功能测试了一下,又修改了下SPI的配置,但是还是没有数据。之后想确认下是否执行了SPI中断程序,发现SPI的中断程序没有执行,但是可以进入外部中断程序,这个外部中断程序是由AD7606的BUSY引脚产生的,当启动转换的时候BUSY会变成高电平,转换完成后又变成低电平。这个过程中间有个下降沿,利用此下降沿产生中断然后开始读取转换后的数据。说明AD7606工作了,且完成了转换。但是通过观察DSP的SPI接收寄存器中一直没有数据。

    之后跟着程序,参照数据手册走了一遍程序,确定程序逻辑上是没有问题的。怀疑SPI的时钟有没有输出,一些引脚的电平是否输出正确,因此用示波器观察了各引脚的电平(某一时间内电平固定的引脚),都是期望的电平。想观察下AD7606的数据引脚有数据输出没,奈何没有逻辑分析仪,用示波器观察不了(频率太快,也不是一直都有输出,示波器的干扰又大),而作罢。

    上网查找AD7606与DSP28335的相关资料,看了一些别人的资料没有找到需要的。其实上网查找的过程中还是发现了许多的资料,包括ADI公司完整的包括AD7606的应用、控制程序、外围电路的设计资料等,不要小看无意间的一句话,也许某句话也就点醒了你,所以遇到问题的时候可以多看别人遇到了什么问题、怎么解决的。这可以节省大量的时间。但是不能一味的求助别人,要自己多想。


    数据手册是一个重要的资料,关键点一定要明确。

    控制芯片的时候要多注意这些关键点,因为有一个地方不对,结果就出现不了。(要特别注意),对照自己的程序,根据时序图看一下,是否满足各方面的要求,包括延时、信号的先后顺序等。

    在不同的时钟频率下,同一个延时函数,延时是不一样的,所以移植程序的时候也要注意这点。

     

    在我的这个程序中,其实读不出数据的最主要的一个问题还是SPI配置的问题,因为控制发送功能的寄存器中有一位是开启增强功能模式,就是可以使用FIFO,而默认情况下是不能使用FIFO的,因为想着不使用DSP的发送功能,所以直接把发送功能的配置给删除了,而忘记了这位,所以读取不出。而在回环测试的时候是对的,是因为回环测试的时候要开启发送功能。

    这个问题的发现是想着重新写下代码,看书核对配置的时候偶然在发送寄存器中看到有一位是控制开启增强模式的。所以理不清的时候,不妨重新来过。(下策)

     (也曾怀疑过硬件的问题,如果没有解决的话,下步应该是在STM32上跑下。不过硬件因为是买的现成的模块,出问题的概率不大)

     此次调试总结

    首先核对硬件连接是否正确,包括供电,接地,参考电平,时钟等,然后需要检查寄存器配置是否正确,再逐渐调试软件(首先跟着程序的流程走一遍,确认是否有明显的失误。然后可设置断点、标志位、观察某一变量的值、内存的值等),仔细研究时序图,这才是正确方法。另外就需要耐心与细心。
    展开全文
  • 部分代码设计 (末尾附文件) `timescale 1ns / 1ps ///////////////////////...// Module Name: ad7606 ////////////////////////////////////////////////////////////////////////////////// module ad7606( input
  • AD7606八通道AD采集模块测试

    千次阅读 多人点赞 2020-05-04 16:22:42
    购买到的AD7606八通道AD转换模块可以用于各种实验。本文就该模块的基本性能进行测试。 简介 相应的资料可以在AD7606百度网盘下载,提取文件密码:6f5g. https://pan.baidu.com/s/1i4HIJvn 密码: 6f5g ...
  • ad7606

    千次阅读 2014-07-23 22:27:33
    AD7606读取过程是首先要用mcu发一个convst信号给AD7606,然后AD7606转换完毕后,会发出一个busy信号通知单片机此时再启动spi去读取采样之后的值。值得注意的是在用串口读取的时候,MSB DB15是在CS的下降沿输出的,...
  • AD7606是16位多通道同步采样芯片,可以处理±10V和±5V的真双极性输入信号,并最大支持200kSPS的吞吐速率采样,特别适合于电力系统中正弦波电压电流的采样。 别看AD7606是64-LQFP的封装,多达64脚,但其配置、使用...
  • fpga实现ad7606八通道同步采集并行输出

    千次阅读 热门讨论 2019-12-10 10:00:02
    verilog代码: 在这里插入代码片
  • ad7606-51单片机例程

    2017-10-20 16:40:30
    AD7606芯片的51单片机C程序例程,(包含串行SPI总线驱动、8通道数据采集转换方式等)
  • STM32F103ZET与AD7606模块数据采集例程-FSMC和SPI模式两种连接方式
  • AD7606数据采集程序+STM32

    热门讨论 2017-04-13 07:55:18
    AD7606+SPI+stm32。
  • AD7606 Verilog HDL教程

    2016-03-03 09:31:18
    AD7606 数据转换的veriolg hdl 语言描述与详解
  • AD7606应用笔记

    2021-06-30 09:06:58
    @[TOC](文章目录) 由于训练电赛,需要选取一块测量速度快,精度更高速度更快的外部ADC,所以选了一块AD...AD7606 SPI的串行接口接线图: AD7606 16位并口接线图: 由这两张图可见除了必须要连接的一些控制线一样之.
  • 自编AD7606程序(SPI通讯)

    热门讨论 2014-04-02 10:36:15
    int main(void) { //System Clocks Configuration SystemInit(); SCL_IO_Init(); SCL_SPI_Init(); //CAN Configuration SCL_CAN_Init(); EXIT_Configuration(); SCL_IO_DefaultValue();...}
  • FPGA+AD7606并行8通道采集源Verilog程序,FPGA+AD7606并行8通道采集源Verilog程序,FPGA+AD7606并行8通道采集源Verilog程序,FPGA+AD7606并行8通道采集源Verilog程序,FPGA+AD7606并行8通道采集源Verilog程序,FPGA+...
  • AD7606时序分析与verilog HDL实现

    千次阅读 2020-04-23 10:33:13
    AD7606是16位,8/6/4通道同步采样模数转换芯片,各器件内置模拟输入钳位保护,二阶抗混叠滤波器,跟踪保持放大器,16位点荷再分配逐次逼近式模数转换器。 其中: CONVST:启动转换信号 busy:转换完成信号 cs:片选信号...
  • AD7606分析讲解

    万次阅读 2018-06-13 14:47:44
    一、ad7606数据手册分析引脚配置和功能描述 ADC7606的典型工作特性 FFT(快速傅里叶变换): http://azaleasays.com/2008/10/17/fft-and-digital-signal-processing/INL/DNL(积分非线性/微分非线性): ...
  • AD7606调试笔记

    千次阅读 2021-06-29 21:14:02
    文章目录AD7606接线图AD7606SPI通讯接口说明AD7606时序图AD7606时序图讲解AD7606 STM32引脚配置AD7606 程序模块遇到的问题以及总结 由于训练电赛,需要选取一块测量速度快,精度更高速度更快的外部ADC,所以选了一块...
  • AD7606的使用【Stm32F4】

    千次阅读 2021-02-02 21:32:15
    AD7606的使用 【Stm32F4】
  • AD7606是一款采样率最高200ksps、8通道、16位AD芯片,可使用8080并口、按字节并口、SPI串行等方式读取AD转换的原始数据。 实验时使用的是安富莱的AD7606模块。 各引脚的作用: OS2/OS1/OS2 : 组合状态选择过...
  • 基于Xilinx Spartan-7 FPGA实现AD7606-8接口

    千次阅读 2020-08-03 00:07:12
    3)AD7606的数字接口可以配置在并行或串行模式。串行模式为SPI接口进行数据采集读取,并行模式为传统的并行总线(数据总线16位),本文是基于并行模式进行ADC接口逻辑设计。 2 逻辑设计 基于FPGA实现AD7606接口...
  • ad7606与stm32连接电路介绍

    千次阅读 2019-07-02 11:17:32
    AD7606/AD7606-6/AD7606-4为Analog Device公司生产的16位同步采样模数数据采集系统(DAS),分别有 8、6、4个采集通道。 输入箝位保护,以承受最高达±16.5V的电压 40 dB 二阶抗混叠滤波器 跟踪保持放大器 16 位...
  • 购买的AD7606模块 在淘宝上面购买的这款产品,让店家设置的是串行(SPI)、模拟梁输入范围是正负10V。 板子背面的焊盘选择 1、原理图 原理图参考安富莱的AD7606的 2.管脚的定义 2.1OS2,OS1,OS0 数据手册上面定义...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,952
精华内容 2,780
关键字:

ad7606串行读取