最近我在做一个相关的项目。因为这个项目是用来参赛的,在这就先不介绍项目的相关内容,等比赛结束了再跟大家分享。因为这个项目需要用到AD7606这个牛逼的模块,所以就现在这里跟大家分享一下。说实话这个模块我搞了块半个月了(当然不是一心一意在搞喽),然后我突然在今天凌晨2点钟将他给征服了,下面先来了解一下这个模块。
AD7606是16位、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软件画图
硬件方面一切准备就绪,下面开始程序的设计
- AD7606.C文件
- #include <stm32f10x.h>
- #include "Del.h"
- #include "delay.h"
- #include "AD7606.h"
- //-----------------------------------------------------------------
- // 初始化程序区
- //-----------------------------------------------------------------
- //-----------------------------------------------------------------
- // void GPIO_AD7606_Configuration(void)
- //-----------------------------------------------------------------
- //
- // 函数功能: AD7606引脚配置函数
- // 入口参数: 无
- // 返回参数: 无
- // 全局变量: 无
- // 调用模块: RCC_APB2PeriphClockCmd(); GPIO_Init();
- //
- //-----------------------------------------------------------------
- void GPIO_AD7606_Configuration(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- // 使能IO口时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF, ENABLE);
-
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- // AD7606
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- // 控制线配置
- // CS_N RD/SCLK REST COA_B
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 |GPIO_Pin_5;
-
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOE, &GPIO_InitStructure);
-
- // BUSY
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING ;
- GPIO_Init(GPIOE, &GPIO_InitStructure);
-
-
- //DOUT
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING ;
- GPIO_Init(GPIOE, &GPIO_InitStructure);
- }
- //-----------------------------------------------------------------
- // void AD7606_Init(void)
- //-----------------------------------------------------------------
- //
- // 函数功能: AD7606初始化函数
- // 入口参数: 无
- // 返回参数: 无
- // 全局变量: 无
- // 调用模块:
- // 注意事项: 无
- //-----------------------------------------------------------------
- void AD7606_Init(void)
- {
- convstAB_Set;
- Delay_1ms(1);
- clk_Set;
- cs_Set;
- AD7606_reset();
- Delay_1ms(1);
- GPIO_AD7606_Configuration();
- }
- /* * 名称:AD7606_startconvst() * 功能:启动转换 */
- void AD7606_startconvst(void)
- {
- convstAB_Reset;
- Delay_ns (100);
- convstAB_Set;
- }
-
- /* * 名称:AD7606_reset() * 功能:复位模块 */
- void AD7606_reset(void)
- {
- rst_Reset;
- Delay_ns (10);
- rst_Set;
- Delay_1us(1);
- rst_Reset;
- }
- /*
- * 名称:AD7606_read_data()
- * 功能:读取数据
- * 返回值:返回一个结构体指针,该指针为指向结构体数组的首地址
- */
- void AD7606_read_data(s16 * DB_data)
- {
- u8 i,j;
- for(i=0;i<8;i++)
- {
- u16 DB_data1 = 0;
- cs_Reset;
- Delay_ns(20);
- for(j=0;j<16;j++)
- {
- clk_Reset;
- Delay_ns(25);
- DB_data1 = ((u16)(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0))<< (15-j)) + DB_data1;
- clk_Set;
- Delay_ns(35);
- }
- cs_Set;
- DB_data[i] = (u16)DB_data1;
- }
- }
- AD7606.H文件
- #ifndef _AD7606_H
- #define _AD7606_H
- #include "sys.h"
- #define convstAB_Set GPIO_SetBits(GPIOE,GPIO_Pin_5)
- #define convstAB_Reset GPIO_ResetBits(GPIOE,GPIO_Pin_5)
- #define rst_Set GPIO_SetBits(GPIOE,GPIO_Pin_4)
- #define rst_Reset GPIO_ResetBits(GPIOE,GPIO_Pin_4)
- #define clk_Set GPIO_SetBits(GPIOE,GPIO_Pin_3)
- #define clk_Reset GPIO_ResetBits(GPIOE,GPIO_Pin_3)
- #define cs_Set GPIO_SetBits(GPIOE,GPIO_Pin_2)
- #define cs_Reset GPIO_ResetBits(GPIOE,GPIO_Pin_2)
- #define busy_Set GPIO_SetBits(GPIOE,GPIO_Pin_1)
- #define busy_Reset GPIO_ResetBits(GPIOE,GPIO_Pin_1)
-
- extern void GPIO_AD7606_Configuration(void);
- extern void AD7606_Init(void);
- extern void AD7606_startconvst(void);
- extern void AD7606_reset(void);
- extern void AD7606_read_data(s16 * DB_data);
- #endif
- //-----------------------------------------------------------------
- // End Of File
- //-----------------------------------------------------------------
- MAIN函数
- #include "delay.h"
- #include "sys.h"
- #include "usart.h"
- #include "led.h"
- #include "lcd.h"
- #include "logo.h"
- #include "key.h"
- #include "24cxx.h"
- #include "w25qxx.h"
- #include "touch.h"
- #include "modechoose.h"
- #include "adc.h"
- #include "freecarscope.h"
- #include "anoflyscope.h"
- #include "keyboard.h"
- #include "fdc2214.h"
- #include "datapro.h"
- #include "key.h"
- #include "AD7606.h"
- #include "Del.h"
- int main(void)
- {
-
- s16 DB_data[8] = {0}; //通道采集数值存放数组
- u8 temp; //BUSY变量
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组2
- delay_init(); //延时函数初始化
- uart_init(115200); //串口初始化为115200
- LCD_Init(); //LCD屏初始化
- LED_Init(); //指示灯初始化
- // Adc_Init(); //ADC采集初始化
- tp_dev.init(); //触摸屏初始化
-
- AD7606_Init(); //AD7606初始化
- // KeyInit(); //按键初始化
- while(1)
- {
- AD7606_startconvst(); //AD7670启动转换
- Delay_ns(1);
- temp = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_1); // 读取 BUSY的状态
- while((temp == 1)) //当busy为低电平时,数据转换完毕,此时可以读取数据
- {
- Delay_ns(10);
- temp = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_1); // 读取 BUSY的状态
- }
- AD7606_read_data(DB_data); //读取各通道数据
- LCD_ShowString(50,100,200,24,24,(u8 *)"CH1:");
- LCD_ShowNum(100,100,DB_data[0],8,24);
-
- LCD_ShowString(50,200,200,24,24,(u8 *)"CH2:");
- LCD_ShowNum(100,200,DB_data[1],8,24);
-
- LCD_ShowString(50,300,200,24,24,(u8 *)"CH3:");
- LCD_ShowNum(100,300,DB_data[2],8,24);
-
- LCD_ShowString(50,400,200,24,24,(u8 *)"CH4:");
- LCD_ShowNum(100,400,DB_data[3],8,24);
-
- LCD_ShowString(50,500,200,24,24,(u8 *)"CH5:");
- LCD_ShowNum(100,500,DB_data[4],8,24);
-
- LCD_ShowString(50,600,200,24,24,(u8 *)"CH6:");
- LCD_ShowNum(100,600,DB_data[5],8,24);
-
- LCD_ShowString(50,700,200,24,24,(u8 *)"CH7:");
- LCD_ShowNum(100,700,DB_data[6],8,24);
-
- LCD_ShowString(50,800,200,24,24,(u8 *)"CH8:");
- LCD_ShowNum(100,800,DB_data[7],8,24);
-
- delay_ms(500);
- }
- }
-
我用的开发板是STM32F1战舰V3。下面晒一下实物图:
好了,这个只是我参赛作品的一部分,后面会把整个东西都跟大家分享