專(zhuān)注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

基于51開(kāi)發(fā)的D/A&A/D 與單片機(jī)接口原理2

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年04月19日   【字體:
續(xù):D/A 與單片機(jī)接口原理1

D/A :的操作我們最關(guān)心的是,串行還是并行,接口的說(shuō)明,然后是轉(zhuǎn)換位數(shù)和轉(zhuǎn)換速率,完了看操作時(shí)序,看接法,DAC0832有好幾種,但是一般芯片只有一種接法,接法不同當(dāng)然操作方法也不同。



上圖為D/A 接口圖     就從操作2個(gè)管腳  P5 的2腳和3腳有個(gè)跳線(xiàn)帽  短路了  燈會(huì)根據(jù)D/A 亮到滅變化

寫(xiě)個(gè)程序代碼更好理解

#include

 

sbit csda = P3^2;

sbit wr = P3^6;

void main(){

   csda =0; //根據(jù)管腳說(shuō)明操作時(shí)序都是低電平有效

    wr =0;//根據(jù)管腳說(shuō)明 操作時(shí)序都是低電平有效

 

  P0 = 0xff; //單片機(jī)輸出全1   燈點(diǎn)亮了

  while (1){

   P0= 0x00;//單片機(jī)輸出全0   燈熄滅

 }

 

}

//簡(jiǎn)單吧!  好了我們?cè)僮鰝(gè)有點(diǎn)難度的,讓燈2秒中從亮到熄滅  循環(huán)。

//可以用定時(shí)器     也就是 P0 口從輸出0  到255  在 2秒時(shí)間內(nèi)送完  ,可以這樣做 2秒時(shí)間中斷255次每次

//加1,外面判斷下到255  就不加了。

--------------------------------------------------------------------------------------------------

 一、A/D  :模擬(analog)到數(shù)字(digit)

A/D轉(zhuǎn)換的原理及主要技術(shù)指標(biāo)


如圖:以電壓舉例。Vin 電壓輸入轉(zhuǎn)換原理  參考電壓通過(guò)D/A 轉(zhuǎn)換器(上面講過(guò)了D/A原理)依次輸出一個(gè)參考電壓 依次跟Vin比較比如參考電壓大于那么就經(jīng)過(guò)運(yùn)算輸出1 通過(guò)邏輯控制 到N位寄存器 最終實(shí)現(xiàn)模擬到數(shù)字的轉(zhuǎn)換。如果比較完了 EOC 向單片機(jī)發(fā)一個(gè)中斷,表示比較完了,OE 輸出一個(gè)低電平然后一次讀走數(shù)據(jù)。當(dāng)然還有很多轉(zhuǎn)換方式。

如下圖 雙積分式ADC的轉(zhuǎn)換原理



這就不講了。等學(xué)到數(shù)字電路積分器和微分器的時(shí)候就明白了
二、下面看看A/D轉(zhuǎn)換器的主要技術(shù)指標(biāo)








A/D的速率相對(duì)來(lái)說(shuō)是低,我們平時(shí)也就幾十K 的速率, D/A 很快幾十個(gè)G的速率。

下面是A/D與單片機(jī)接口圖

 




AD0804的11   到18 接單片機(jī)P1口,0804的第5管腳是中斷就是說(shuō)AD芯片轉(zhuǎn)換完了得要通知單片機(jī),如果使用中斷需要接單片機(jī)的外部中斷。而我們這邊上圖是沒(méi)有用中斷的就是啟動(dòng)轉(zhuǎn)換之后過(guò)一段時(shí)間去讀,因?yàn)樗隙?br> 轉(zhuǎn)換完了也給中斷了只不過(guò)我們不去讀罷了。 WR   RD  接的單片機(jī)的P3.6 /P3.7口。CSAD 就是片選我們接的鎖存器,鎖存器通過(guò)P0口可以控制的(P2.7給個(gè)高電平就行了)。 19  4 腳 外接一個(gè)電阻和電容其實(shí)是一個(gè)RC振蕩電路看datasheet 就給出了這個(gè)典型電路了,我們這樣就行了。內(nèi)部有移位寄存器和D/A轉(zhuǎn)換器需要?jiǎng)恿。如果你直接給4腳接個(gè)時(shí)鐘頻率也可以。這個(gè)腳決定了AD的轉(zhuǎn)換速率當(dāng)然它是有個(gè)上限的。不能超過(guò)AD速率的范圍。RC 振蕩跟轉(zhuǎn)換速率的關(guān)系等會(huì)再講啊。 第6 腳和7腳可以輸入一個(gè)差分信號(hào),也就是這2端的電壓值A(chǔ)D用來(lái)進(jìn)行比較,而我們直接把7腳接地了。得讓6和7之間有個(gè)變化的電壓,其實(shí)它的作用可以采集橋式電路 ,6腳通過(guò)一個(gè)電阻(限流電阻防止AD電流損壞)接A/Din  它在板子上有個(gè)跳線(xiàn)帽是短路的有了電位器,調(diào)節(jié)電位器就可改變電壓0----5V變化。8腳 模擬地,10 數(shù)字地、最好分開(kāi)防止干擾。9腳為1/2的Vref(參考電壓),我們用了2個(gè)電阻分壓(相等的電阻串聯(lián)1K)2.5V左右。

我們看看他的操作時(shí)序圖(Timing Diagrams)開(kāi)始轉(zhuǎn)換



actual internal 實(shí)際內(nèi)部 status of the convrter 轉(zhuǎn)換狀態(tài) 當(dāng)CS 在低電平期間 WR 來(lái)一個(gè)低脈沖 過(guò)了1 到8個(gè) *1/晶振頻率個(gè)時(shí)間開(kāi)始忙 BUSY  (轉(zhuǎn)換)Tc時(shí)間轉(zhuǎn)換完了之后輸出鎖存器DATA IS valid IN OUTPUT LATCHES 有效數(shù)據(jù).  INTR就是轉(zhuǎn)換完了   INT ASSERTED 通知中斷一個(gè)低電平 ,當(dāng)然單片機(jī)讀走數(shù)據(jù)之后INTR就自動(dòng)置高了。

下圖是 輸出使能和復(fù)位   其實(shí)就是讀取數(shù)據(jù)


由上圖可知就4根線(xiàn),INTR  CS   RD    DATA OUTPUT(數(shù)據(jù)總線(xiàn))
由于我們直接把CS 接地線(xiàn)所以始終就是低電平,這個(gè)時(shí)序圖是在INTR發(fā)一個(gè)中斷  單片機(jī)案檢測(cè)到中斷,把RD拉低 ,在RD 從低到高變化的一瞬間把數(shù)據(jù)讀走了。由于我們中斷沒(méi)有用懸空的,所以只看RD  和DATA OTPUT 數(shù)據(jù)總線(xiàn),那么就是RD  從高變低  再?gòu)膹牡妥兏?nbsp; 然后把數(shù)據(jù)讀走。就是設(shè)置個(gè)變量讓這個(gè)變量等于P幾口就行了, tACC 這段時(shí)間就會(huì)RD至少要保持這段時(shí)間也就是到數(shù)據(jù)的出現(xiàn)。看數(shù)據(jù)表得知tACC 也是ns 級(jí)的非常短暫,(單片機(jī)的一條指令時(shí)間都是微秒級(jí)的us 所以可以不用管)。

RC 的選擇可以從數(shù)據(jù)手冊(cè)找到如下圖

 



由此圖可以得知,RC越大那么這個(gè)AD的fclk越小速度越慢,所以我們單片機(jī)讀的時(shí)候不能太快,還沒(méi)轉(zhuǎn)化完呢。好了下面我寫(xiě)個(gè)程序看看吧!

#include

#define uint unsigned int

#define ucar unsigned char

//sbit csad  //連的鎖存器 所以我們不用定義

sbit wr =P3^6;

sbi rd = P3^7;

void delay(uint z){

   uint t1,y;

   for (t =z;;t1>0;t1--)

     for(y=110;y>0;y--);

}

void init();

void start();

 

void main(){

 init(); 

 while(1){

     start();

     delay(50);//燈會(huì)亮,因?yàn)閿?shù)據(jù)管腳不但接單片機(jī)而且還接了 燈。

    

     rd=0;//需要rd也拉低   相當(dāng)于AD芯片的OE  雖然轉(zhuǎn)化完只有OE為低電平使能的時(shí)候數(shù)據(jù)才會(huì)出來(lái) 

     //調(diào)節(jié)電位器 之后按復(fù)位才變化,說(shuō)明 你再置高,下次轉(zhuǎn)換完了再置低

     delay(10);

   ru= 1;//這樣既解決了不用復(fù)位鍵就能改變、需要加延時(shí)不然燈會(huì)很暗。

    delay(10);

//轉(zhuǎn)化的快慢跟RC 振蕩 和IC 本身都有關(guān)系?梢暂^少RC 的值

  

}

void init(){

    P0 = 0x7f;//片選給個(gè)低電平  高位

   

   

}

void start(){

    wr =1;

    wr=0

    wr=1;

   

}

 

//通過(guò)以上可以加個(gè)變量  把模擬量變化到數(shù)據(jù)總線(xiàn)端   給數(shù)碼管顯示。

//A/D 輸出 賦值給D/A 來(lái)實(shí)現(xiàn) 模擬變化。跟我們的錄音機(jī)聲音的采集A/D 之后D/A 接功放放出去。

關(guān)閉窗口

相關(guān)文章