注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题

bqgup的个人空间 http://home.eeworld.com.cn/space-uid-1014845.html [收藏] [复制] [分享] [RSS]

日志

高能采集AD7606 ADCV2.0那些事?(一)

热度 1已有 227 次阅读2018-10-4 10:47 |个人分类:技术学习

       最近我在做一个相关的项目。因为这个项目是用来参赛的,在这就先不介绍项目的相关内容,等比赛结束了再跟大家分享。因为这个项目需要用到AD7606这个牛逼的模块,所以就现在这里跟大家分享一下。说实话这个模块我搞了块半个月了(当然不是一心一意在搞喽),然后我突然在今天凌晨2点钟将他给征服了,下面先来了解一下这个模块。
       AD760616位、8通道同步采样、每通道采样率可达200kSPS的模数数据采集芯片,内置模拟输入箝位保护、二阶抗混叠滤波器、跟踪保持放大器、16位电荷再分配逐次逼近型ADC、数字滤波器、2.5V基准电压源、基准电压缓冲以及高速串行和并行接口。采用5V单电源供电,具有片内滤波和高输入阻抗,因此无需驱动运算放大器和外部双极性电源;抗混叠滤波器的3 dB截止频率为22 kHz;当采样速率为200kSPS时,它具有40 dB抗混叠抑制特性;输入箝位保护电路保证输入耐受±16.5V的电压。可应用于电力线监控和保护、多相电机控制、仪表和控制、多轴定位、数据采集等系统中。真容如下图:

最大采样率200kSPS。支持6个过采样模式,分别是2倍、4倍、8倍、16倍、32倍和64倍,通过过采样对采集到的数据求平均,有效地降低了输入模拟量的抖动影响。过采样倍数越大,采样率越低。
数据接口16位总线接口/8位总线接口/SPI串行接口,使用2.54间距的双排针接口;接口电平可以是5V或者3.3V,通过模块上的短路帽或者IO口编程控制。
模拟输入可以处理±10V±5V真双极性输入电压范围信号,使用5.08间距的接线端子接口,通过模块上的短路帽或者IO口编程控制;模拟输入阻抗均为1MΩ
测量精度±10V输入时,测量精度为0.35mV以内;±5V输入时,测量精度为0.2mV以内
听起来还不错,挺牛逼的一个模块,价格120元,天价了。除了价格贵点,其他还是挺满意的,特别符合我的作品需求。大家也看到了这个引脚特别多,与单片机接起来特别麻烦,而且他的连接方式有好多种,尤其是并行连接这种模式要连特别多的线,我是个懒人,因此就没有采用这种方式,而是采用SPI连接方式,SPI连接图如下

这种方式相比较于其他两种方式连线较少,其他连接方式我也分享一下,各位有感兴趣的回去可以尝试一下。

上面说了,我比较懒,我就选择SPI连接方式(比较推荐大家使用这种方式),我还专门为这个SPI连接方式做了一个转接板,当然这个转接板是在详细阅读技术手册之后才确定的转接板原理图。下面把手册分享给大家,然后我再抽出一些手册中的细节与大家分享一下:
OS2 OS1 OS2 :组合状态选择过采样模式。
000表示无过采样,最大200Ksps采样速率。
001表示2倍过采样, 也就是硬件内部采集2个样本求平均
010表示4倍过采样, 也就是硬件内部采集4个样本求平均
011表示8倍过采样, 也就是硬件内部采集8个样本求平均
100表示16倍过采样, 也就是硬件内部采集16个样本求平均
101表示32倍过采样, 也就是硬件内部采集32个样本求平均
110表示64倍过采样, 也就是硬件内部采集64个样本求平均

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

CVA,CVB :启动AD转换的控制信号。CVA决定1-4通道,CVB决定5-8通道。
           2个信号可以错开短暂的时间。一般情况可以将CVA,CVB并联在一起。
RAGE : 量程范围选择。0表示正负5V, 1表示正负10V.
RD : 读信号
RST : 复位信号
BUSY : 忙信号
CS : 片选信号
FRST : 第1个通道样本的指示信号
VIO : 通信接口电平
DB0-DB15 : 数据总线

了解到上述内容,我开始使用PCB软件画图

硬件方面一切准备就绪,下面开始程序的设计
  1. AD7606.C文件
  2. #include
  3. #include "Del.h"
  4. #include "delay.h"
  5. #include "AD7606.h"



  6. //-----------------------------------------------------------------
  7. // 初始化程序区
  8. //-----------------------------------------------------------------
  9. //-----------------------------------------------------------------
  10. // void GPIO_AD7606_Configuration(void)
  11. //-----------------------------------------------------------------
  12. //
  13. // 函数功能: AD7606引脚配置函数
  14. // 入口参数: 无
  15. // 返回参数: 无
  16. // 全局变量: 无
  17. // 调用模块: RCC_APB2PeriphClockCmd(); GPIO_Init();
  18. //                       
  19. //-----------------------------------------------------------------
  20. void GPIO_AD7606_Configuration(void)
  21. {
  22.         GPIO_InitTypeDef GPIO_InitStructure;

  23.         // 使能IO口时钟
  24.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF, ENABLE);  
  25.        
  26.         //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  27.         // AD7606
  28.         //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  29.         // 控制线配置
  30.         //                                                     CS_N       RD/SCLK      REST           COA_B   
  31.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 |GPIO_Pin_5;
  32.                                                                                                                                
  33.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  34.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                                 
  35.         GPIO_Init(GPIOE, &GPIO_InitStructure);
  36.        
  37.         //             BUSY  
  38.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                                                       
  39.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  40.         GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING ;                                                 
  41.         GPIO_Init(GPIOE, &GPIO_InitStructure);       
  42.        
  43.        
  44.         //DOUT
  45.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0;                                                       
  46.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  47.         GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING ;                                                 
  48.         GPIO_Init(GPIOE, &GPIO_InitStructure);
  49. }

  50. //-----------------------------------------------------------------
  51. // void AD7606_Init(void)
  52. //-----------------------------------------------------------------
  53. //
  54. // 函数功能: AD7606初始化函数
  55. // 入口参数: 无
  56. // 返回参数: 无
  57. // 全局变量: 无
  58. // 调用模块:   
  59. // 注意事项: 无
  60. //-----------------------------------------------------------------
  61. void AD7606_Init(void)
  62. {

  63.         convstAB_Set;
  64.         Delay_1ms(1);
  65.         clk_Set;
  66.         cs_Set;       
  67.         AD7606_reset();  
  68.         Delay_1ms(1);
  69.         GPIO_AD7606_Configuration();
  70. }

  71. /*   * 名称:AD7606_startconvst()  * 功能:启动转换  */  
  72. void AD7606_startconvst(void)
  73. {  
  74.         convstAB_Reset;       
  75.         Delay_ns (100);
  76.         convstAB_Set;
  77. }
  78.   
  79. /*   * 名称:AD7606_reset()  * 功能:复位模块  */
  80. void AD7606_reset(void)
  81. {
  82.         rst_Reset;
  83.         Delay_ns (10);
  84.         rst_Set;
  85.         Delay_1us(1);
  86.         rst_Reset;
  87. }  

  88. /*
  89. * 名称:AD7606_read_data()
  90. * 功能:读取数据
  91. * 返回值:返回一个结构体指针,该指针为指向结构体数组的首地址  
  92. */

  93. void AD7606_read_data(s16 * DB_data)
  94. {  
  95.         u8 i,j;        
  96.         for(i=0;i<8;i++)  
  97.         {
  98.                 u16 DB_data1 = 0;
  99.                 cs_Reset;
  100.                 Delay_ns(20);       
  101.                 for(j=0;j<16;j++)
  102.                 {               
  103.                         clk_Reset;
  104.                         Delay_ns(25);
  105.                         DB_data1 = ((u16)(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0))<< (15-j)) + DB_data1;
  106.                         clk_Set;
  107.                         Delay_ns(35);                               
  108.                 }
  109.                 cs_Set;
  110.                 DB_data[i] = (u16)DB_data1;
  111.         }
  112. }

  113. AD7606.H文件
  114. #ifndef _AD7606_H
  115. #define _AD7606_H

  116. #include "sys.h"


  117. #define convstAB_Set                   GPIO_SetBits(GPIOE,GPIO_Pin_5)
  118. #define convstAB_Reset           GPIO_ResetBits(GPIOE,GPIO_Pin_5)

  119. #define rst_Set                          GPIO_SetBits(GPIOE,GPIO_Pin_4)
  120. #define rst_Reset                            GPIO_ResetBits(GPIOE,GPIO_Pin_4)

  121. #define clk_Set                           GPIO_SetBits(GPIOE,GPIO_Pin_3)
  122. #define clk_Reset                   GPIO_ResetBits(GPIOE,GPIO_Pin_3)

  123. #define cs_Set                                   GPIO_SetBits(GPIOE,GPIO_Pin_2)
  124. #define cs_Reset                           GPIO_ResetBits(GPIOE,GPIO_Pin_2)

  125. #define busy_Set                           GPIO_SetBits(GPIOE,GPIO_Pin_1)
  126. #define busy_Reset                   GPIO_ResetBits(GPIOE,GPIO_Pin_1)
  127.        
  128. extern void GPIO_AD7606_Configuration(void);
  129. extern void AD7606_Init(void);
  130. extern void AD7606_startconvst(void);
  131. extern void AD7606_reset(void);
  132. extern void AD7606_read_data(s16 * DB_data);


  133. #endif

  134. //-----------------------------------------------------------------
  135. // End Of File
  136. //-----------------------------------------------------------------
  137. MAIN函数
  138. #include "delay.h"
  139. #include "sys.h"
  140. #include "usart.h"
  141. #include "led.h"
  142. #include "lcd.h"
  143. #include "logo.h"
  144. #include "key.h"
  145. #include "24cxx.h"
  146. #include "w25qxx.h"
  147. #include "touch.h"
  148. #include "modechoose.h"
  149. #include "adc.h"
  150. #include "freecarscope.h"
  151. #include "anoflyscope.h"
  152. #include "keyboard.h"
  153. #include "fdc2214.h"
  154. #include "datapro.h"
  155. #include "key.h"
  156. #include "AD7606.h"
  157. #include "Del.h"
  158. int main(void)
  159. {       
  160.        
  161.         s16 DB_data[8] = {0};                                                                //通道采集数值存放数组
  162.         u8 temp;                                                                                        //BUSY变量
  163.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                //设置中断优先级分组2
  164.         delay_init();                                                                             //延时函数初始化       
  165.         uart_init(115200);                                                                         //串口初始化为115200
  166.         LCD_Init();                                                                                        //LCD屏初始化
  167.         LED_Init();                                                                                 //指示灯初始化
  168. //        Adc_Init();                                                                                        //ADC采集初始化
  169.         tp_dev.init();                                                                                //触摸屏初始化
  170.        
  171.         AD7606_Init();                                                                                //AD7606初始化
  172. //        KeyInit();                                                                                        //按键初始化


  173.         while(1)
  174.         {
  175.                 AD7606_startconvst();                                                                        //AD7670启动转换
  176.                 Delay_ns(1);
  177.                 temp = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_1);                        // 读取 BUSY的状态
  178.                 while((temp == 1))                                                                                //当busy为低电平时,数据转换完毕,此时可以读取数据
  179.                 {
  180.                         Delay_ns(10);
  181.                         temp = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_1);                // 读取 BUSY的状态          
  182.                 }
  183.                 AD7606_read_data(DB_data);                                                                //读取各通道数据
  184.                 LCD_ShowString(50,100,200,24,24,(u8 *)"CH1:");
  185.                 LCD_ShowNum(100,100,DB_data[0],8,24);
  186.                
  187.                 LCD_ShowString(50,200,200,24,24,(u8 *)"CH2:");
  188.                 LCD_ShowNum(100,200,DB_data[1],8,24);
  189.                
  190.                 LCD_ShowString(50,300,200,24,24,(u8 *)"CH3:");
  191.                 LCD_ShowNum(100,300,DB_data[2],8,24);
  192.                
  193.                 LCD_ShowString(50,400,200,24,24,(u8 *)"CH4:");
  194.                 LCD_ShowNum(100,400,DB_data[3],8,24);
  195.                
  196.                 LCD_ShowString(50,500,200,24,24,(u8 *)"CH5:");
  197.                 LCD_ShowNum(100,500,DB_data[4],8,24);
  198.                
  199.                 LCD_ShowString(50,600,200,24,24,(u8 *)"CH6:");
  200.                 LCD_ShowNum(100,600,DB_data[5],8,24);
  201.                
  202.                 LCD_ShowString(50,700,200,24,24,(u8 *)"CH7:");
  203.                 LCD_ShowNum(100,700,DB_data[6],8,24);
  204.                
  205.                 LCD_ShowString(50,800,200,24,24,(u8 *)"CH8:");
  206.                 LCD_ShowNum(100,800,DB_data[7],8,24);
  207.                
  208.                 delay_ms(500);
  209.         }
  210. }




复制代码

我用的开发板是STM32F1战舰V3。下面晒一下实物图:

好了,这个只是我参赛作品的一部分,后面会把整个东西都跟大家分享

本文来自论坛,点击查看完整帖子内容。

发表评论 评论 (2 个评论)

回复 sjl2001 2018-10-5 10:28
建议lz测试的时候用杜邦线验证,以后尽量少用这种  不是很可靠
回复 bqgup 2018-10-5 12:48
sjl2001: 建议lz测试的时候用杜邦线验证,以后尽量少用这种  不是很可靠
哪里不可靠?没听明白

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2018-10-18 21:52 , Processed in 0.015759 second(s), 11 queries , Gzip On, MemCache On.

Powered by EEWORLD电子工程世界

© 2018 http://bbs.eeworld.com.cn/

返回顶部