ADC0832雙通道實現AD電壓轉換
最近用到雙通道ADC0832,發(fā)現網上的程序很多不能使用,存在各種各樣的一些問題。現提供完整的C程序,供電子愛好者交流使用。
下面是關于ADC0832的一些資料(部分資料來自互聯網,但均經檢驗正確無誤,放心使用):
ADC0832 是美國國家半導體公司生產的一種8 位分辨率、雙通道A/D轉換芯片。由于它體積小,兼容性,性價比高而深受單片機愛好者及企業(yè)歡迎,其目前已經有很高的普及率。
ADC0832 具有以下特點:
· 8位分辨率;
· 雙通道A/D轉換;
· 輸入輸出電平與TTL/CMOS相兼容;
· 5V電源供電時輸入電壓在0~5V之間;
· 工作頻率為250KHZ,轉換時間為32μS;
· 一般功耗僅為15mW;
· 8P、14P—DIP(雙列直插)、PICC 多種封裝;
· 商用級芯片溫寬為0°C to +70°C,工業(yè)級芯片溫寬為?40°C to +85°C;
芯片接口說明:
· CS_ 片選使能,低電平芯片使能。
· CH0 模擬輸入通道0,或作為IN+/-使用。
· CH1 模擬輸入通道1,或作為IN+/-使用。
· GND 芯片參考0 電位(地)。
· DI 數據信號輸入,選擇通道控制。
· DO 數據信號輸出,轉換數據輸出。
· CLK 芯片時鐘輸入。
· Vcc/REF 電源輸入及參考電壓輸入(復用)。
ADC0832 為8位分辨率A/D轉換芯片,其最高分辨可達256級,可以適應一般的模擬量轉換要求。其內部電源輸入與參考電壓的復用,使得芯片的模擬電壓輸入在0~5V之間。芯片轉換時間僅為32μS,據有雙數據輸出可作為數據校驗,以減少數據誤差,轉換速度快且穩(wěn)定性能強。獨立的芯片使能輸入,使多器件掛接和處理器控制變的更加方便。通過DI 數據輸入端,可以輕易的實現通道功能的選擇。
單片機對ADC0832 的控制原理:
正常情況下ADC0832 與單片機的接口應為4條數據線,分別是CS、CLK、DO、DI。但由于DO端與DI端在通信時并未同時有效并與單片機的接口是雙向的,所以電路設計時可以將DO和DI 并聯在一根數據線上使用。當ADC0832未工作時其CS輸入端應為高電平,此時芯片禁用,CLK 和DO/DI 的電平可任意。當要進行A/D轉換時,須先將CS使能端置于低電平并且保持低電平直到轉換完全結束。此時芯片開始轉換工作,同時由處理器向芯片時鐘輸入端CLK 輸入時鐘脈沖,DO/DI端則使用DI端輸入通道功能選擇的數據信號。在第1 個時鐘脈沖的下沉之前DI端必須是高電平,表示啟始信號。在第2、3個脈沖下沉之前DI端應輸入2 位數據用于選擇通道功能,其功能項見下圖。
當此2 位數據為“1”、“0”時,只對CH0 進行單通道轉換。當2位數據為“1”、“1”時,只對CH1進行單通道轉換。當2 位數據為“0”、“0”時,將CH0作為正輸入端IN+,CH1作為負輸入端IN-進行輸入。當2 位數據為“0”、“1”時,將CH0作為負輸入端IN-,CH1 作為正輸入端IN+進行輸入。到第3 個脈沖的下沉之后DI端的輸入電平就失去輸入作用,此后DO/DI端則開始利用數據輸出DO進行轉換數據的讀取。從第4個脈沖下沉開始由DO端輸出轉換數據最高位DATA7,隨后每一個脈沖下沉DO端輸出下一位數據。直到第11個脈沖時發(fā)出最低位數據DATA0,一個字節(jié)的數據輸出完成。也正是從此位開始輸出下一個相反字節(jié)的數據,即從第11個字節(jié)的下沉輸出DATD0。隨后輸出8位數據,到第19 個脈沖時數據輸出完成,也標志著一次A/D轉換的結束。最后將CS置高電平禁用芯片,直接將轉換后的數據進行處理就可以了。
具體時序圖如下:
參考程序如下(該程序已在硬件上調試通過):
完整代碼及hex文件下載:http://www.51hei.com/f/adc0832tt_c.rar
#include reg52.h> #include intrins.h>#define uchar unsigned charsbit cs=P2^4;sbit clk=P2^5;sbit dout=P2^6;
//din,dout兩腳可以共同接一個I/O口,因為通信時并未同時有效,并且單片機接口是雙向的sbit din=P2^7; uchar adconverse(bit channel){uchar i,addata1,addata2;clk=0;cs=0;_nop_();din=1; //啟動信號_nop_();clk=1; //pulse 1 _nop_();clk=0;_nop_();din=1; //sgl ,單通道選擇_nop_();clk=1; //pulse2_nop_();clk=0; _nop_();din=channel; //odd ,channel選擇位,為0為channel 0,為1channel 1_nop_();clk=1; //pulse3_nop_();clk=0; _nop_();din=1;for(i=8;i>0;i--){clk=1;_nop_();clk=0;_nop_();if(dout)//addata1=(addata1|dout)1;
//dout是1位(bit),addata1是8位(Byte),不能直接按位或addata1=(addata11)|0x01; //左移elseaddata1=addata11;}for(i=8;i>0;i--){ if(dout)addata2=(addata2>>1)|0x80; //右移elseaddata2=addata2>>1;clk=1;_nop_();clk=0;_nop_(); } cs=1;din=1;clk=1; if(addata1==addata2) //校驗return addata1; elsereturn 0;}void main(){ while(1){P1=adconverse(0); //選擇channel 0}}脈沖點火器相關文章:脈沖點火器原理
評論