找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1952|回复: 3
打印 上一主题 下一主题
收起左侧

AD7705模块(双路16位ADC)配套资料

[复制链接]
跳转到指定楼层
楼主
出厂的AD7606模块缺省是8080 并行接口。
如果用SPI接口模式,需要修改 R1 R2电阻配置。

并口模式跳线:   R1 悬空(不贴),R2贴10K电阻
SPI接口模式跳线:R1 贴10K电阻, R2 悬空(不贴)


AD7606 的配置很简单,它没有内部寄存器。量程范围和过采样参数是通过外部IO控制的。
采样速率由MCU或DSP提供的脉冲频率控制。


AD7606 必须使用单5V供电。
AD7606 和MCU之间的通信接口电平由VIO引脚控制。也就是说 VIO必须接单片机的电源,可以是3.3V也可以是5V。

【模块引脚说明】
    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 : 数据总线


【16位并行模式接线图】 --- AD7606也支持8位总线模式,请参见AD7606数据手册

AD7606模块             MCU侧
    GND       <-----    地
    +5V       <-----    5V电源
    RAGE      <-----    可接GPIO也可接固定电平
    OS2       <-----    可接GPIO也可接固定电平
    OS1       <-----    可接GPIO也可接固定电平
    OS0       <-----    可接GPIO也可接固定电平

    CVA       <-----    接GPIO(输出)用于启动AD转换 【推荐接具有PWM输出能力的引脚】
    CVB       <---|

    RD        <-----    8080总线读信号 NOE
    RST       <-----    GPIO输出  硬件复位AD606
    BUSY      ----->    GPIO输入  AD606正在转换指示。【推荐接具有外部中断能力的引脚】
    CS        <-----    8080总线片选 NCS

    VIO       <-----    单片机的电源

    DB0-DB15  ----->    8080数据总线(16位)

    FRST      可不接

【SPI接口模式接线图】

AD7606模块             MCU侧
    GND       <-----    地
    +5V       <-----    5V电源
    RAGE      <-----    任意输出GPIO,可接固定电平
    OS2       <-----    任意输出GPIO,可接固定电平
    OS1       <-----    任意输出GPIO,可接固定电平
    OS0       <-----    任意输出GPIO, 可接固定电平

    CVA       <-----    接GPIO(输出)用于启动AD转换 【推荐接具有PWM输出能力的引脚】
    CVB       <---|

    RD/SCLK   <-----    SPI总线时钟 SCK
    RST       <-----    任意输出GPIO, 用于硬件复位AD606
    BUSY      ----->    GPIO输入, AD606正在转换指示。【推荐接具有外部中断能力的引脚】
    CS        <-----    SPI总线片选 SCS

    VIO       <-----    单片机电源

    DB7(DOUTA) ----->   SPI总线数据线MISO
    DB15      ------    GND

    其他数据线: 可不接或接GND
    FRST      可不接


【软件定时采集的实现方案1】 --- 我们提供的 spi 的例子采用这种方案  见 bsp_spi_ad7606.c 文件

    在定时器中断服务程序中实现:

    定时器中断ISR:
    {
        中断入口;

        读取8个通道的采样结果保存到RAM;     ----> 读取的其实是上次的采集结果,对于连续采集来说,是没有关系的

        启动下次ADC采集;(翻转CVA和CVB)

        中断返回;
    }

    定时器的频率就是ADC采样频率。这种模式可以不连接 BUSY 口线。


【软件定时采集的实现方案2】 --- 我们提供的 8080接口例子采用这种方案   见 bsp_ad7606.c 文件

    配置CVA CVB 引脚为PWM输出模式,周期设置为需要的采样频率;  ---> 之后MCU将产生周期非常稳定的AD转换信号

    将BUSY口线设置为中断下降沿触发模式;

    外部中断ISR
    {
        中断入口;

        读取8个通道的采样结果保存到RAM;

        中断返回;
    }

【软件定时采集的实现方案1和方案2的差异】
(1)方案1 可以少用 BUSY口线, 但是其他中断服务程序或者主程序临时关闭全局中断时,可能导致ADC转换周期存在轻微抖动。

(2)方案2 可以确保采集时钟的稳定性,因为它是MCU硬件产生的。但是需要多接一根 BUSY口线。

单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #include <stdio.h>
  3. #include "bsp.h"
  4. #include "bsp_spi_ad7606.h"
  5. #include "bsp_timer.h"

  6. FIFO_T        g_tAD;        /* 定义一个交换缓冲区,用于存储AD采集数据,并用于写入SD卡 */

  7. void bsp_TIM4_Configuration(void);

  8. /*
  9. *********************************************************************************************************
  10. *        函 数 名: bsp_InitAD7606
  11. *        功能说明: 初始化AD7606 SPI口线
  12. *        形    参:无
  13. *        返 回 值: 无
  14. *********************************************************************************************************
  15. */
  16. void bsp_InitAD7606(void)
  17. {
  18.         GPIO_InitTypeDef  GPIO_InitStructure;
  19.         SPI_InitTypeDef   SPI_InitStructure;
  20.        
  21.         /* AD_SPI_CS_GPIO, AD_SPI_MOSI_GPIO, AD_SPI_MISO_GPIO, AD_SPI_DETECT_GPIO
  22.            and AD_SPI_SCK_GPIO Periph clock enable */
  23.         RCC_APB2PeriphClockCmd(AD_CS_GPIO_CLK | AD_SPI_MISO_GPIO_CLK | AD_SPI_SCK_GPIO_CLK
  24.                         , ENABLE);
  25.        
  26.         /* AD_SPI Periph clock enable */
  27.         RCC_APB1PeriphClockCmd(AD_SPI_CLK, ENABLE);
  28.        
  29.         /* Configure AD_SPI pins: SCK */
  30.         GPIO_InitStructure.GPIO_Pin = AD_SPI_SCK_PIN;
  31.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  32.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  33.         GPIO_Init(AD_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);
  34.        
  35.         /* Configure AD_SPI pins: MISO */
  36.         GPIO_InitStructure.GPIO_Pin = AD_SPI_MISO_PIN;
  37.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
  38.         GPIO_Init(AD_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);
  39.        
  40.         GPIO_InitStructure.GPIO_Pin = AD_CS_PIN;
  41.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  42.         GPIO_Init(AD_CS_GPIO_PORT, &GPIO_InitStructure);
  43.        
  44.         /* AD_SPI Config */
  45.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  46.         //SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Rx;
  47.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  48.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
  49.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  50.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  51.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  52.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
  53.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  54.         SPI_InitStructure.SPI_CRCPolynomial = 7;
  55.         SPI_Init(AD_SPI, &SPI_InitStructure);
  56.        
  57.         SPI_Cmd(AD_SPI, ENABLE); /* AD_SPI enable */
  58.        
  59.         /* 配置其它的GPIO */

  60.         /* 使能GPIO时钟 */
  61.         RCC_APB2PeriphClockCmd(AD_RESET_GPIO_CLK | AD_CONVST_GPIO_CLK | AD_OS0_GPIO_CLK
  62.                 | AD_OS1_GPIO_CLK | AD_OS2_GPIO_CLK, ENABLE);

  63.         /* 配置RESET GPIO */
  64.         GPIO_InitStructure.GPIO_Pin = AD_RESET_PIN;
  65.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  66.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  67.         GPIO_Init(AD_RESET_GPIO_PORT, &GPIO_InitStructure);
  68.        
  69.         /* 配置CONVST GPIO */
  70.         GPIO_InitStructure.GPIO_Pin = AD_CONVST_PIN;
  71.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  72.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  73.         GPIO_Init(AD_CONVST_GPIO_PORT, &GPIO_InitStructure);

  74.         /* 配置OS0-2 GPIO */
  75.         GPIO_InitStructure.GPIO_Pin = AD_OS0_PIN;
  76.         GPIO_Init(AD_OS0_GPIO_PORT, &GPIO_InitStructure);

  77.         GPIO_InitStructure.GPIO_Pin = AD_OS1_PIN;
  78.         GPIO_Init(AD_OS1_GPIO_PORT, &GPIO_InitStructure);

  79.         GPIO_InitStructure.GPIO_Pin = AD_OS2_PIN;
  80.         GPIO_Init(AD_OS2_GPIO_PORT, &GPIO_InitStructure);

  81.         /* 设置过采样模式 */
  82.         ad7606_SetOS(0);

  83.         /* 设置GPIO的初始状态 */
  84.         ad7606_Reset();                                /* 硬件复位复AD7606 */
  85.        
  86.         AD_CONVST_HIGH();                        /* CONVST脚设置为高电平 */       

  87.         bsp_TIM4_Configuration();        /* 配置TIM2定时中断 */               
  88. }

  89. /*
  90. *********************************************************************************************************
  91. *        函 数 名: ad7606_Reset
  92. *        功能说明: 硬件复位AD7606
  93. *        形    参:无
  94. *        返 回 值: 无
  95. *********************************************************************************************************
  96. */
  97. void ad7606_Reset(void)
  98. {
  99.         /* AD7606是高电平复位,要求最小脉宽50ns */
  100.        
  101.         AD_RESET_LOW();
  102.        
  103.         AD_RESET_HIGH();
  104.         AD_RESET_HIGH();
  105.         AD_RESET_HIGH();
  106.         AD_RESET_HIGH();
  107.        
  108.         AD_RESET_LOW();
  109. }

  110. /*
  111. *********************************************************************************************************
  112. *        函 数 名: ad7606_SetOS
  113. *        功能说明: 设置过采样模式(数字滤波,硬件求平均值)
  114. *        形    参:_ucMode : 0-6  0表示无过采样,1表示2倍,2表示4倍,3表示8倍,4表示16倍
  115. *                                5表示32倍,6表示64倍
  116. *        返 回 值: 无
  117. *********************************************************************************************************
  118. */
  119. void ad7606_SetOS(uint8_t _ucMode)
  120. {
  121.         if (_ucMode == 1)
  122.         {
  123.                 AD_OS2_0();
  124.                 AD_OS1_0();
  125.                 AD_OS0_1();
  126.         }
  127.         else if (_ucMode == 2)
  128.         {
  129.                 AD_OS2_0();
  130.                 AD_OS1_1();
  131.                 AD_OS0_0();
  132.         }
  133.         else if (_ucMode == 3)
  134.         {
  135.                 AD_OS2_0();
  136.                 AD_OS1_1();
  137.                 AD_OS0_1();
  138.         }
  139.         else if (_ucMode == 4)
  140.         {
  141.                 AD_OS2_1();
  142.                 AD_OS1_0();
  143.                 AD_OS0_0();
  144.         }
  145.         else if (_ucMode == 5)
  146.         {
  147.                 AD_OS2_1();
  148.                 AD_OS1_0();
  149.                 AD_OS0_1();
  150.         }
  151.         else if (_ucMode == 6)
  152.         {
  153.                 AD_OS2_1();
  154.                 AD_OS1_1();
  155.                 AD_OS0_0();
  156.         }
  157.         else        /* 按0处理 */
  158.         {
  159.                 AD_OS2_0();
  160.                 AD_OS1_0();
  161.                 AD_OS0_0();
  162.         }
  163. }

  164. /*
  165. *********************************************************************************************************
  166. *        函 数 名: ad7606_StartConv
  167. *        功能说明: 启动AD7606的ADC转换
  168. *        形    参:无
  169. *        返 回 值: 无
  170. *********************************************************************************************************
  171. */
  172. void ad7606_StartConv(void)
  173. {
  174.         /* 上升沿开始转换,低电平持续时间至少25ns  */
  175.         AD_CONVST_LOW();
  176.         AD_CONVST_LOW();
  177.         AD_CONVST_LOW();        /* 连续执行2次,低电平约50ns */
  178.        
  179.         AD_CONVST_HIGH();
  180. }

  181. /*
  182. *********************************************************************************************************
  183. *        函 数 名: bsp_TIM4_Configuration
  184. *        功能说明: 配置TIM4定时器
  185. *        形    参:无
  186. *        返 回 值: 无
  187. *********************************************************************************************************
  188. */
  189. void bsp_TIM4_Configuration(void)
  190. {
  191.         NVIC_InitTypeDef NVIC_InitStructure;
  192.        
  193.         /* TIM2 clock enable */
  194.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);  

  195.         /* Configure the NVIC Preemption Priority Bits[配置优先级组] */  
  196.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

  197.         /* Enable the TIM2 gloabal Interrupt [允许TIM2全局中断]*/
  198.         NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
  199.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  200.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
  201.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  202.         NVIC_Init(&NVIC_InitStructure);
  203. }
  204.        
  205. /*
  206. *********************************************************************************************************
  207. *        函 数 名: bsp_SET_TIM4_FREQ
  208. *        功能说明: 设置TIM4定时器频率
  209. *        形    参:_ulFreq : 采样频率,单位Hz,
  210. *        返 回 值: 无
  211. *********************************************************************************************************
  212. */
  213. void bsp_SET_TIM4_FREQ(uint32_t _ulFreq)
  214. {
  215.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  216.         uint16_t usPrescaler;
  217.         uint16_t usPeriod;

  218.         TIM_DeInit(TIM4);        /* 复位TIM2定时器 */

  219.         /* TIM2 configuration
  220.                 TIM2CLK = 36 MHz       
  221.         */
  222.         if (_ulFreq == 0)
  223.         {
  224.                 return;                /* 采样频率为0,停止采样 */
  225.         }
  226.         else if (_ulFreq <= 100)   /* 采样频率小于100Hz */
  227.         {
  228.                 usPrescaler = 36000;                /* TM2CLK = 72 000 000/36000 = 2000 */
  229.                 usPeriod = 2000 / _ulFreq;                                
  230.         }
  231.         else if (_ulFreq <= 200000)        /* 采样频率 :100Hz - 200kHz */
  232.         {
  233.                 usPrescaler = 36 - 1;                /* TM2CLK = 36 000 000/36 = 2 000 000 */
  234.                 usPeriod = 2000000 / _ulFreq;
  235.         }       
  236.         else        /* 采样频率大于 200kHz */
  237.         {
  238.                 return;
  239.         }
  240.        
  241.         TIM_TimeBaseStructure.TIM_Period = usPeriod - 1;                 /* 计数周期 */
  242.         TIM_TimeBaseStructure.TIM_Prescaler = usPrescaler;        /* 分频系数 */
  243.         TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;                 /* */
  244.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //计数方向向上计数
  245.         TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

  246.         /* Clear TIM2 update pending flag[清除TIM2溢出中断标志] */
  247.         TIM_ClearFlag(TIM4, TIM_FLAG_Update);

  248.         TIM_SetCounter(TIM4, 0);

  249.         /* Enable TIM2 Update interrupt [TIM2溢出中断允许]*/
  250.         TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);  

  251.         /* TIM2 enable counter [允许tim2计数]*/
  252.         TIM_Cmd(TIM4, ENABLE);
  253. }  


  254. /*
  255. *********************************************************************************************************
  256. *        函 数 名: ad7606_ReadBytes
  257. *        功能说明: 读取AD7606的采样结果
  258. *        形    参:
  259. *        返 回 值: 无
  260. *********************************************************************************************************
  261. */
  262. uint16_t ad7606_ReadBytes(void)
  263. {
  264.   uint16_t usData = 0;
  265.   
  266.   /* Wait until the transmit buffer is empty */
  267.   while (SPI_I2S_GetFlagStatus(AD_SPI, SPI_I2S_FLAG_TXE) == RESET)
  268.   {
  269.   }
  270.   
  271.   /* Send the byte */
  272.   SPI_I2S_SendData(AD_SPI, 0xFFFF);

  273.   /* Wait until a data is received */
  274.   while (SPI_I2S_GetFlagStatus(AD_SPI, SPI_I2S_FLAG_RXNE) == RESET)
  275.   {
  276.   }
  277.   
  278.   /* Get the received data */
  279.   usData = SPI_I2S_ReceiveData(AD_SPI);

  280.   /* Return the shifted data */
  281.   return usData;
  282. }

  283. /*
  284. *********************************************************************************************************
  285. *        函 数 名: ad7606_IRQSrc
  286. *        功能说明: 定时调用本函数,用于读取AD转换器数据
  287. *        形    参:无
  288. *        返 回 值: 无
  289. *********************************************************************************************************
  290. */
  291. void ad7606_IRQSrc(void)
  292. {
  293.         uint8_t i;
  294.         uint16_t usReadValue;

  295.         TIM_ClearFlag(TIM4, TIM_FLAG_Update);

  296.         /* 读取数据
  297.         示波器监测,CS低电平持续时间 35us
  298.         */
  299.         AD_CS_LOW();
  300.         for (i = 0; i < CH_NUM; i++)
  301.         {
  302.                 usReadValue = ad7606_ReadBytes();       
  303.                 if (g_tAD.usWrite < FIFO_SIZE)
  304.                 {
  305.                         g_tAD.usBuf[g_tAD.usWrite] = usReadValue;
  306.                         ++g_tAD.usWrite;
  307.                 }
  308.         }               
  309.        
  310.         AD_CS_HIGH();       

  311.         ad7606_StartConv();
  312. }

  313. /*
  314. *********************************************************************************************************
  315. *        函 数 名: GetAdcFormFifo
  316. *        功能说明: 从FIFO中读取一个ADC值
  317. *        形    参:_usReadAdc : 存放ADC结果的变量指针
  318. *        返 回 值: 1 表示OK,0表示暂无数据
  319. *********************************************************************************************************
  320. */
  321. uint8_t GetAdcFormFifo(uint16_t *_usReadAdc)
  322. {
  323.         uint16_t usWrite;
  324.        
  325.         DISABLE_INT();       
  326.         usWrite = g_tAD.usWrite;
  327.         ENABLE_INT();
  328.        
  329.         if (usWrite != g_tAD.usRead)
  330.         {
  331.                 *_usReadAdc = g_tAD.usBuf[g_tAD.usRead];

  332.                 DISABLE_INT();
  333.                 if (++g_tAD.usRead >= FIFO_SIZE)
  334.                 {
  335.                         g_tAD.usRead = 0;
  336.                 }               
  337.                 ENABLE_INT();
  338.                 return 1;               
  339.         }
  340.         return 0;
  341. }

  342. /*
  343. *********************************************************************************************************
  344. *        函 数 名: ad7606_StartRecord
  345. *        功能说明: 开始采集
  346. *        形    参:_ulFreq : 采样频率, 单位 HZ
  347. *        返 回 值: 无
  348. *********************************************************************************************************
  349. */
  350. void ad7606_StartRecord(uint32_t _ulFreq)
  351. {
  352.         //ad7606_Reset();        /* 复位硬件 */

  353.         ad7606_StartConv();                                /* 启动采样,避免第1组数据全0的问题 */

  354.         g_tAD.usRead = 0;                                /* 必须在开启TIM2之前清0 */
  355.         g_tAD.usWrite = 0;

  356.         bsp_TIM4_Configuration();                /* 配置TIM2定时中断 */               

  357.         bsp_SET_TIM4_FREQ(_ulFreq);                /* 设置采样频率, 并使能TIM2定时采样中断 */
  358. }

  359. /*
  360. *********************************************************************************************************
  361. *        函 数 名: ad7606_StopRecord
  362. *        功能说明: 停止采集
  363. *        形    参:无
  364. *        返 回 值: 无
  365. *********************************************************************************************************
  366. */
  367. void ad7606_StopRecord(void)
  368. {
  369.         /* TIM2 enable counter [允许tim2计数]*/
  370.         TIM_Cmd(TIM4, DISABLE);
  371. }

  372. void TIM4_IRQHandler(void)
  373. {
  374.         ad7606_IRQSrc();
  375. }
复制代码
全部资料51hei下载地址:
AD7606数据采集模块资料(2015-01-22).7z (3.99 MB, 下载次数: 33)

1641362416(1).png (28.4 KB, 下载次数: 78)

1641362416(1).png

评分

参与人数 1黑币 +10 收起 理由
admin + 10 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:8222 发表于 2022-1-13 10:14 | 只看该作者
到底是7705还是7606?
回复

使用道具 举报

板凳
ID:250090 发表于 2022-11-4 13:33 | 只看该作者
到底是7705还是7606?
回复

使用道具 举报

地板
ID:211544 发表于 2022-11-18 15:13 | 只看该作者
是7705
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表