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;
}
有需要参考完整代码的,可以到我的资源中下载。