3.3V/5V供电、双极性±10V输入 - AD7895高速ADC设计

       AD采样的最高电压是不能超过供电电压VCC的,在常见的开发板和电路中,系统供电电压不超过5V,大部分的AD芯片的采样范围也不超过0-5V,如果是双极性采样芯片,大多都需要双极性供电。总之,能满足5V以下单电源供电、能双极性采样且采样范围为±10V的芯片真的少之又少。这里,分享一篇我的电路设计,采用3V3电源供电,使用±10V电压采样。 

开发环境:

硬件平台:STC15
软件平台:Keil uVision
开发语言:C语言

AD7895详情:

       AD7895是一款快速、12位ADC,采用+5 V单电源供电,提供8引脚小型DIP和8引脚SOIC两种封装。该器件内置一个3.8微秒(µs)逐次逼近型模数转换器、一个片内采样保持放大器、一个片内时钟和一个高速串行接口。
AD7895通过一个高速串行接口端口输出数据,这个双线串行接口具有一个串行时钟输入和一个串行数据输出,通过外部串行时钟可访问该器件中的串行数据。
除线性度、满量程和失调误差等传统直流精度规格外,AD7895的动态性能参数也做了详细规定,包括谐波失真和信噪比。
器件可接受的模拟输入范围为±10 V(AD7895-10)、±2.5 V(AD7895-3)、0 V至2.5 V(AD7895-2),采用+5 V单电源供电,最大功耗仅20 mW。
       AD7895提供两种采样模式:一种是高采样速率模式;另一种是针对低功耗应用的专有自动省电模式,即一旦完成转换,器件便自动进入省电模式,并在下一个转换周期开始前“唤醒”。
器件提供两种封装:8引脚、0.3英寸宽、小型塑料双列直插式封装(小型DIP);以及8引脚小形集成封装(SOIC)。

优势与特点
特点:1)快速12位ADC,转换时间为3.8微
秒    2)8引脚小型DlP和SOIC封装    3)5 V单电源供电    4)高速、易用的串行接口    5)高速、易用的串行接口     6)片内采样保持放大器,高输入阻抗                     
输入范围:±10 V(AD7895-10)、±2.5 V(AD7895-3)、0 V至+2.5 V(AD7895-2)        
低功耗:20 mW(最大值)                                

优势:1)单5V电源供电    2)双极性输入    3)最高可达±10V的测量量程

电路图设计:

       官方手册里给出了如下AD7895与51单片机的连接图,采用的是中断的方式触发UART的方式0接收数据。在这里,不推荐大家使用UART接收,在浪费一个串口资源的同时,还不具有与STM32等单片机开发的兼容性(P3.0和P3.1一般留作程序下载口)。所以,将P3.0和P3.1换成其他任意的GPIO口就行了,中断方式不变。根据数据读取的是时序要求,从AD7895的缓存器中读取数据即可。

       为了兼容设计,使用了3.3V单片机,模块采用3.3V输入,通过一个 TPS61040 DC-DC芯片升压为5V给AD7895供电(若用5V单片机,请忽略),电源基准可以TL431即可,如果AD采样精度有较高要求,建议采用AD680或者AD780作为电源基准。下面给出一个采用STC15设计的部分电路原理图,该原理图将AD部分接到STM32等其他3.3V硬件同样可以使用。

代码设计:

       代码设计的关键就是要读懂芯片每一个管脚的功能和用法,读懂数据读取的是时序要求。官方手册的时序图如下:

       引脚功能介绍:

REF_IN:电压基准输入,参考电压2.5V
Vin:模拟信号输入端-10V-+10V
SCLK:串行时钟输入,应用于从AD7895中读取串行数据,数据在下降沿后10ns有效,需要一个快速时钟
SDATA:数据输出串行口,前四位为四个前导0,后12位为补码输出
BUSY:转换状态
CONVST:转换开始,低电平有效
VDD:5±%5V
GND:信号地

       参照官方手册的时序,附上对应与上面电路图的STC15单片机数据读取代码:

typedef unsigned char BYTE;
typedef unsigned int WORD;

unsigned char time=0,flag0=0,count=0;
unsigned char string[16]="0000";
unsigned char AD_High=0,AD_Low=0;


//定时采样定时器初始化
void Timer0Init(void)		//50微秒|30毫秒@22.1184MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x33;		//设置定时初值
	TH0 = 0x53;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0 = 1;                          //使能定时器0中断
	EA = 1;
}

//中断定时启动采样
void tm0_isr() interrupt 1 using 1	
{	
	count = count+1;
	if(count==1)
	{
	 	LED1 = 1;                    //转换开始,灯灭
		convest = 0;			     //启动AD转换,下降沿触发
		sclk = 0;					 //时钟初始化为低
		flag0=1;
		time = 0;
	}
	if(count==31)
	{
		LED1 = 0;                    //转换结束,灯亮
		convest = 1;			     
//		count = 0;
	}
}



//读取AD7895数据的时钟CLK初始化
void Timer4Init(void)		//16微秒@22.1184MHz	
{
	T4T3M |= 0x20;		//定时器时钟1T模式
//	T4L = 0x9E;		//设置16微秒定时初值
//	T4H = 0xFE;		//设置16微秒定时初值
	T4L = 0xAE;		//设置50微秒定时初值
	T4H = 0xFB;		//设置50微秒定时初值
}

//定时中断方式读取AD7895数据
void t4int() interrupt 20
{
    sclk = !sclk;                    //时钟脉冲
	LED3 = 0;
	if((time<=16)&&(time%2))
	{
	 	AD_High = (AD_High<<1)|sdat;
	}
	if((time>16)&&(time%2))
	{
	 	AD_Low = (AD_Low<<1)|sdat;
	}
	time=time+1;
}

       有需要参考完整代码的,可以到我的资源中下载

猜你喜欢

转载自blog.csdn.net/yishuicanhong/article/details/80480608