描述
在数据采集系统中,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
#include"delay.h"
#include"chuankou.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)!='