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