數模轉換器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”獲取資料
在這裏插入圖片描述

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