电赛总结(二)——AD芯片总结之AD7715
一、特性参数
1、16位无失真AD转换器
2、增益可调,在1,2,32,128可切换。
3、数字地和模拟地分开,可以减少噪声。
4、具有较大的输出电流,有比较好的带载能力。
二、管脚排列
三、引脚功能
引脚名称 | 功能 |
SCLK | 串行时钟,施密特逻辑输入。将一个外部的串行时钟加于这一输入端口,以访问AD7715 的串行数据。和单片机传输数据时的控制时钟 |
MCLKIN | 为转换器提供主时钟信号。能以晶体/谐振器或外部时钟的形式提供。晶体/谐振器可以接在MCLKIN 和MCLKOUT 二引脚之间。此外,MCLKIN 也可用CMOS 兼容的时钟驱动, 而MCLKOUT 不连接。时钟频率的范围为500kHz~5MHz |
MCLKOUT | 当主时钟为晶体/谐振器时,晶体/谐振器被接在MCLKIN 和MCLKOUT 之间。如果在MCLKIN 引脚处接上一个外部时钟,MCLKOUT 将提供一个反相时钟信号。这个时钟可以用来为外部电路提供时钟源,且可以驱动一个CMOS 负载。如果用户不需要,MCLKOUT 可以通过时钟寄存器中的CLKDIS位关掉。这样,器件不会在MCLKOUT 脚上驱动电容负载而消耗不必要的功率 |
CS’ | 片选,低电平有效的逻辑输入,选择AD7715。将该引脚接为低电平,AD7715 能以三线接口模式运行(以SCLK、DIN 和DOUT 与器件接口)。在串行总线上带有多个器件的系统中,可由CS’对这些器件作出选择,或在与AD7715通信时,CS’可用作帧同步信号 |
RESET | 复位输入。低电平有效的输入,将器件的控制逻辑、接口逻辑、校准系数、数字滤波器和模拟调制器复位至上电状态 |
AVDD | 模拟电源电压,5V |
AVIN(+) | 差分模拟输入的正输入端 |
AVIN(-) | 差分模拟输入的负输入端 |
REFIN(+) | 基准输入端,基准输入是差分的,并规定REFIN(+)必须大于REFIN(-)。REFIN(+)可以取VDD 和GND 之间的任何值 |
REFIN(-) | 基准输入端,REFIN(-)可以取VDD 和GND 之间的任何值,且满足REFIN(+)大于REFIN(-) |
AGND | 模拟地 |
DRDY’ | 逻辑输出。这个输出端上的逻辑低电平表示可从AD7705/7706 的数据寄存器获取新的输出字。完成对一个完全的输出字的读操作后,DRDY’引脚立即回到高电平。如果在两次输出更新之间,不发生数据读出,DRDY’将在下一次输出更新前500×tCLKIN 时间返回高电平。当DRDY’处于高电平时,不能进行读操作,以免数据寄存器中的数据正在被更新时进行读操作。当数据被更新后,DRDY’又将返回低电平。DRDY’也用来指示何时AD7705/7706 已经完成片内的校准序列. |
DOUT | 串行数据输出端 |
DIN | 串行数据输入端 |
DVDD | 数字电源电压,可以是+5V,也可以是3.3V |
DGND | 数字地 |
四、片内寄存器
1、概述
只有四个寄存器,分别是通信、设置、数据还有校准寄存器。一般来说只是用通信和设置以及数据寄存器。而且每次进行操作的时候是先对通信寄存器进行操作,之后再跳到所选的下一个寄存器进行读写。
2、通信寄存器
管脚名称 | 功能 |
0/DRDY’ | 这意味必须写“0”,否则不能继续进行对寄存器的操作。 |
ZERO | 这一位必须写“0”,否则芯片不一定能正常工作。 |
RS1– RS0 | 选择下一个进行通讯的寄存器 |
STBY | “1”表示进入低功耗模式,功耗只有10uW,“0”则是正常工作,一般默认为“0”即可。 |
G1-G0 | 设置增益倍数 |
3、设置寄存器
4、数据寄存器
数据寄存器是一个16 位只读寄存器,它包含了来自AD7715 最新的转换结果。如果通信寄存器将器件设置成对该寄存器写操作,则必定会实际上发生一次写操作以使器件返回到准备对通信寄存器的写操作,但是向器件写入的16 位数字将被AD7715 忽略。
五、芯片外围电路图
六、STM32F103ZET驱动程序(以IO口模拟方式)
#ifndef __ADC7715_H #define __ADC7715_H #include "stm32f10x.h" #include "pbdata.h" #include "spi.h" //自编函数 #include "timer.h" #include "gpio.h" #include "baseFunc.h" #define SCLK Pin0 #define DIN Pin1 #define DOUT Pin2 #define DRDY Pin3 void WriteAD7715Data(u8 data); void delay_Ms(int time); u32 ReadAD7715Data(u8 byte); void InitAD7715(void); u32 GetAD7715Num(void); #endif
#include "adc7715.h" void delay_Ms(int time) { u32 i,j; for(i=time;i>0;i--) { for(j=0;j<512;j++) { } } } void WriteAD7715Data(u8 data) { u8 i; for(i=0;i<8;i++) { if( (data&0x80)!=0 ) { set_outH(GPIOA,DIN); } else { set_outL(GPIOA,DIN); } data=data<<1; delay_Ms(10); set_outH(GPIOA,SCLK); delay_Ms(10); set_outL(GPIOA,SCLK); delay_Ms(10); set_outH(GPIOA,SCLK); delay_Ms(10); } set_outH(GPIOA,DIN); delay_Ms(10); } u32 ReadAD7715Data(u8 byte) { u8 i; u32 data = 0; for(i=0;i<byte*8;i++) { set_outH(GPIOA,SCLK); delay_Ms(10); set_outL(GPIOA,SCLK); delay_Ms(20); data=data<<1; if(read_in(GPIOA,DOUT)==1) { data=data+1; } set_outH(GPIOA,SCLK); delay_Ms(10); } return data; } void InitAD7715(void) { set_out(GPIOA,SCLK|DIN); set_FIN(GPIOA,DOUT|DRDY); WriteAD7715Data(0x10); WriteAD7715Data(0x66); } u32 GetAD7715Num(void) { while(read_in(GPIOA,DRDY)==1); WriteAD7715Data(0x38); return ReadAD7715Data(2); }