当前位置:   article > 正文

AD7606模块

ad7606

了解一下ad7606模块,并学习制作一个。

认识AD7606

先了解一下关元AD7606的信息。(芯片手册的内容)

AD7606 采用 5V 单电源供电,不再需要正负 双电源,并支持真正±10V 或±5V 的双极性信号输。所有的通道均能以高达 200 kSPS 的速率进行采样(在数值上采样率与频率应该是相等的,不同的话就是频率Hz可以是小数而采样率S/s一定是整数 ), 同时输入端箝位保护电路可以承受最高达±16.5V 的电压。
AD7606 的数字接口可以配置在并行或串行模式。数字接口的电平 Vdrive 为 2.3V~5.25V,可以跟当 前任何主流的 CPU/DSP 连接。需要注意的是,当配置 AD7606 工作在串行接口模式时,数据总线的 DB[15:9] 和 DB[6:0]管脚需要做接地处理。
我将采用串行的连接方法。串行可以节约io口。
AD7606 提供了过采样和数字滤波功能。通过管脚 OS[2:0]可以设置过采样倍数(OSR)为 x2, x4, x8, x16, x32, x64。过采样打开后,内部的过采样控制电路和 1 阶 Sinc 数字滤波器会自动被使能,同时-3dB 带宽 也会相应的改变。
ADC 一般需要模拟电源和数字电源。大多数的系统都会有 5V 数字电源,却不一定具有 5V 模拟电源。 此时如果模拟电路和数字电路共用同一个 5V 电源,有害的数字噪声可能会耦合到模拟电路并降低 ADC 的 性能,通常应该避免这样的设计。如果不可避免,需要将 5V 的数字电源进行很好的滤波后再供给模拟电 路用。AD7606 的去耦设计十分简洁,仅需要 9 个电容,其中包括 2 个 10uF,2 个 1uF,5 个 0.1uF。参考 下图  所示。
AD7606 的管脚定义已经考虑了 PCB 设计中的布局布线。从管脚定义图中可以看出,LQFP 封装的 4 个 侧边,模拟输入端 Ain 在一侧,数据总线接口在另一侧,其余两侧分别为控制和配置管脚。设计中只需要 4 层 PCB 板,就可以发挥 AD7606 的性能。叠层建议如下图 。表层和底层为走线层,中间两个内层分别为 地平面、电源平面。除了叠层设计,AD7606 的手册中也给出了说明和示例
AD7606需要用到SPI通信协议,之前没有学习过,也需要学习一下。
SPI有四根线:

SPI总线包括4条逻辑线,定义如下:

  • MISOMaster input slave output 主机输入,从机输出(数据来自从机);
  • MOSIMaster output slave input 主机输出,从机输入(数据来自主机);
  • SCK :Serial Clock 串行时钟信号,由主机产生发送给从机;
  • NSSSlave Select 片选信号,由主机发送,以控制与哪个从机通信,通常是低电平有效信号。

其他制造商可能会遵循其他命名规则,但是最终他们指的相同的含义。以下是一些常用术语;

  • MISO也可以是SIMODOUTDOSDOSO(在主机端);
  • MOSI也可以是SOMIDINDISDISI(在主机端);
  • NSS也可以是CECSSSEL;
  • SCK也可以是SCLK;

本文将按照以下命名进行讲解[MISO, MOSI, SCK,NSS]

在软件配置上将根据时序图进行配置。

软件配置

我是在网上找了相关的例程,后进行一点修改。

我采用的是STM32F103VCT6,全部引脚引出,用ZET6也可以。AD7606是用的;凌智电子的模块。

AD7606模块采用5v供电,J11跳线帽接3.3v,J2跳线帽接±5v。

采用串行连接。AD7606与单片机连接示意图

AD7606全称单片机功能介绍
+5 +5 
GNDGND
RESTRESETC8GPIO复位AD7606
SERPAR/SER/ BYTE SEL+3.3V并行/串行/字节接口选择输入,接3.3V
STBYSTBYB11待机模式输入
OS2OS2B13过采样模式引脚。
OS1OS1B14
OS0OS0B15
CO_ACONVST AB10启动模拟输入通道转换信号
CO_BCONVST BC9
CS_NCSA6片选,置低后标志可以开始输出模拟量
RD/SCRD/SCLKA7串行时钟输入(SCLK)。SCLK上升沿将随后的所有数据位逐个送至串行数据输出DOUTA和DOUTB
DB7DB7/DOUTAC6串行接口数据输出引脚(DOUTA)。
BUSYBUSYA5输出繁忙
DB15DB15/BYTE SELGND并行/串行/字节接口选择输入,接地
FR_DFRSTDATAA4数字输出(可不接)

当选择串行接口时,应将引脚 DB[15:9]和DB[6:0]接地。

在实际使用时空接也是可以的。但画电路的时候建议接地。

只用一路DOUT 线的缺点是:如果在转换之后进行读 取,则吞吐速率会下降。串行模式下,不用的DOUT线应保 持不连接。

省电模式

过采样位解码

该引脚可以不接

源码分享

AD7606.C

  1. #include <stm32f10x.h>
  2. #include "Delay.h"
  3. #include "AD7606.h"
  4. //#include "lze_lcd.h"
  5. extern u8 IO_TAG;
  6. //-----------------------------------------------------------------
  7. // 初始化程序区
  8. //-----------------------------------------------------------------
  9. //-----------------------------------------------------------------
  10. // void GPIO_AD7606_Configuration(void)
  11. //-----------------------------------------------------------------
  12. //
  13. // 函数功能: AD7606引脚配置函数
  14. // 入口参数: 无
  15. // 返回参数: 无
  16. // 全局变量: 无
  17. // 调用模块: RCC_APB2PeriphClockCmd(); GPIO_Init();
  18. // 注意事项: 用GPIO驱动方式和FSMC驱动方式下的引脚配置不一样
  19. //
  20. //-----------------------------------------------------------------
  21. void GPIO_AD7606_Configuration(void)
  22. {
  23. GPIO_InitTypeDef GPIO_InitStructure;
  24. // 使能IO口时钟
  25. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
  26. RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |
  27. RCC_APB2Periph_GPIOE,
  28. ENABLE);
  29. GPIO_DeInit(GPIOA);//将GPIOx外设寄存器初始化为默认复位值
  30. GPIO_DeInit(GPIOB);//除了B4和A15是高电平。B3没信号外,其他io口被拉低。(默认值)
  31. GPIO_DeInit(GPIOC);
  32. GPIO_DeInit(GPIOD);
  33. GPIO_DeInit(GPIOE);
  34. //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  35. // AD7606
  36. //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  37. // 控制线配置
  38. // CS_N RD/SCLK
  39. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 ;
  40. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  41. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  42. GPIO_Init(GPIOA, &GPIO_InitStructure);
  43. // FRSTDATA BUSY
  44. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 ;
  45. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  46. GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING ;
  47. GPIO_Init(GPIOA, &GPIO_InitStructure);
  48. // rst convstB convstA STby OS12 OS11 OS10
  49. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 |
  50. GPIO_Pin_13 | GPIO_Pin_14 |
  51. GPIO_Pin_15 ;
  52. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  53. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  54. GPIO_Init(GPIOB, &GPIO_InitStructure);
  55. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 ;
  56. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  57. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  58. GPIO_Init(GPIOC, &GPIO_InitStructure);
  59. //数据线配置(1)
  60. // DoutA
  61. // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;
  62. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 ;
  63. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  64. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  65. GPIO_Init(GPIOC, &GPIO_InitStructure);
  66. }
  67. //-----------------------------------------------------------------
  68. // void AD7606_Init(void)
  69. //-----------------------------------------------------------------
  70. //
  71. // 函数功能: AD7606初始化函数
  72. // 入口参数: 无
  73. // 返回参数: 无
  74. // 全局变量: 无
  75. // 调用模块:
  76. // 注意事项: 无
  77. //-----------------------------------------------------------------
  78. void AD7606_Init(void)
  79. {
  80. convstA_Set; //B10
  81. convstB_Set; //C9
  82. delay_ms(1);
  83. STby_Set; //B11
  84. clk_Set; //A7
  85. cs_Set; //A6
  86. OS10_Reset; //B15
  87. OS11_Reset; //B14
  88. OS12_Reset; //B13
  89. AD7606_reset(); //复位
  90. delay_ms(1); //
  91. AD7606_startconvst(); // 启动转换
  92. }
  93. /* * 名称:AD7606_startconvst() * 功能:启动转换 */
  94. void AD7606_startconvst(void)
  95. {
  96. convstA_Reset; //B10
  97. convstB_Reset; //C9
  98. delay_us (1);
  99. convstA_Set; //B10
  100. convstB_Set; //C9
  101. }
  102. /* * 名称:AD7606_reset() * 功能:复位模块 */
  103. void AD7606_reset(void)
  104. {
  105. rst_Reset; //C8
  106. delay_us (1);
  107. rst_Set; //C8
  108. delay_us(1);
  109. rst_Reset; //C8
  110. }
  111. /*
  112. * 名称:AD7606_read_data()
  113. * 功能:读取数据
  114. * 返回值:返回一个结构体指针,该指针为指向结构体数组的首地址
  115. */
  116. void AD7606_read_data(s16 * DB_data)
  117. {
  118. u8 i,j;
  119. for(i=0;i<8;i++)
  120. {
  121. u16 DB_data1 = 0;
  122. cs_Reset; //A6
  123. delay_us(1);
  124. for(j=0;j<16;j++)
  125. {
  126. clk_Reset; //A7
  127. delay_us(1);
  128. // DB_data1 = ((u16)(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0))<< (15-j)) + DB_data1 ;
  129. DB_data1 = ((u16)(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_6))<< (15-j)) + DB_data1 ;
  130. clk_Set; //A7
  131. delay_us(1);
  132. }
  133. cs_Set; //A6
  134. DB_data[i] = (u16)DB_data1;
  135. }
  136. }

AD7606.H

  1. #ifndef _AD7606_H
  2. #define _AD7606_H
  3. #define sampling_0times 0
  4. #define sampling_2times 1
  5. #define sampling_4times 2
  6. #define sampling_8times 3
  7. #define sampling_16times 4
  8. #define sampling_32times 5
  9. #define sampling_64times 6
  10. #define STby_Set GPIO_SetBits(GPIOB,GPIO_Pin_11)
  11. #define OS10_Set GPIO_SetBits(GPIOB,GPIO_Pin_15)
  12. #define OS10_Reset GPIO_ResetBits(GPIOB,GPIO_Pin_15)
  13. #define OS11_Set GPIO_SetBits(GPIOB,GPIO_Pin_14)
  14. #define OS11_Reset GPIO_ResetBits(GPIOB,GPIO_Pin_14)
  15. #define OS12_Set GPIO_SetBits(GPIOB,GPIO_Pin_13)
  16. #define OS12_Reset GPIO_ResetBits(GPIOB,GPIO_Pin_13)
  17. #define convstA_Set GPIO_SetBits(GPIOB,GPIO_Pin_10)
  18. #define convstA_Reset GPIO_ResetBits(GPIOB,GPIO_Pin_10)
  19. #define convstB_Set GPIO_SetBits(GPIOC,GPIO_Pin_9)
  20. #define convstB_Reset GPIO_ResetBits(GPIOC,GPIO_Pin_9)
  21. #define rst_Set GPIO_SetBits(GPIOC,GPIO_Pin_8)
  22. #define rst_Reset GPIO_ResetBits(GPIOC,GPIO_Pin_8)
  23. #define clk_Set GPIO_SetBits(GPIOA,GPIO_Pin_7)
  24. #define clk_Reset GPIO_ResetBits(GPIOA,GPIO_Pin_7)
  25. #define cs_Set GPIO_SetBits(GPIOA,GPIO_Pin_6)
  26. #define cs_Reset GPIO_ResetBits(GPIOA,GPIO_Pin_6)
  27. #define frstdata_Set GPIO_SetBits(GPIOA,GPIO_Pin_4)
  28. #define frstdata_Reset GPIO_ResetBits(GPIOA,GPIO_Pin_4)
  29. #define busy_Set GPIO_SetBits(GPIOA,GPIO_Pin_5)
  30. #define busy_Reset GPIO_ResetBits(GPIOA,GPIO_Pin_5)
  31. #include "stm32f10x.h" // Device header
  32. extern void GPIO_AD7606_Configuration(void);
  33. extern void AD7606_Init(void);
  34. extern void AD7606_startconvst(void);
  35. extern void AD7606_reset(void);
  36. extern void AD7606_read_data(s16 * DB_data) ;
  37. #endif
  38. //-----------------------------------------------------------------
  39. // End Of File
  40. //-----------------------------------------------------------------
  41. //数字:0
  42. //CH1: 1789.4 mv 0xadcf 44495
  43. //CH2: 4547.4 mv 0xf46a 62570
  44. //CH3: 1540.5 mv 0xa770 42864
  45. //CH4: 4823.5 mv 0xfb7b 64379
  46. //CH5: 1000.4 mv 0x999c 39324
  47. //CH6: 2565.0 mv 0xc1aa 49578
  48. //CH7: 1362.2 mv 0xa2df 41695
  49. //CH8: 2978.1 mv 0xcc3d 52285

main.c

  1. #include "stm32f10x.h" // Device header
  2. #include "AD7606.h"
  3. #include "PeripheralInit.h"
  4. //注意:
  5. // (1) 串行:SER = 1;D15 = 0;
  6. // (2) 通过J3跳帽选择输入电压的范围,修改程序第92行中sprintf里面的(float)(DB_data[i]*5000.0/32768)的5000.0,在5000.0和10000.0根据跳帽改变。
  7. // (3) J2跳帽这里连接3.3V,具体选择看引脚功能。
  8. int main(void)
  9. {
  10. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  11. u8 dis_buf[40];
  12. u8 i;
  13. uint8_t temp;
  14. s16 DB_data[8] = {0};
  15. delay_init(); //延时初始化
  16. PeripheralInit(); // 外设初始化
  17. while(1)
  18. {
  19. printf("数字:%d\r\n",Num++);
  20. delay_ms (1000);
  21. AD7606_startconvst(); //AD7606开始转换
  22. temp = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5); // 读取 BUSY的状态
  23. while(temp == 0) //当busy为低电平时,数据转换完毕,此时可以读取数据
  24. {
  25. delay_us(1);
  26. temp = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5); // 读取 BUSY的状态
  27. }
  28. AD7606_read_data(DB_data); //读取数据放至数组DB_data[]
  29. for(i=0;i<8;i++)
  30. {
  31. sprintf((char*)dis_buf,"CH%1d:%8.1f mv 0x%04x %6d\r\n", i+1, (float)(DB_data[i]*5000.0/32768), (u16)(DB_data[i]^0x8000), (u16)(DB_data[i]^0x8000));
  32. printf("CH%1d:%8.1f mv 0x%04x %6d\r\n", i+1, (float)(DB_data[i]*5000.0/32768), (u16)(DB_data[i]^0x8000), (u16)(DB_data[i]^0x8000)); //在串口显示结果
  33. delay_ms(20);
  34. }
  35. delay_ms(100);
  36. }
  37. }

之前有一个疑问,为什么不用单片机自带的ad而用模块?

整理一下网上的答案

1、AD7606是8路同步采样,内部ADC不是,最高只能三路同步。
2、内置的精度有效位没有7606高
3、7606是真双极性,支持正负10V,而内置的只能0-3.3V,不支持负压采集。
4、7606最高是200Ksps。内置是3.6Msps

AD7606优势在于高精度,支持宽电压,可达±10V。抗干扰能力强。

单片机的优势在于价格便宜。

电路设计

设计时采用的串行接口,主控芯片是STM32F407ZGT6。上面的代码是STM32F103VCT6的,需要移植。改一下io口,不难
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/551785
推荐阅读
相关标签
  

闽ICP备14008679号