普中51开发板,用XPT2046芯片实现AD数模转换。protues仿真用ADC0808实现AD数模转化
普中51開(kāi)發(fā)板,用XPT2046芯片實(shí)現(xiàn)AD數(shù)模轉(zhuǎn)換。protues仿真用ADC0808實(shí)現(xiàn)AD數(shù)模轉(zhuǎn)化
實(shí)驗(yàn)做完了,總結(jié)一下,這些都是做實(shí)驗(yàn)的時(shí)候自己收集整理總結(jié)的資料,下面分享一下
XPT2046芯片:
XPT2046的功能很多,這里只介紹怎么用該芯片來(lái)完成AD數(shù)模轉(zhuǎn)換的實(shí)驗(yàn)。
XPT2046 是一種典型的逐次逼近型模數(shù)轉(zhuǎn)換器(SAR ADC),包含了采樣/保持、模數(shù)轉(zhuǎn)換、串口數(shù)據(jù)輸出等功能,因此我們可以用這個(gè)芯片來(lái)完成本次實(shí)驗(yàn)AD轉(zhuǎn)換的內(nèi)容。
本次實(shí)驗(yàn)使用的是XPT芯片的電壓模式,首先看下面這個(gè)圖,了解芯片的引腳和功能,我們要操作的引腳有DCLK 、CS非、DIN 、DOUT:
附上開(kāi)發(fā)板ADC模塊的原理圖:
我們主要了解和使用紅色圈圈的幾個(gè)引腳:
了解完引腳之后,就要看怎么去使用和控制這些引腳來(lái)達(dá)成目標(biāo),
所以接下來(lái)要看的就是時(shí)序工作圖,要了解芯片是如何工作,如何完成采樣 保持 量化 編碼這幾個(gè)步驟的.。
一次完整的轉(zhuǎn)換需要 24 個(gè)串行同步時(shí)鐘(DCLK)來(lái)完成。(看DCLK時(shí)序那,一共出現(xiàn)了3次8, 3*8=24)
要想啟動(dòng)選中該芯片,首先得給CS和CLK置0 (因?yàn)閱纹瑱C(jī)默認(rèn)引腳輸出1) ,然后開(kāi)始寫(xiě)入數(shù)據(jù)
處理器和轉(zhuǎn)換器之間的的通信需要 8 個(gè)時(shí)鐘周期,可采用 SPI、SSI 和Microwire 等同步串行接口。前面8個(gè)時(shí)鐘就在進(jìn)行通信。
前8個(gè)時(shí)鐘就是用來(lái)通過(guò)DIN引腳輸入控制字節(jié)。
先看DIN的時(shí)序(圖中有幾個(gè)英文單詞,Idle的意思是閑置的意思,aquire是獲取的意思,conversion是轉(zhuǎn)換的意思,個(gè)人理解是圖中把DIN在24個(gè)時(shí)鐘周期內(nèi)的變化,分成了幾個(gè)段,閑置段,獲取段,轉(zhuǎn)換段)DIN的控制位有8位,下面開(kāi)始從最高位開(kāi)始介紹:
控制字的首位必須是 1,即 S=1。在 XPT2046 的 DIN 引腳檢測(cè)到起始位前,所有的輸入將被忽略。
A2-A0的選擇,由于我選擇的是工作在單端模式,則要選中XP輸入(至于為什么是XP輸入下面解釋),所以A2-A0是選擇001或者011都可以(二者都能選中XP輸入)。如下圖:
我們可以看一下在單端模式下的原理圖:(XP是接IN+輸入的,所以我們要選中XP輸入工作)
MODE:模式選擇位,用于設(shè)置 ADC 的分辨率。MODE=0,下一次的轉(zhuǎn)換將是 12 位模式;MODE=1,下一次的轉(zhuǎn)換將是 8 位模式。我選擇的是8位
SER/ DFR非 :控制參考源模式,選擇單端模式(SER/ DFR非 =1),或者差分模式。在單端模式下,轉(zhuǎn)換器的參考電壓固定為VREF相對(duì)于GND引腳的電壓
PD0和PD1:控制掉電和內(nèi)部參考電壓配置的關(guān)系。我選擇PD1和PD0都為0(為低功率模式)如下圖:
當(dāng)DIN的控制字節(jié)處理完成之后,轉(zhuǎn)換器進(jìn)入轉(zhuǎn)換狀態(tài),輸入采樣-保持器進(jìn)入保持狀態(tài),觸摸面板驅(qū)動(dòng)器停止工作(單端工作模式)接著的 12 個(gè)時(shí)鐘周期將完成真正的模數(shù)轉(zhuǎn)換。
這個(gè)芯片的AD是逐次逼近式AD,逐次逼近式AD轉(zhuǎn)換器中有一個(gè)逐次逼近寄存器SAR,其數(shù)字量是由它產(chǎn)生的。
附上圖片:
SAR使用對(duì)分搜索法產(chǎn)生數(shù)字量,以8位數(shù)字量為例,SAR首先產(chǎn)生8位數(shù)字量的一半,即b=1000000,試探模擬量Vi的大小。若Vo>Vi,清楚最高度位;反之,則保留最高位。在最高位確認(rèn)后,SAR又以對(duì)分搜索法確定次高位,即以7位數(shù)字量的一半1000000(y由前面的過(guò)程已確回認(rèn))試探模擬量Vi的大小。依此類(lèi)推,直到確定了bit0為止,轉(zhuǎn)換結(jié)束。
上面的解釋可能不是很形象,那就舉個(gè)具體的例子:模擬量經(jīng)過(guò)內(nèi)部的DA轉(zhuǎn)換得到一個(gè)數(shù)字量108 二進(jìn)制轉(zhuǎn)換就是01101100(暫時(shí)稱(chēng)為A),首先先用10000000與A相比,A小于10000000,則第一位為0,保留,開(kāi)始比較次高位,A大于01000000,則次高位保留1;下一位繼續(xù)比較,A大于01100000,次次高位保留1,繼續(xù)比較下一位,A小于01110000,則第4位(從左往右數(shù))保留為0,繼續(xù)比較,以此類(lèi)推,一直比較到最后一位。
下面介紹一下ADC0808/0809
ADC0808芯片介紹:
內(nèi)部結(jié)構(gòu)和外部引腳:
ADC0808/0809的內(nèi)部結(jié)構(gòu)和外部引腳分別如圖11.19和圖11.20所示。內(nèi)部各部分的作用和工作原理在內(nèi)部結(jié)構(gòu)圖中已一目了然,在此就不再贅述,下面僅對(duì)各引腳定義分述如下:
圖11.19 ADC0808/0809內(nèi)部結(jié)構(gòu)框圖
圖11.20 ADC0808/0809外部引腳圖
(1) IN0~IN7——8路模擬輸入,通過(guò)3根地址譯碼線ADDA、ADDB、ADDC來(lái)選通一路。
(2)D7~D0——A/D轉(zhuǎn)換后的數(shù)據(jù)輸出端,為三態(tài)可控輸出,故可直接和微處理器數(shù)據(jù)線連接。8位排列順序是D7為最高位,D0為最低位。
(3)ADDA、ADDB、ADDC——模擬通道選擇地址信號(hào),ADDA為低位,ADDC為高位。地址信號(hào)與選中通道對(duì)應(yīng)關(guān)系如表11.3所示。
(4)VR(+)、VR(-)——正、負(fù)參考電壓輸入端,用于提供片內(nèi)DAC電阻網(wǎng)絡(luò)的基準(zhǔn)電壓。在單極性輸入時(shí),VR(+)=5V,VR(-)=0V;雙極性輸入時(shí),VR(+)、VR(-)分別接正、負(fù)極性的參考電壓。
(5)ALE——地址鎖存允許信號(hào),高電平有效。當(dāng)此信號(hào)有效時(shí),A、B、C三位地址信號(hào)被鎖存,譯碼選通對(duì)應(yīng)模擬通道。在使用時(shí),該信號(hào)常和START信號(hào)連在一起,以便同時(shí)鎖存通道地址和啟動(dòng)A/D轉(zhuǎn)換。
(6)START——A/D轉(zhuǎn)換啟動(dòng)信號(hào),正脈沖有效。加于該端的脈沖的上升沿使逐次逼近寄存器清零,下降沿開(kāi)始A/D轉(zhuǎn)換。如正在進(jìn)行轉(zhuǎn)換時(shí)又接到新的啟動(dòng)脈沖,則原來(lái)的轉(zhuǎn)換進(jìn)程被中止,重新從頭開(kāi)始轉(zhuǎn)換。
(7)EOC——轉(zhuǎn)換結(jié)束信號(hào),高電平有效。該信號(hào)在A/D轉(zhuǎn)換過(guò)程中為低電平,其余時(shí)間為高電平。該信號(hào)可作為被CPU查詢的狀態(tài)信號(hào),也可作為對(duì)CPU的中斷請(qǐng)求信號(hào)。在需要對(duì)某個(gè)模擬量不斷采樣、轉(zhuǎn)換的情況下,EOC也可作為啟動(dòng)信號(hào)反饋接到START端,但在剛加電時(shí)需由外電路第一次啟動(dòng)。
(8)OE——輸出允許信號(hào),高電平有效。當(dāng)微處理器送出該信號(hào)時(shí),ADC0808/0809的輸出三態(tài)門(mén)被打開(kāi),使轉(zhuǎn)換結(jié)果通過(guò)數(shù)據(jù)總線被讀走。在中斷工作方式下,該信號(hào)往往是CPU發(fā)出的中斷請(qǐng)求響應(yīng)信號(hào)。
ADC 0808/0809工作時(shí)序:
ADC 0808/0809的工作時(shí)序如圖11.21所示。
當(dāng)通道選擇地址有效時(shí),ALE信號(hào)一出現(xiàn),地址便馬上被鎖存,這時(shí)轉(zhuǎn)換啟動(dòng)信號(hào)緊隨ALE之后(或與ALE同時(shí))出現(xiàn)。START的上升沿將逐次逼近寄存器SAR復(fù)位,在該上升沿之后的2μs加8個(gè)時(shí)鐘周期內(nèi)(不定),EOC信號(hào)將變低電平,以指示轉(zhuǎn)換操作正在進(jìn)行中,直到轉(zhuǎn)換完成后EOC再變高電平。微處理器收到變?yōu)楦唠娖降腅OC信號(hào)后,便立即送出OE信號(hào),打開(kāi)三態(tài)門(mén),讀取轉(zhuǎn)換結(jié)果。
END
有什么地方不對(duì)的地方,歡迎指出。
開(kāi)發(fā)板實(shí)驗(yàn)代碼:
/****************************************************************** 功能: 數(shù)碼管前2位顯示AD字符,后三位電位器的數(shù)字量,最后三位顯示對(duì)應(yīng)電壓值實(shí)體機(jī)接線: 1,單片機(jī)-->AD/DAC模塊P34-->DIP35-->CSP36-->CLP37-->DO 2,單片機(jī)-->動(dòng)態(tài)數(shù)碼管模塊(P0端口)J22-->J6(動(dòng)態(tài)數(shù)碼管段選)P20-->J9(A)P21-->J9(B)P22-->J9(C) ******************************************************************/ #include "reg52.h" //單片機(jī)頭文件 #include<intrins.h> //含_nop_()函數(shù) #define uchar unsigned char #define uint unsigned intsbit LSA=P2^0; sbit LSB=P2^1; sbit LSC=P2^2;sbit DIN=P3^4; //串口輸入 sbit CS=P3^5; //片選 sbit CLK=P3^6; //時(shí)鐘脈沖 sbit DOUT=P3^7; //串口輸出uchar disp[8]; //儲(chǔ)存讀取的數(shù)據(jù)的每個(gè)位數(shù),由數(shù)碼管輸出 uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delay(uint i)//延時(shí)子程序,因?yàn)楸境绦虻难訒r(shí)不需要到ms級(jí)別,所以沒(méi)有用之前的用法 {while(i--); }void SPI_Write(uchar dat) //dat傳輸?shù)氖?C這個(gè)控制指令 {uchar i;CLK = 0;for(i=0;i<8;i++) //DIN是串行數(shù)據(jù)輸入口,需要一位位讀取數(shù)據(jù){DIN = dat >> 7; //這里DIN取dat的最高位dat <<= 1; //次高位左移一位變?yōu)樽罡呶?#xff0c;方便下一次DIN讀取數(shù)據(jù)CLK = 0; //軟件給予一個(gè)上升沿時(shí)序,用來(lái)放置數(shù)據(jù)_nop_();CLK = 1;} } uint SPI_Read() {uint i, dat=0; //dat用來(lái)存放讀取的數(shù)據(jù)CLK = 0;for(i=0; i<8; i++) //接收8位數(shù)據(jù),DOUT是串行數(shù)據(jù)輸出,也是需要一個(gè)個(gè)讀取{dat <<= 1; //左移一位CLK = 1; //軟件給予一個(gè)下降沿時(shí)序,因?yàn)閿?shù)據(jù)是在CLK為下降沿的時(shí)候移出_nop_();CLK = 0;dat |= DOUT; //與DOUT相或,讀取數(shù)據(jù)}return dat; //返回?cái)?shù)據(jù) } uint Read_AD_Data(uchar cmd) {uchar i;uint AD_Value;CLK = 0; //默認(rèn)引腳輸出1,這里要先軟件置0 CS = 0; //置0選中,啟動(dòng)ADSPI_Write(cmd);//寫(xiě)入數(shù)據(jù)for(i=6;i>0;i--); //延時(shí)等待轉(zhuǎn)換結(jié)果CLK=0;_nop_();CLK = 1; //發(fā)送一個(gè)正脈沖,清除BUSY ,表示可以開(kāi)始轉(zhuǎn)換了_nop_(); CLK = 0;_nop_();_nop_();AD_Value=SPI_Read(); //AD_Value存放數(shù)據(jù)CS = 1; //CS拉高,讀取完畢return AD_Value; }void datapros() {uint temp,val;uchar i;if(i==50){temp = Read_AD_Data(0x9c);/*0x9c是給DIN輸入控制字節(jié),9c=10011100,具體的每一位是什么作用可以看芯片手冊(cè)*/val=temp*100/51;//原來(lái)式子是(((temp*5*100)/255)),把temp先擴(kuò)大100倍然后乘以5除以255得到電壓值;}i++;disp[0]=0x77;//顯示Adisp[1]=0x5e;//顯示Ddisp[2]=smgduan[temp/100];//百位disp[3]=smgduan[temp/10%10];//十位 disp[4]=smgduan[temp%10];//個(gè)位 disp[5]=smgduan[val/100] |0x80; //與0x80相或來(lái)得到小數(shù)點(diǎn)disp[6]=smgduan[val/10%10];disp[7]=smgduan[val%10]; } void DigDisplay() {uchar i;for(i=0;i<8;i++){switch(i) //位選,選擇點(diǎn)亮的數(shù)碼管,{case(0):LSA=0;LSB=0;LSC=0; break;//顯示第0位case(1):LSA=1;LSB=0;LSC=0; break;//顯示第1位case(2):LSA=0;LSB=1;LSC=0; break;//顯示第2位case(3):LSA=1;LSB=1;LSC=0; break;//顯示第3位case(4):LSA=0;LSB=0;LSC=1; break;//顯示第4位case(5):LSA=1;LSB=0;LSC=1; break;//顯示第5位case(6):LSA=0;LSB=1;LSC=1; break;//顯示第6位case(7):LSA=1;LSB=1;LSC=1; break;//顯示第7位}P0=disp[i];//發(fā)送數(shù)據(jù)delay(100); //間隔一段時(shí)間掃描 P0=0x00;//消隱} } void main() { while(1){datapros(); //數(shù)據(jù)處理函數(shù)DigDisplay();//數(shù)碼管顯示函數(shù) } }總結(jié)
以上是生活随笔為你收集整理的普中51开发板,用XPT2046芯片实现AD数模转换。protues仿真用ADC0808实现AD数模转化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: excel中把汉字转换成拼音(只取首字母
- 下一篇: 《Outlook时间整理术》一创建和使用