完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1. AD7705简介
AD7705/7706 是应用于低频测量的 2/3 通道的模拟前端。该器件可以接受直接来自传感器的低电平的输入信号,然后产生串行的数字输出。利用Σ-∆转换技术实现了 16 位无丢失代码性能。选定的输入信号被送到一个基于模拟调制器的增益可编程专用前端。片内数字滤波器处理调 制器的输出信号。通过片内控制寄存器可调节滤波器的截止点和输出更新速率,从而对数字滤波 器的第一个陷波进行编程。 AD7705/7706 只需 2.7~3.3V 或 4.75~5.25V 单电源。AD7705 是双通道全差分模拟输入,而 AD7706 是 3 通道伪差分模拟输入,二者都带有一个差分基准输入。当电源电压为 5V、基准电压 为 2.5V 时,这二种器件都可将输入信号范围从 0~+20mV 到 0~+2.5V 的信号进行处理。还可处 理±20mV~±2.5V 的双极性输入信号,对于 AD7705 是以 AIN(-)输入端为参考点,而 AD7706 是 COMMON 输入端。当电源电压为 3V、基准电压为 1.225V 时,可处理 0~+10mV 到 0~+1.225V 的单 极性输入信号,它的双极性输入信号范围是±10mV 到±1.225V。因此,AD7705/7706 可以实现 2/3 通道系统所有信号的调理和转换。 CMOS 结构确保器件具有极低功耗,掉电模式减少等待时的功耗至 20μW(典型值)。 AD7705/7706 采用 16 脚塑料双列直插(DIP)和 16 脚宽体(0.3 英寸)SOIC 封装和 16 脚 TSSOP 封装。如图1为AD7705模块 1.1 特性参数 英文手册是这样描述的 简要概括一下 1. 16位无丢失代码性AD转化器 2. 芯片5V供电时,REF建议电压范围是1V~3.5V,推荐值2.5V; 3. 芯片3V供电时,REF建议电压范围是1V~1.75V,推荐值1.225V,模块上参考电压芯片是REF192-2.048,也就是2.048V,显然都不是推荐值,且这已经超出了3V供电的推荐范围,因此电路设计不规范。 4. 双通道差分输入 5. 基准电压为2.5V时,在单极性信号下,输入范围是0到2.5V,在双极性输入下,输入范围是-1.25到+1.25 6. 低功耗CMOS芯片,功耗一般为20uW 7. 可编程,可编程增益,以及降噪参数等。 1.2 功能方框图 1.3 引脚排列及其功能 (1) 引脚排列图 (2) 引脚功能表 [tr]管脚名称功能[/tr]
2. 片内寄存器 AD7705/7706 片内包括 8 个寄存器,这些寄存器通过器件的串行口访问。第一个是通信寄存器,它管理通道选择,决定下一个操作是读操作还是写操作,以及下一次读或写哪一个寄存器。所有与器件的通信必须从写入通信寄存器开始。上电或复位后,器件等待在通信寄存器上进行一次写操作。这一写到通信寄存器的数据决定下一次操作是读还是写,同时决定这次读操作或写操作在哪个寄存器上发生。所以,写任何其它寄存器首先要写通信寄存器,然后才能写选定的寄存器。 在编写程序的过程中主要使用了三个寄存器分别为:通信寄存器、设置寄存器和时钟寄存器,就详细讲解这三个。 2.1 通信寄存器 通信寄存器是一个8 位寄存器,既可以读出数据也可以把数据写进去。所有与器件的通信必须从写该寄存器开始。写上去的数据决定下一次读操作或写操作在哪个寄存器上发生。一旦在选定的寄存器上完成了下一次读操作或写操作,接口返回到通信寄存器接收一次写操作的状态。 2.1.1 通讯寄存器手册说明 英文版手册 中文手册 [tr]名称功能[/tr]
2.1.2 通信寄存器配置(RS2=0,RS1=0,RS0=0) 英文手册给了这么这么一个表格为了,为了避免一些人不喜欢看英文的手册,也将中文版的手册附上。编写代码的时候一定要对照这英文手册看,主要是中文手册会有些翻译错误,误导大家编写程序导致之后编写的程序错误很难找出。 步骤如下:
设置寄存器是一个8位寄存器,既可以读数据也可以写数据。 2.2.1 设置寄存器手册说明 英文手册 中文手册 [tr]名称功能[/tr]
|
|
|
|
2.2.2 设置寄存器配置(RS2=0,RS1=0,RS0=1)
配置一个设置寄存器步骤如下:
时钟寄存器是一个可以读/写数据的 8 位寄存器。 2.3.1 时钟寄存器手册说明 英文手册 中文手册 [tr]名称功能[/tr]
2.3.2 时钟寄存器配置(RS2=0,RS1=1,RS0=0) 配置一个时钟寄存器步骤如下:
数据寄存器是一个 16 位只读寄存器,它包含了来自 AD7705/7706 最新的转换结果。如果通信寄存器将器件设置成对该寄存器写操作,则必定会实际上发生一次写操作以使器件返回到准备对通信寄存器的写操作,但是向器件写入的 16 位数字将被 AD7705/7706 忽略。 2.5 测试寄存器 (RS2=1,RS1=0,RS0=0) 测试寄存器用于测试器件时。建议用户不要改变测试寄存器的任何位的默认值(上电或复位时自动置入全 0),否则当器件处于测试模式时,不能正确运行。 2.6 零标度校准寄存器(RS2=1,RS1=1,RS0=0) AD7705/7706 包含几组独立的零标度寄存器,每个零标度寄存器负责一个输入通道。它们皆为 24 位读/写寄存器,24 位数据必须被写之后才能传送到零标度校准寄存器。零标度寄存器和满标度寄存器连在一起使用,组成一个寄存器对。每个寄存器对对应一对通道,见表 7。当器件被设置成允许通过数字接口访问这些寄存器时,器件本身不再访问寄存器系数以使输出数据具有正确的尺度。结果,在访问校准寄存器(无论是读/写操作)后,从器件读得的第一个输出数据可能包含不正确的数据。此外,数据校准期间,校准寄存器不能进行写操作。这类事件可以通过以下方法避免:在校准寄存器开始工作前,将模式寄存器的 FSYNC 位置为高电平,任务结束后,又将其置为低电平。 2.7 满标度校准寄存器(RS2=1,RS1=0,RS0=1) 3. STM32F10x驱动程序 AD7705采用的SPI通讯协议,这里默认大家已经会C语言,SPI通讯协议了这里不细讲,头文件写法也不讲。 如果有同学还不清楚SPI的话这里我给出正点原子的B站视频网站:视频 3.1 SPI 代码 3.1.1 SPI与STM32引脚连接图 3.1.2 SPI.H代码 #ifndef __SPI_H #define __SPI_H #include "sys.h" #include "stm32f10x_spi.h" #define CLK Pin5 #define DOUT Pin6 #define Din Pin7 #define DRDY Pin8 #define CS_ADC_LOW() GPIO_ResetBits(GPIOA,GPIO_Pin_4) #define CS_ADC_HIGH() GPIO_SetBits(GPIOA,GPIO_Pin_4) void SPI1_Init(void); u8 SPIx_ReadWriteByte(u8 TxData); #endif 3.1.3 SPI.C代码 #include "spi.h" #include "delay.h" /* 复用功能 SPI1_REMAP = 0 SPI1_NSS PA4 CS SPI1_SCK PA5 CLK SPI1_MISO PA6 DOUT SPI1_MOSI PA7 DIN PC4 DRDY */ SPI_InitTypeDef SPI_InitStructure; void SPI1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_SPI1|RCC_APB2Periph_AFIO, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;// AdDrdy GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;//PC4配置成上拉输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //SPI CS GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOC,GPIO_Pin_4); GPIO_SetBits(GPIOA,GPIO_Pin_4); /* Configure SPI1 pins: SCK, MISO and MOSI */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP ; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); SPI_Cmd(SPI1, DISABLE); //失能能SPI外设 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工 SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构 SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //选择了串行时钟的稳态:时钟悬空高 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //数据捕获于第二个时钟 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始 SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式 SPI_Init(SPI1, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器 SPI_Cmd(SPI1, ENABLE); //使能SPI外设 CS_ADC_LOW(); SPIx_ReadWriteByte(0xff);//启动传输 CS_ADC_HIGH(); } //SPIx 读写一个字节 //TxData:要写入的字节 //返回值:读取到的字节 u8 SPIx_ReadWriteByte(u8 TxData) { u8 retry=0; while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位 { retry++; if(retry>200)return 0; } SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个数据 retry=0; while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); //检查指定的SPI标志位设置与否:接受缓存非空标志位 { retry++; if(retry>200)return 0; } return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据 } 3.2 AD7705程序 3.2.1 AD7705.H #ifndef __AD7705_H #define __AD7705_H #include "spi.h" void AD7705_WriteByte(u8 Dst_Addr); void Init_AD7705(u8 chnanel); u16 GetData7705_CH1(void); u16 GetData7705_CH2(void); void ADC_7705(void); void ADC_7705_double(void); #endif 3.2.1 AD7705.C #include "ad7705.h" #include "spi.h" #include "oled.h" #include "usart.h" #include "math.h" #include "delay.h" #include "beep.h" //写数据 void AD7705_WriteByte(u8 Dst_Addr) { CS_ADC_LOW();//使能器件 delay_us(20); SPIx_ReadWriteByte(Dst_Addr); delay_us(100); CS_ADC_HIGH();//使能器件 } /********AD7705初始化函数***********/ void Init_AD7705(u8 chnanel) { u8 i; for(i=0;i<150;i++)/* 多于连续32个 DIN=1 使串口复位 */ { AD7705_WriteByte(0xff);//持续DIN高电平写操作,恢复AD7705接口 } delay_ms(1); switch(chnanel) { case 1: AD7705_WriteByte(0x20); /* 写时钟寄存器选中ch1*/ AD7705_WriteByte(0x0f); /* 4.9152MHz时钟,250Hz数据更新速率 */ AD7705_WriteByte(0x10); /*选择设置寄存器,使用chnanel 1*/ AD7705_WriteByte(0x4c); //写设置寄存器 ,设置成双极性、无缓冲、增益为2、滤波器工作、自校准 break; /*有更改,时钟寄存器设为0x0a,4.9152MHz时钟,500Hz数据更新速率,*/ case 2: AD7705_WriteByte(0x21); /* 写时钟寄存器选中ch2 */ AD7705_WriteByte(0x0f); /* 4.9152MHz时钟,500Hz数据更新速率 */ AD7705_WriteByte(0x11); /*选择设置寄存器,使用chnane 2*/ AD7705_WriteByte(0x4c); //写设置寄存器,设置成双极性、无缓冲、增益为2、滤波器工作、自校准 break; default: break; } } /* 读AD7705转换数据 输入通道channel */ u16 GetData7705_CH1(void) { u16 temp1 = 0; u16 DataL = 0; u16 DataH = 0; Init_AD7705(1); //初始化通道1 delay_ms(1); AD7705_WriteByte(0x39); //选中CH1数据寄存器读 while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_4==1)){}//待数据准备好AdDrdy=0 CS_ADC_LOW(); //使能器件 delay_us(20); DataH = SPIx_ReadWriteByte(0xff); DataL = SPIx_ReadWriteByte(0xff); delay_us(100); CS_ADC_HIGH(); //取消片选 DataH = DataH << 8; temp1 = DataH | DataL; return temp1; } /* 读AD7705转换数据 输入通道channel */ u16 GetData7705_CH2(void) { u16 temp2 = 0; u16 DataL = 0; u16 DataH = 0; Init_AD7705(2); //初始化通道2 delay_ms(1); AD7705_WriteByte(0x38); //选中CH2数据寄存器读 while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_4==1)); //待数据准备好AdDrdy=0 CS_ADC_LOW(); //使能器件 delay_us(20); DataH = SPIx_ReadWriteByte(0xff); DataL = SPIx_ReadWriteByte(0xff); delay_us(100); CS_ADC_HIGH(); //取消片选 DataH = DataH << 8; temp2 = DataH | DataL; return temp2; } //数据处理 extern u8 num1[]; extern u32 l_ncm1; extern u8 num2[]; extern u32 l_ncm2; void ADC_7705(void) { u16 RCH1_16bit,RCH2_16bit; RCH1_16bit = GetData7705_CH1(); l_ncm1 = (u32)(RCH1_16bit*(25000.0/65535)); //算出通道1电压 RCH2_16bit = GetData7705_CH2(); l_ncm2 = (u32)(RCH2_16bit*(25000.0/65535)); //算出通道2电压 num1[0] = l_ncm1/10000+'0'; num1[2] = (l_ncm1%10000)/1000+'0'; num1[3] = (l_ncm1%1000)/100+'0'; num1[4] = (l_ncm1%100)/10+'0'; num1[5] = l_ncm1%10+'0'; num2[0] = l_ncm2/10000+'0'; num2[2] = (l_ncm2%10000)/1000+'0'; num2[3] = (l_ncm2%1000)/100+'0'; num2[4] = (l_ncm2%100)/10+'0'; num2[5] = l_ncm2%10+'0'; if(l_ncm2>8500|l_ncm2<8200) { BEEP=!BEEP; delay_ms(10); l_ncm2=0; } else { BEEP=0; } } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1627 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1550 浏览 1 评论
984 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
688 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1601 浏览 2 评论
1867浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
650浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
518浏览 3评论
536浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
506浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 23:15 , Processed in 0.911425 second(s), Total 81, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号