AD7606与STM32F103ZET6的串行通信
AD7606与STM32F103ZET6的串行通信
本文是AD7606与STM32的串行通信的学习心得,可帮助你快速入门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则数据为正数)
计算公式的理解
图上为计算公式,VIN为输入量,REF为ADC所选择的基准电压,一般使用内部基准电压REF=2.5V。上下两公式的选择,是由J2所接量程所决定。
在程序中的计算公式:
DB data[i]为AD所输出的二进制补码,可通过此方式计算出输入电压。
硬件电路连接
串行工作方式:
串行模式工作时,相关引脚连接方式:
rst | 复位引脚 |
convstB | 可以接在一起,当同时置低时 进行模拟量采样并处理 |
convstA | |
STby | 控制工作模式,正常工作时一般直接接高电平 |
OS12 | 用于选择过采样倍率 |
OS11 | |
OS10 | |
busy | 标志位,标志AD正在进行模拟量采样并处理 |
cs | 片选信号,置低后标志可以开始输出模拟量 |
rd | CS置低后的每一个上升沿输出每一位模拟量 |
DoutA(DB7) | 数据输出线 |
D15 | 直接接地 |
SER | 连接3.3 ,用于设定ADC为串行工作模式 |
5V | |
GND | |
RANGE | J2用于选择输入电压的范围,影响计算公式 |
PB7 | 数据口,ADC最终通过此口给单片机发送数据 |
实物连接图
软件设计
部分参数的定义
uint8_t read_flag=1;
s16 DB_data[8]={0};
u8 i;
int32_t line=0;
int32_t reminder[32][32]={0};
uint8_t temp;
初始化函数
void AD7606_Init(void)
{convstA_Set;//同时拉高convstB_Set;delay_ms(1);STby_Set;//一直置高clk1_Set;//针对CLK和CS的操作尽可能地放在一起cs1_Set; clk2_Set;//根据自己的需求连接几个CS和CLK 这里使用了四个ADCcs2_Set;clk3_Set;cs3_Set;clk4_Set;cs4_Set;OS10_Reset;//过采样模式的初始化OS11_Reset;OS12_Reset;AD7606_reset(); delay_ms(1);AD7606_startconvst();
}
开始转化函数
COA 与COB均是上升沿触发,因此需要同时拉低再拉高。
void AD7606_startconvst(void)
{ convstA_Reset; convstB_Reset; delay_us (1);convstA_Set;convstB_Set;
}
复位函数
REST是上升沿触发,因此先拉低再拉高再拉低。
void AD7606_reset(void)
{ rst_Reset;delay_us (1);rst_Set; delay_us(1);rst_Reset;
}
读数据函数,此处定义STM32的CO口与单片机的PB7数据线相连,读取AD转换的数据。
void AD7606_read_data1(s16 * DB_data)
{ u8 i,j; for(i=0;i<8;i++) //循环8次是因为有8个通道{u16 DB_data1 = 0;//用于存储读出引脚的值cs1_Reset; //CS和CLK的引脚控制函数尽量放在一起delay_us(1); for(j=0;j<16;j++)//循环16次是因为寄存器可以存16位{ clk1_Reset;//CLK拉低开始输出delay_us(1); DB_data1 = ((u16)(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0))<< (15-j)) + DB_data1 ;//AD输出为二级制补码,此处涉及部分寄存器的知识clk1_Set;delay_us(1); } cs1_Set; DB_data[i] = (u16)DB_data1;//此处大致意思为将AD通道输出的值赋给一个存储内容为8的数组} read_flag++;//多ADC使用时的标志位
}
遍历ADC函数
注:1.此处的函数是使用一块STM32驱动四块AD7606,read_flag的使用是为了使相应的AD7606工作,如果你使用一块AD7606那么你看一个if里的函数就足够了。
2.函数中包含的部分变量为全局变量,因此没有在函数的局部进行定义。
void throught_all(void)
{AD7606_startconvst(); temp = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5); //判断BUSY线的反馈的值来决定对AD的操作while(temp == 0) {delay_us(1);temp = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5); }if(read_flag==1){AD7606_read_data1(DB_data); //此函数返回一个数组,此数组的每一位中存放着相应通道采样的值,之后对该数组进行相应操作即可for(i=0;i<8;i++){delay_us(100);line=2*i+1;/if(flag==0){column=m+1;}if(flag==1){column=m+17;}reminder[line-1][column-1]=(DB_data[i]*10000.0/32768);//计算公式的体现} }if(read_flag==2)//以下为其他3个AD的操作程序{AD7606_read_data2(DB_data);for(i=0;i<8;i++){delay_us(100);line=2*i+17;if(flag==0){column=m+1;}if(flag==1){column=m+17;}reminder[line-1][column-1]=(DB_data[i]*10000.0/32768);}}if(read_flag==3){AD7606_read_data3(DB_data); for(i=0;i<8;i++){delay_us(100);line=2*i+2;if(flag==0){column=m+1;}if(flag==1){column=m+17;}reminder[line-1][column-1]=(DB_data[i]*10000.0/32768);}}if(read_flag==4){AD7606_read_data4(DB_data); for(i=0;i<8;i++){delay_us(100);line=2*i+18;if(flag==0){column=m+1;}if(flag==1){column=m+17;}reminder[line-1][column-1]=(DB_data[i]*10000.0/32768); }}
}
AD7606与STM32F103ZET6的串行通信相关推荐
- AD7606(并行8080方式)的STM32F103ZET6配置
注:程序压缩包在我的下载中心有,逐个发有点多,请大家谅解,而且这个配置下面就是,主程序无非就是调用 最近在调试AD7606,发现网上的资料都是STM32F4系列的8080程序,故此将自己调试成功的F1 ...
- AD7606调试笔记
文章目录 AD7606接线图 AD7606SPI通讯接口说明 AD7606时序图 AD7606时序图讲解 AD7606 STM32引脚配置 AD7606 程序模块 遇到的问题以及总结 由于训练电赛,需 ...
- AD7606应用笔记
目录 # AD7606接线图 # AD7606SPI通讯接口说明 # AD7606时序图 # AD7606时序图讲解 # AD7606 STM32引脚配置 # AD7606 程序模块 由于训练电赛,需 ...
- STM32F103ZET6+USART+串口通信
STM32F103ZET6+USART+串口通信 一. 通信概述 通信就是数据交换.信息交换.嵌入式系统中,微控制器与其他外围设备相互连接,系统各部件之间进行数字信号/数据的传输就是通信,无论是大型嵌 ...
- (解释)单片机与各种外围设备(Flash、RAM、网络控制器、A/D、传感器、MCU等)进行直接串行通信通常采用( D)接口
单片机与各种外围设备(Flash.RAM.网络控制器.A/D.传感器.MCU等)进行直接串行通信通常采用( D)接口. A. RS232C B. RS485 C. COM D. SPI A:RS-23 ...
- AD7606数据采集板使用ASCII码传递BINARY数据
■ 问题提出 在 带有128KB缓存的AD7606模拟采集板 后面更新了不带板内缓冲区的C51程序.采集板与计算机之间存在两种实时数据通道: 通过USB-RS232转接串口,波特率为460800 通过 ...
- 带有128KB缓存的AD7606模拟采集板
01简介 构建多路16bit的AD采集器,并可以进行高速缓存,对于采集静态电压,还是动态波形都非常有利.在23LC1024四线访问数据博文中介绍了对扩展SPI接口RAM(128kB)的四线制高速访问的 ...
- 基于Virtex-6 FPGA的三种串行通信协议测试及对比
在高性能雷达信号处理机研制中,高速串行总线正逐步取代并行总线.业界广泛使用的Xilinx公司Virtex-6系列FPGA支持多种高速串行通信协议,本文针对其中较为常用的Aurora 8B/10B和PC ...
- 【ARM】arm串行通信
异步通信 所谓异步通信,是指数据传送以字符为单位,字符与字符间的传送是完全异步的,位与位之间的传送基本是同步的. 异步串行通信的特点可以概括如下 1)以字符为单位传送信息 2)相邻两字符间的间隔是任意 ...
最新文章
- 【组队学习】【26期】图神经网络
- c语言如何持续输入字符直到指定字符结束_《小白学C》第三章 常用输入输出函数...
- ecshop根目录调用_ecshop优化修改sitemap.xml到根目录
- java 加减运算_JAVA日期加减运算 | 学步园
- 【Grafana】函数
- 基于matlab的局放仿真,基于MATLAB/Simulink系统仿真权威指南
- numpy更改形状、类型
- 构造器是什么?(Java篇)
- 从包中构建瓦片服务器
- apple watch3连android,Apple watch 可以连android手机吗?
- 操作系统中抢占式和非抢占式内核的区别
- Ghost in IE6.web标准网页IE6中的幽灵。
- Windows系统服务相关的端口
- hdu-1242 dfs+各种剪枝
- Android 开发即时聊天工具 YQ 《更新》(源码下载)
- ae教程 (三)三维空间合成(一)
- 【高等数学】微分与全微分的几何意义的不同
- php 在服务器运行不起,PHP Cookies在localhost上运行良好,但在实时服务器上不起作用...
- docker exec -it进入及退出容器
- springCloud项目不能向EurekaServer 注册多个EurekaClient时(端口不一致)方法及踩坑经历
热门文章
- 盘点3大智能家居系统|苹果HomeKit、亚马逊Alexa、谷歌Home?
- 阿里云服务器的购买、基本配置、(xshell)远程连接、搭建环境、设置安全组、域名备案、申请ssl证书
- 面试题:在9个点上画十条直线,每条直线上至少三个点
- Git之版本回退和分支合并
- 统计学与计算机考研学校排名,2018统计学考研院校排名
- 华钜同创:亚马逊开店六个日常运营小技巧
- 母亲大人辛苦了(snowfall.jquery实现爱心掉落)
- windows GDI+ 绘图的简单封装
- 华为领衔,“5G+摄像头”拿下双影帝,多家国产手机凭借拍照入围MWC最佳演员...
- 如何理解容器,容器化的由来?它有何优缺点?