数模转换器ADC0832使用原理及控制程序

一.简介

数模转换器一般分为两种,一种为数字信号转模拟信号,,其控制器简称为DAC;另一种为模拟信号转数字信号,其控制器简称为ADC。现在主要介绍一款很常用、入门级的ADC转换芯片——ADC0832。
ADC0832 是美国国家半导体公司生产的一种8 位分辨率、双通道A/D转换芯片。由于它体积小,兼容性强,性价比高而深受单片机爱好者及企业欢迎,其目前已经有很高的普及率。
在这里插入图片描述
ADC083X是市面上常见的串行模—数转换器件系列。ADC0831、ADC0832、ADC0834、ADC0838是具有多路转换开关的8位串行I/O模—数转换器,转换速度较高(转换时间32uS),单电源供电,功耗低(15mW),适用于各种便携式智能仪表。其中ADC0832为双通道ADC转换芯片,常用封装为DIP8和SOP8。

二.芯片电气参数
1.电气参数
  • 8 位分辨率;
  • 双通道 A/D 转换;
  • 输入输出电平与 TTL/CMOS 相兼容;
  • 5V 电源供电时输入电压在 0~5V 之间;
  • 工作频率为 250KHZ,转换时间为 32μS;
  • 一般功耗仅为 15mW; 8P、14P—DIP(双列直插)、SOP 多种封装;
  • 商用级芯片温宽为0°C to +70°C,工业级芯片温宽为−40°C to +85°C;
2.引脚说明

在这里插入图片描述
在这里插入图片描述

3.芯片内部连接框图

在这里插入图片描述

三.硬件原理图

正常情况下 ADC0832 与单片机的接口应为 4 条数据线,分别是 CS、CLK、
DO、DI。但由于 DO 端与 DI 端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将 DO 和 DI 并联在一根数据线上使用,可识别并转换的电压为0-VCC;当电压超过VCC时,AD的数值处于饱和状态,为255。硬件电路图,如图:
在这里插入图片描述

四.控制程序
1.控制时序

当 ADC0832 未工作时其 CS 输入端应为高电平,此时芯片禁用,CLK 和DO/DI 的电平可任意。当要进行 A/D 转换时,须先将 CS 使能端置于低电平并且保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟输入端 CLK 输入时钟脉冲,DO/DI 端则使用 DI 端输入通道功能选择的数据信号。在第 1 个时钟脉冲的下沉之前 DI 端必须是高电平,表示启始信号。在第 2、3 个脉冲下沉之前 DI 端应输入 2 位数据用于选择通道功能,其功能项下表。
在这里插入图片描述
转换时序如图,选择通道0或1的区别在于,在第3个脉冲DO/DI引脚电平的不同,低电平为选择通道0,高电平为选择通道1。
在这里插入图片描述

2.转换函数

ADC0832转换程序也比较简单,只要按照以上转换时序进行编程即可实现控制。其中入口参数CH值为0或1,分别表示通道0和通道1。

/****************************************************************************
函数功能:AD转换子程序
入口参数:CH
出口参数:dat
****************************************************************************/
unsigned char adc0832(unsigned char CH)
{
	unsigned char i,test,adval;
	adval = 0x00;
	test = 0x00;
	Clk = 0;       //初始化
	DATI = 1;
	_nop_();
	CS = 0;
	_nop_();
	Clk = 1;
	_nop_();
	
	
	if ( CH == 0x00 )      //通道选择
	{
		Clk = 0;
		DATI = 1;      //通道0的第一位
		_nop_();
		Clk = 1;
		_nop_();
		Clk = 0;
		DATI = 0;      //通道0的第二位
		_nop_();
		Clk = 1;
		_nop_();
	} 
	else
	{
		Clk = 0;
		DATI = 1;      //通道1的第一位
		_nop_();
		Clk = 1;
		_nop_();
		Clk = 0;
		DATI = 1;      //通道1的第二位
		_nop_();
		Clk = 1;
		_nop_();
	}
	
	Clk = 0;
	DATI = 1;
	for( i = 0;i < 8;i++ )      //读取前8位的值
	{
		_nop_();
		adval <<= 1;
		Clk = 1;
		_nop_();
		Clk = 0;
		if (DATO)
		adval |= 0x01;
		else
		adval |= 0x00;
	}
	for (i = 0; i < 8; i++)      //读取后8位的值
	{
		test >>= 1;
		if (DATO)
		test |= 0x80;
		else 
		test |= 0x00;
		_nop_();
		Clk = 1;
		_nop_();
		Clk = 0;
	}
	if (adval == test)      //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉
	dat = test;
	nop_();
	CS = 1;        //释放ADC0832
	DATO = 1;
	Clk = 1;
	return dat;
}

如需ADC0832相关资料, 请关注公众号,首页回复“ADC0832”获取资料
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章