文章目录

  • AD7606接线图
  • AD7606SPI通讯接口说明
  • AD7606时序图
  • AD7606时序图讲解
  • AD7606 STM32引脚配置
  • AD7606 程序模块
  • 遇到的问题以及总结

由于训练电赛,需要选取一块测量速度快,精度更高速度更快的外部ADC,所以选了一块AD7606。

AD7606是一块八通道,双极性输入,同步采样16位ADC。内置2.5V基准电压。由于AD7606没有内部的寄存器,需要直接利用引脚配置ADC的模式,所以AD7606的控制原理也是很简单,但是需要占用的I/O口的资源很多。

AD7606接线图

AD7606 SPI的串行接口接线图:
AD7606 16位并口接线图:

由这两张图可见除了必须要连接的一些控制线一样之外不同的是数据线的连接,SPI串行通讯用的数据总线的数量只需要一根,而并行通讯的数据总线的数量为16根,对于I/O口不是非常多的单片机还是推荐使用串行通讯。(注:根据数据手册需要把芯片的6脚SER接到高电平上,选择芯片工作在串口模式)

AD7606SPI通讯接口说明

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通道。可以将CVA和CVB接到一起用同一个引脚控制。(若想控制转换速率可以将引脚设置为PWM输出的模式以控制转换速率)
RAGE : 量程范围选择。0表示正负5V, 1表示正负10V.
RD : SPI总线时钟信号
RST : 复位信号
BUSY : 忙信号
CS : 片选信号
FRST : 第1个通道样本的指示信号(可不接)
VIO : 通信接口电平
DB7 : 数据总线
DB15:接地

AD7606时序图

图一图二
图三
(个人认为只需要这三张图就可以完全利用SPI总线将AD7606用起来)

AD7606时序图讲解

图一是整体的一个时序框图,大体的逻辑就是在使用AD7606之前要先复位一下,复位信号是高电平有效,时间至少为50ns。然后就是对采样速率和量程的配置,也就是对OS0,OS1,OS2和RANGE脚的配置,然后再对一些引脚进行一些初始化(也可以直接在GPIO配置的时候进行初始化)。之后就是发送启动信号,也就是将CVA,CVB拉低至少25ns后再拉高(启动信号上升沿有效)。之后AD7606开始转换,BUSY信号线拉高,如果BUSY信号线拉低则表明转换已经完成。转换完成后将CS片选信号线拉低才可以进行数据读取,读取完成后将CS片选信号线拉高即可。(还有一种是在转换时进行数据读取的,由于对于采样速率要求并不是特别的高,所以也没有深入研究)

图二是串行通讯对数据进行读取的时序框图,讲的是在AD7606转换完成后将CS片选信号拉低后的操作。转换完成后CS片选信号拉低,开始读取数据。由于是16位8通道ADC,一次读取一个字节,所以一个通道需要读取两次数据。因为是高位在前低位在后所以就是先读取的是MSB,后读取的LSB,数据需要SCLK下降沿有效。经过16*8 = 128个SCLK读取后已经全部将ADC转换的数据全部读取完了,之后就可以将CS片选信号拉高了(由于串行通讯FRSTDATA数据线可以不接,所以并没有用到这个脚)。

图三是对一个字节的读取,顺序也就是现将时钟线拉高后拉低然后读取一下当前的值然后拉高,重复八次就是一个字节的读取。(MSB的最高位为符号位,若为1则数据为负数,若为0则数据为正数

AD7606 STM32引脚配置

用的MCU是STM32F103ZET6,系统时钟是72MHz。

RANGE,OS0,OS1,OS2若是需要选择量程和速率的话可以接到单片机引脚上,要是不需要的话可以直接接到地或VCC上(自己选择)。RST,RD,CVA, CVB,CS需要设置为OUTPUT输出模式,GPIO电平和模式默认就可以(我在AD7606初始化的时候对IO口也进行了初始化),DB7数据线接的INPUT脚要设为INPUT模式,需要内设上拉电阻。BUSY信号脚就设置为外部中断,下降沿触发,一定要把中断使能(下降沿触发说明ADC转换已经结束)。

AD7606 程序模块

程序我也是根据提供的例程进行的修改。

我对所有需要调用的函数都进行了宏定义,以方便在程序中调用

#define OS0_1 HAL_GPIO_WritePin(OS0_GPIO_Port,OS0_Pin,GPIO_PIN_SET);//AD速率控制引脚
#define OS0_0 HAL_GPIO_WritePin(OS0_GPIO_Port,OS0_Pin,GPIO_PIN_RESET);#define OS1_1 HAL_GPIO_WritePin(OS1_GPIO_Port,OS1_Pin,GPIO_PIN_SET);
#define OS1_0 HAL_GPIO_WritePin(OS1_GPIO_Port,OS1_Pin,GPIO_PIN_RESET);#define OS2_1 HAL_GPIO_WritePin(OS2_GPIO_Port,OS2_Pin,GPIO_PIN_SET);
#define OS2_0 HAL_GPIO_WritePin(OS2_GPIO_Port,OS2_Pin,GPIO_PIN_RESET);#define RAGE_1 HAL_GPIO_WritePin(RAGE_GPIO_Port,RAGE_Pin,GPIO_PIN_SET);//量程选择
#define RAGE_0 HAL_GPIO_WritePin(RAGE_GPIO_Port,RAGE_Pin,GPIO_PIN_RESET);//0为+-5 1为+-10#define CVB_1 HAL_GPIO_WritePin(CVB_GPIO_Port,CVB_Pin,GPIO_PIN_SET);
#define CVB_0 HAL_GPIO_WritePin(CVB_GPIO_Port,CVB_Pin,GPIO_PIN_RESET);#define CVA_1 HAL_GPIO_WritePin(CVA_GPIO_Port,CVA_Pin,GPIO_PIN_SET);//启动AD转换的控制信号
#define CVA_0 HAL_GPIO_WritePin(CVA_GPIO_Port,CVA_Pin,GPIO_PIN_RESET);//CVA决定1-4通道 CVB决定5-8通道#define RD_1 HAL_GPIO_WritePin(RD_GPIO_Port,RD_Pin,GPIO_PIN_SET);//时钟线
#define RD_0 HAL_GPIO_WritePin(RD_GPIO_Port,RD_Pin,GPIO_PIN_RESET);#define RST_1 HAL_GPIO_WritePin(RST_GPIO_Port,RST_Pin,GPIO_PIN_SET);//复位信号
#define RST_0 HAL_GPIO_WritePin(RST_GPIO_Port,RST_Pin,GPIO_PIN_RESET);#define CS_1 HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_SET);//片选信号
#define CS_0 HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_RESET);#define More_Rst RST_1;RST_1;RST_1;RST_1;RST_1;RST_1;//持续最少25ns高电平复位信号#define Read_Dat HAL_GPIO_ReadPin(INPUT_GPIO_Port,INPUT_Pin)//读取数据引脚状态

对速度进行选择的函数

void AD7606_SetSpeed(uint8_t mode)//AD7606过采样选择
{switch(mode){case 0: OS0_0 OS1_0 OS2_0;case 2: OS0_0 OS1_0 OS2_1;case 4: OS0_0 OS1_1 OS2_0;case 8: OS0_0 OS1_1 OS2_1;case 16: OS0_1 OS1_0 OS2_0;case 32: OS0_1 OS1_0 OS2_1;case 64: OS0_1 OS1_1 OS2_0;default: OS0_0 OS1_0 OS2_0;}
}

量程进行选择的函数

void AD7606_SetRange(uint8_t range)//设置量程
{if(range == 1){RAGE_1;}else RAGE_0;
}

复位信号函数

void AD7606_Reset()//AD7606复位
{RST_0;More_Rst;RST_0;
}

初始化函数

void AD7606_Init()//AD7606初始化
{AD7606_SetRange(0);AD7606_Speed_Set(0);AD7606_Reset();CVA_1;CVB_1;CS_1;AD7606_ReadData();
}

起始信号函数

void AD7606_Init()//AD7606初始化
{AD7606_SetRange(0);//设置采样量程AD7606_SetSpeed(0);//设置采样速度AD7606_Reset();CVA_1;CVB_1;CS_1;AD7606_ReadData();
}

读单个字节函数

uint8_t AD7606_ReadByte(void)//读一个字节
{uint8_t usData = 0;uint8_t i; for (i = 0; i < 8; i++){  RD_0;AD7606_Delay();usData = usData << 1;if(Read_Dat){usData++;}RD_1;AD7606_Delay();}return usData;
}

读八个通道数据函数(BUSY拉低后进中断,进中断后就开始读取数据)

void AD7606_ReadData()//读八个通道的数据
{CS_0;for (uint8_t i = 0; i < 8; i++) {   adc_now[i] = AD7606_ReadByte();adc_now[i] <<= 8;adc_now[i] = adc_now[i] | AD7606_ReadByte();}CS_1;AD7606_Start();//读取数据结束后立马开始下一次转换
}

量程转换和数据处理函数

         for(uint8_t i=0;i<8;i++){if(adc_now[i] >> 15 == 1)//判断最高位是否为1{fushu_flag = 1;//负数标志位置1}adc_now[i] &= 0x7fff;//将最高位屏蔽掉s_volt[i] = (adc_now[i] * 5.0) / 32767;//5V量程 将数据转换为电压if(fushu_flag == 1)//对正负数进行判断{fushu_flag = 0;s_volt[i] = -s_volt[i];}}

遇到的问题以及总结

在调试过程中我发现和AGND连接在一起的脚一直都在0XFFFC到0X0001之间浮动,转换成十进制数也就是在0的上下浮动,所以我刚开始一直以为是错误的,所以就一直在对着一个正确的程序找错误,直到后来我接往引脚上接了一个3.3V的电压,它返回回来的数据不再是这个范围内的值,并经过换算是一个正确的电压值。后来才知道这个浮动是正常的,是AGND和采样时有的一点干扰使他有一些小范围的浮动,对于ADC来说这些都是正常的。

在测量过程中,由于AD7606的模拟电压参考点是2.5V,所以我输入3.3V的电压经过换算后得到的电压值为0.8V,所以这个需要双极性输入测电压,也就是一个通道接地,另一个通道测待测点电压,之后待测点电压就是被测电压值与地的被测电压值之间的差值,也称伪差分输入,双极性输入。

AD7606调试笔记相关推荐

  1. AD7606调试笔记:采集多路不正常,少采集几路就正常

    AD7606调试笔记:采集多路不正常,少采集几路就正常了 文章目录 AD7606调试笔记:采集多路不正常,少采集几路就正常了 问题描述: 查错方案: 处理速度不够 时序不对 解决办法 延时 转换完成读 ...

  2. 调试笔记--jlink 变量转实时波形小技巧

    调试笔记–jlink 变量转实时波形小技巧 上篇讲了jlink RTT组件在RAM中开辟一段内存,将printf字符串存入然后通过jlink调试接口读取RAM,将printf字符串在jlink-RTT ...

  3. 调试笔记--keil 测量周期小技巧

    调试笔记–keil 测量周期小技巧 本文参考安富莱专题教程第7期 http://www.armbbs.cn/forum.php?mod=viewthread&tid=87176&ext ...

  4. 调试笔记--keil 断点调试小技巧

    调试笔记–keil 断点调试小技巧 给变量打断点 调试不熟悉的项目时,卧槽!怎么这么多全局变量?这玩意又在那修改了??这个时候会给变量打断点就能省好多事. 将要监视的全局变量添加到watch窗口 选中 ...

  5. gpio驱动广播Android,[RK3288][Android6.0] 调试笔记 --- 通用GPIO驱动控制LED【转】

    Platform: ROCKCHIP OS: Android 6.0 Kernel: 3.10.92 由于板子没有lcd无法得知sd卡升级是否完成,因此使用LED显示. Recovery中升级完成后控 ...

  6. keil4怎么移植其他人的程序_【调试笔记】韦东山:在100ask_imx6ull上移植使用六轴传感器ICM20608...

    之前发了LCD调试笔记,大家很感兴趣,所以这次再来一篇:六轴传感器ICM20608驱动移植笔记,大家还需要什么移植笔记?可以留言.我们尽量满足. 1.1 移植思路 先找到驱动:也许内核里已经有,也许需 ...

  7. RK3399 GT1X触摸屏驱动调试笔记

    硬件环境 1.Firefly AIO-3399(AI)开发版: 2.恒智的5寸电容触摸屏800X480,I2C驱动支持GT5688. 操作系统 Android 7.2 for rockship Ste ...

  8. Rockchip基于RK3566/RK3568 WiFi AP6256调试笔记

    1.开发平台 CPU:RK3566 编译环境:Ubuntu18.04 内核版本:kernel 4.19 2.目的 因为RK3566/RK3568支持SDIO3.0并且向下兼有SDIO2.0接口,由于核 ...

  9. 雅马哈四轴机器人调试笔记

    雅马哈四轴机器人调试笔记 1.0 先简单说下硬件,如下图对着插就行,雅马哈四轴主要硬件有控制器跟机械手,机械手到控制器主要有4跟电机接口电缆,每2个轴有一个编码器接口电缆,每根轴有一个配置的数据备份电 ...

最新文章

  1. Win7 IIS7.5运行ASP时出现500错误的解决办法
  2. 【复习资料】设计模式
  3. LightOJ 1112 - Curious Robin Hood 树状数组
  4. 运维工程师必会的linux命令下载,运维工程师必会的109个Linux命令.pdf
  5. EasyUI界面显示中文格式(日期中文格式)
  6. [jQuery原理] jQuery基本结构
  7. 使用一个超简单的类实现一个简易服务器,明白Tomcat的运行机制
  8. ar开发 ue4_UE4 和 ARKit 入门
  9. HDU 1210 Eddy's 洗牌问题(foj1062) || FOJ1050 Number lengths水
  10. mac excel 函数
  11. 11年艺术学习“转投”数学,他出版首本TensorFlow中文教材,成为蚂蚁金服技术大军一员
  12. C++对象模型探索视频课程
  13. 【暑假】[实用数据结构]UVAlive 4670 Dominating Patterns
  14. 0xc0000225无法进系统_U盘装win10后无法进系统错误代码0xc0000225怎么修复
  15. 五个喜欢点赞图标动画特效(附源码,效果图)
  16. GPS+北斗定位借助Arduino的数值显示
  17. Service层需要接口吗
  18. Input.mousePosition
  19. Android资深开发者告诉你:简历这样写绝对吸引面试官眼球,面试电话接到手软(1)
  20. 【软件工程大作业】对于一款具有个性化推荐功能的购物网站的可行性分析

热门文章

  1. 中学生应该养成的良好习惯
  2. 【bzoj3240 洛谷P1397】矩阵游戏[NOI2013](矩阵乘法+卡常)
  3. vue前端生成二维码,实现扫码下载功能
  4. HTTP Error 503错误
  5. 计算机网络——路由器接口及静态路由配置
  6. java控制台编译_【java c#】通过控制台编译和运行程序//不依赖IDE
  7. Python 3.11 ,即将变得更快!
  8. 数据中心运营规划的基本原则
  9. 模拟电路学习-之容抗和感抗
  10. linux 卸载yum源,CentOS下rpm包与yum安装与卸载更新系统源