AD7606与STM32F103ZET6的串行通信

这篇具有很好参考价值的文章主要介绍了AD7606与STM32F103ZET6的串行通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

AD7606与STM32F103ZET6的串行通信

  本文是AD7606与STM32的串行通信的学习心得,可帮助你快速入门AD7606。

时序图的理解

  图一
AD7606与STM32F103ZET6的串行通信
  图二
AD7606与STM32F103ZET6的串行通信
  图三
AD7606与STM32F103ZET6的串行通信
  图四
AD7606与STM32F103ZET6的串行通信
  根据图一,一些引脚在置高或置低时的上升或下降沿会受时间影响,因此在编写代码时,一些对引脚的操作需要放在一起,且延时函数不能随意使用。
  图二是整体的一个时序框图,大体的逻辑就是在使用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与STM32F103ZET6的串行通信
  图上为计算公式,VIN为输入量,REF为ADC所选择的基准电压,一般使用内部基准电压REF=2.5V。上下两公式的选择,是由J2所接量程所决定。
  在程序中的计算公式:
AD7606与STM32F103ZET6的串行通信
  DB data[i]为AD所输出的二进制补码,可通过此方式计算出输入电压。

硬件电路连接

  串行工作方式:
AD7606与STM32F103ZET6的串行通信
  串行模式工作时,相关引脚连接方式:

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最终通过此口给单片机发送数据

实物连接图

AD7606与STM32F103ZET6的串行通信

软件设计

  部分参数的定义

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 这里使用了四个ADC
	cs2_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.函数中包含的部分变量为全局变量,因此没有在函数的局部进行定义。文章来源地址https://www.toymoban.com/news/detail-478483.html

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的串行通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用正点原子STM32F103ZET6精英板控制舵机转动实验保姆教程

    正点原子精英板一块 Jlink4线SWD下载线一根 精英板usb供电/下载线一根(负责给开发板供电) SG90舵机一个(三线:其中红线接5V电压,棕线接GED,橙黄色为信号线接开发板PB5引脚,舵机所给为3pin杜邦线母头,可用单根杜邦线(一头子一头母)将舵机线飞开接到精英板上)。 以

    2023年04月15日
    浏览(25)
  • STM32F103ZET6 封装 LQFP-144 ST意法 单片机芯片

    STM32F103ZET6 是意法半导体(STMicroelectronics)生产的一款基于 ARM Cortex-M3 内核的 32 位微控制器。它具有高性能、低功耗的特点,广泛应用于各种嵌入式系统和工业应用中。STM32F103ZET6 的主要特点如下: 内核:ARM Cortex-M3,工作频率最高可达 72MHz。 存储器:64KB SRAM,512KB FLASH。 外

    2024年04月22日
    浏览(35)
  • STM32---stm32f103c8t6与stm32f103zet6之间的代码移植转换

    目录 一、将c8t6转换为zet6 1、修改启动文件 2、修改芯片 3、将MD修改为HD  4、下载器的修改 5、修改完成,编译成功  二、将zet6转换为c8t6 最终结果如下:   将STM32F103C8改为STM32F103ZE   基本相同,反向即可。    

    2024年02月06日
    浏览(17)
  • MDK Keil5 创建Stm32工程-理论篇(这里以Stm32F103Zet6为例)

    整个工程可以粗略的划分为几个文件夹: BSP 底层驱动比如GPIOTimer等驱动文件 CMSIS 内核相关的文件 Firmware 生成的固件下载文件 Mycode 用户编写的相关文件,主要编写的文件都在这个文件夹里 Project 工程文件 startup 芯片启动文件 STM32F10x_FWLib 标准库文件 USER 主函数等文件 readm

    2023年04月24日
    浏览(47)
  • 【LVGL】STM32F103ZET6——LVGL_GUI_GUIDER移植过程成功

    STM32F103ZET6——LVGL_GUI_GUIDER移植过程 STM32F103ZET6——LVGL_GUI_GUIDER移植过程 使用工具: 1.LVGL库8.02 2.GUI_GUIDER 3.keil5 设计出来的总体是这样 提示:以下是本篇文章正文内容,下面案例可供参考 这部分有很多大佬已经写的很成熟了,我就不赘述了 安装包在这里硬件资源 右上角可将

    2024年02月12日
    浏览(19)
  • 正点原子stmf103zet6代码移植为stm32f103c8t6(库函数版)

    目录 1、打开正点原子的工程模板template, 点击魔术棒  2、 修改芯片型号 为stm32f103c8

    2024年02月01日
    浏览(25)
  • 基于STM32F103ZET6使用STM32CubeMX配置FSMC模块驱动LCD屏(基于正点原子历程)

    在学习STM32的过程中,刚好学到了LCD屏,我使用的是STM32F103ZET6,屏幕是正点原子的。但是在我自己新建工程点亮显示LCD屏时遇到了很多问题。解决之后分享在此,希望能帮助到遇到此困惑的朋友。 想要快速驱动LCD屏请直接跳转到CubeMX配置 FSMC全名叫可变静态存储控制器(Fle

    2024年02月15日
    浏览(21)
  • STM32F103ZET6 GPIO工作模式介绍+使用寄存器点亮第一个LED灯

    目录  GPIO的工作模式介绍 1.输入模式(模拟、上拉、下拉、浮空) 2.输出模式(推挽/开漏) 3.复用功能(推挽/开漏) 4.模拟输入输出(上下拉无影响) 如何使用寄存器点亮第一个LED灯         在输入模式时,施密特触发器打开,输出被禁止。可通过输入数据寄存器 GPIOx_

    2024年02月06日
    浏览(20)
  • 基于STM32F103ZET6单片机驱动SM16306SJ控制8个LED灯的系统设计

    1.设计要求:使用stm32f103zet6精英开发板  采用SM16306SJ驱动8个LED灯。 2.原理图 3.代码 4.实物效果图 备注:1 硬件上有一个LED灯坏了,所以才亮了7个LED灯            2 一个SM16306SJ最多可以驱动16个LED灯            3 SM16306SJ跟MBI5020程序通用

    2024年04月17日
    浏览(20)
  • 基于STM32F103ZET6的(单/三)路HC-SR04超声波测距+TFTLCD实时显示+距离报警

    一、成果图 说明:本程序的源码地址: https://github.com/Lfy-YF/Campus-Project            CSDN下载连接:https://download.csdn.net/download/weixin_58849239/87829470 源码包含四个版本,涉及单路测距、三路测距、增加外部中断(用来版本记录的~) 运行效果: 本程序实现脱机测距,共左中右

    2024年02月11日
    浏览(15)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包