主流A/D转换芯片学习详解(1):美信MAX197
在数据采集系统中,a/d转换的速度和精度又决定了采集系统的速度和精度。max197是maxim公司推出的具有12位测量精度的高速a/d转换芯片,只需单一电源供电,且转换时间很短(6us),具有8路输入通道,还提供了标准的并行接口——8位三态数据i/o口,可以和大部分单片机直接接口,使用十分方便。
max197简介
max197芯片是多量程(±10v,±5v,0~10v,0~5v)、8通道、12位高精度的a/d转换器。它采用逐次逼近工作方式,有标准的微机接口。三态数据i/o口用做8位数据总线,数据总线的时序与绝大多数通用的微处理器兼容。全部逻辑输入和输出与ttl/cmos电平兼容。新型a/d转换器芯片max197与一般a/d转换器芯片相比,具有极好的性能价格比,仅需单一+5v供电,且外围电路简单,可简化电路设计。
1、特性
(1)12位分辨率,1/2lsb线形度;
(2)单+5v供电;
(3)软件可编程选择输入量程: 10v, 5v,0~+5v,0~+10v;
(4)输入多路选择器保护: 16.5v
(5)8路模拟输入通道;
(6)6us转换时间,100ksps采样速度;
(7)内/外部采集控制;
(8)内部4.096v或外部参考电压;
(9)两种掉电模式;
(10)内部或外部时钟。
max197转换的基本原理
max197无需外接元器件就可独立完成a/d转换功能。它可分为内部采样模式和外部采样模式,采样模式由控制寄存器的d5位决定。在内部采样控制模式(控制位置0)中,由写脉冲启动采样间隔,经过瞬间的采样间隔(芯片时钟为2mhz时,为3ms),即开始a/d转换。在外部采样模式(d5=1)中,由两个写脉冲分别控制采样和a/d转换。在第一个写脉冲出现时,写入acqmod为1,开始采样间隔。在第二个写脉冲出现时,写入控制字acqmod为0,max197停止采样,开始a/d转换。这两个写脉冲之间的时间间隔为一次采样时间。当一次转换结束后,max197相应的int引脚置低电平,通知处理器可以读取转换结果。内部采样模式的数据转换时序对于模拟到数字量的转换,时序要求非常严格,由于max197的数字信号输出引脚是复用的,要正确读出转换结果,时序要求尤其重要。在一次采样开始前,可以通过单片机的8位数据线把这些控制字写入max197来初始化相应的参数。然后按照一定的时序进行采样和转换。
图1 max197引脚定义视图
引脚功能介绍
max197具有四种不同的封装:dip28,宽so,ssop和陶瓷sb封装。
1脚(clk):时钟输入。外部时钟输入时,由此引脚输入电平与ttl或cmos兼容的时钟。内部时钟模式时,该脚与地之间接一电容,以确定内部时钟频率,当f=1.56mhz时,外接电容的典型值cclk=100pf。
2脚( ):片选线,低电平有效。
3脚( ):当 为低电平时,在内部采集模式下, 的上升沿将锁存数据,并启动一次采集和一次转换周期;在外部采集模式下, 的第一个上升沿启动采集,第二个上升沿结束采集,并启动转换周期。
4脚( )当 为低电平时, 得下降沿将允许读取数据总线上的数据。
5脚(hben)用于切换12位转换结果。此脚为高电平时数据总线上的数据为高4位,此脚为低电平时数据总上的数据为低8位。
max197 c程序
对于学max197的人来说是一个很好的机会,这个程序不难,绝对可以看懂它:
以下两个是。h文件的,你们另外保存一下就行了
#include
#include
#define uchar unsigned char
#define uint unsigned int
#includedelay.h
#includechuankou.h
sbit max197_cs=p0^0;
sbit max197_wr=p0^1;
sbit max197_rd=p0^2;
sbit max197_hben=p0^3;
uchar premp,temp1;
void max197_write(char temp)
{
max197_cs=1;
max197_wr=1;
delays(1);
max197_cs=0;
_nop_();
_nop_();
max197_wr=0;
_nop_();
_nop_();
_nop_();
_nop_();
p1=temp;
_nop_();
_nop_();
_nop_();
_nop_();
max197_wr=1;
_nop_();
max197_cs=1;
delayl(5);
}
long int max197_read()
{
long int premp;
uint templ,temph;
delayl(2);
max197_hben=0;
_nop_();
max197_cs=0;
max197_rd=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
templ=p1;
delayl(600);
max197_hben=1;
delayl(600);
_nop_();
_nop_();
_nop_();
_nop_();
temph=p1;
delays(1);
max197_rd=1;
max197_cs=1;
premp=temph*256|templ;
return premp;
}
void init_max197()
{
p1=0x00;
max197_write(0x40);
}
void main()
{
long int frag,i;
uint j;
init_uart();
while(1)
{
init_max197();
frag=max197_read();
i=frag*500000/4096;
send_dat(i/100000);
send_char('.');
send_dat(i/10000%10);
send_dat(i/1000%10);
send_dat(i/100%10);
send_dat(i/10%10);
send_dat(i%10);
send_char('v');
send_char('
');
send_char('');
}
}
#ifndef chuankou
#define chuankou
void init_uart()
{
tmod = 0x20;
th1 = 0xfa;
tl1 = 0xfa;
scon = 0x40;
pcon = 0x80;
tr1 = 1;
ren = 1;
}
void send_dat(uint dat1)
{
sbuf = (dat1+'0');
while(ti==0);
ti = 0;
}
void send_char(uchar dat)
{
sbuf = dat;
while(ti==0);
ti=0;
}
void printstr(uchar *p)
{
while((*p)!='