一.簡介
數模轉換器一般分爲兩種,一種爲數字信號轉模擬信號,,其控制器簡稱爲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”獲取資料