模擬信號的幅度一般隨時間變化而連續(xù)變化。以下就是不同性質模擬量的波形

而單片機中一般運算用的是數(shù)字量(0/1的組合),這就涉及到了外圍電路需要有一個模數(shù)轉換的過程。顧名思義是把輸入的模擬信號盡可能無失真地轉化為數(shù)字量。
如果把數(shù)字量形容成是一個個分塊儲存信息的模塊,那模擬量這種連續(xù)的信息在轉換過程中要盡可能避免信息的喪失。處不來講轉換的思路就是把數(shù)字量分塊,以數(shù)字的形式轉換至數(shù)字量中。如數(shù)字量為有六位(000000-111111),那么就可以把模擬量均等分為64份,每份中儲存著轉換過來的相應信息。
但是這個只是我們的初步思路,從原理上講,一般的A/D轉換分為采樣保持,量化和編碼三個過程。采樣的量一般是電壓(電流不好?。?,通過一定的采樣保持時間過后把采樣的電壓量轉換為數(shù)字量,并按一定形式的0/1編碼順序給出轉換結果,這就是得到了相應的數(shù)字信號??驁D如下:

下面分別介紹相應的理論知識。
1.采樣定理:(信號里面基本接觸過,還可以參考無失真系統(tǒng)需要具備的條件等知識)
采樣定理反映了采樣信號頻率與輸入信號頻率之間的制約關系,可理解為采樣信號的頻譜(低通濾波器)一定要包含輸入信號頻譜的全部內容。

因為每次將采樣電壓轉化為數(shù)字量需要一定的時間,所以采樣后也必須把采樣電壓保持一段時間,故在采樣過程中最后反應出的Vi都是采樣結束時候的值。
2.量化與編碼
數(shù)字信號一定是在數(shù)值上離散的。且任何一個數(shù)字量都會是一個基礎數(shù)字量的整數(shù)倍。
故選取一個最小的變量作為單位變量。將模擬電壓與之相除后就能得出相應的數(shù)字二進制代碼,經(jīng)推算也可以得出對應的模擬電平。

上圖的單位變量就為1/8V,量化誤差(每兩個單位間隔中可能出現(xiàn)的最大誤差)也是1/8.
這其中有一個小知識點。怎么設計電路使其有采樣和保持的功能。
簡單的采樣保持電路如下圖所示,其將MOS管作為啟動和停止的開關,將信號通過反相放大器后得出輸出電壓。

這里的場效應管也有反相截止的功能。即當輸入由高轉低時,電流無法通過場效應管。
對于這種采樣速度低的電路,可以有以下改進

VL引腳控制著開關的閉合,當為高電平時開關打開。模擬電壓可經(jīng)過兩級跟隨器傳至Vo
當VL由高變低時,還有電容Ch放電提供相應電壓,電平得以維持。
當輸入的電壓比較大,超出了開關所能承受的最大電壓時,引入一個二極管電路,通過單向導通的性質可以起到分壓的作用,且當電壓合適時該電路不起分壓作用。
常用的A/D轉換器有直接A/D轉換器(并行型/反饋比較型)以及間接A/D(需要轉成T,f等中間變量后再轉換)
1.直接

電壓比較器是對輸入電壓進行分類,如圖所示,運放的負極接模擬電平大小為2n-1/15(n=1,2,……7)的端口,分壓電阻每兩個電阻之間的節(jié)點都接在VI引出的這條總線上。進行電壓比較后將比較結果數(shù)據(jù)傳到寄存器。寄存器設置的目的是因為比較結果可能會有變化,待穩(wěn)定后通過譯碼器部分對相應的結果轉化為二進制數(shù)字變量。各種變量之間的對應關系如下

這種電路特點是傳輸速度較快,但缺點是隨著二進制數(shù)字量位數(shù)的增加,需要比較器的數(shù)量呈指數(shù)型增長(2^n-1),且自帶采樣保持功能
(2)反饋比較型A/D

引入一個D/A轉換器和一個計數(shù)器,計數(shù)器傳送數(shù)字信號至D/A,轉為模擬信號后在電壓比較器這里與VI按位做比較,若一致就直接傳送至計數(shù)器,不一致通過比較器后也會變?yōu)檎_的那一項,按位比較重復多次后,計數(shù)器將數(shù)據(jù)傳送至輸出寄存器。因為在比較過程中數(shù)字不斷變化,故設置了輸出寄存器。這樣就可以起到逐步逼近模擬量的功能。
(3)逐次比較器
為了進一步提升比較的速度,設計了逐次比較器。下圖是三位逐次比較器的原理圖

引入了具有鎖存功能的d觸發(fā)器,三位得出比較結果分別上接三個RS觸發(fā)器,在比較器C的正極輸入前又加入了累加器,減去了半個量化誤差。當要輸出的位數(shù)越小時,時鐘端的頻率就越高,處理速度就會越快
2.間接比較器
一般使用的是V-T比較和V-F比較兩類

剩下一個問題是關于A/D轉換的參數(shù)指標。
大致有分辨率(轉換器對輸入信號的分辨能力),轉換誤差(實際輸出與理論輸出之間的差別)轉換精度及轉換時間四類。主要介紹分辨率及轉換時間

1.分辨率:輸入位數(shù)越多,轉換位數(shù)越多,分辨率就越高。
eg:5V是一個轉換器的輸入最大值,若要輸入8位二進制數(shù),則有分辨率5/2^8V=19.53mV
2.轉換時間:
即在實際運用中,需要綜合考慮選用哪一種轉換器最為合適
eg:

每個熱電偶平均1/16s的轉換時間,上述比較器都能用。
從0.1°C可知該轉換器要求的分辨率為1/4500 通過最大電壓范圍0.025/2^n《=1/4500就可得出位數(shù)。
接著介紹集成A/D轉換器的工作原理及實現(xiàn)方法。
因為不同的集成方式下對接口可以有不同的處理方式,一般逐次性轉換器用的比較多,常用型號是ADC0804,實物圖如下
需要注意的端口如下:



因為本人使用的是郭天祥老師的TX-1C增強版,現(xiàn)給出該開發(fā)板上ADC0804的接口方法

引入了74HC573鎖存器,他的Q7端(12引腳)接了AD芯片的片選端口,則可通過控制鎖存器來控制AD
ADIN與AD芯片之間連接要加限流電阻,以免因為電流過大燒毀芯片
而引入R和C,在CLK,CLKR以及GND之間構建振蕩電路,是為芯片提供工作所需的脈沖
也要記住WRˉˉˉˉˉˉ\overline{WR}
WR
與RDˉˉˉˉˉ\overline{RD}
RD
分別接了單片機的P3.6和P3.7接口,這個在編程中定義端口時要用到
在這里十分重要的是芯片啟動的時序圖,在編程中需要對圖中的先后次序以及涉及到機器周期方面的細節(jié)有所體現(xiàn),這才算告訴編譯器一個時序變化的全過程

下圖是寫入數(shù)據(jù)時的過程

我們在寫單片機程序啟動AD時應該遵循上面的時序

下面是讀取數(shù)據(jù)的過程


具體代碼如下
#include《reg52.h》
#include《intrins.h》
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit adwr=P3^6; //讀寫的端口定義
sbit adrd=P3^7;
uchar code table[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x77,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void delayms(uint xms)
{
uint i,j;
for(i=xms;i》0;i--)
for(j=110;j》0;j--);
}
void display(uchar bai,uchar shi,uchar ge)
{
dula=1;
P0=table[bai];
dula=0;
wela=1;
P0=0x7e;//從右到左,為0的位是所選中位
wela=0;
delayms(5);
dula=1;
P0=table[ge];
dula=0;
wela=1;
P0=0x7d;
wela=0;
delayms(5);
dula=1;
P0=table[ge];
dula=0;
wela=1;
P0=0x7b;
wela=0;
delayms(5);//記得加延時
}
void main()
{
uchar a,A1,A2,A3,adval;//A1-A3為三位顯示在主函數(shù)中的變量名
//adval是中間變量
wela=1;
P0=0x7f;//初值
wela=0;
while(1)
{
adwr=1;//寫的全過程(類似于波形)
_nop_();
adwr=0;
_nop_();
adwr=1;
for(a=10;a》0;a--)//由于開發(fā)板頻率較低,搞出點延時來
{
display(A1,A2,A3);
}
P1=0xff;//初始化
adrd=1;//讀過程
_nop_();//機器周期延時
adrd=0;
_nop_();
adval=P1;//把P1的值讀入
adrd=1;//高電平抬起
A1=adval/100;
A2=adval%100/10;
A3=adval%10;
}
}
l=P1;//把P1的值讀入
adrd=1;//高電平抬起
A1=adval/100;
A2=adval%100/10;
A3=adval%10;
}
}
責任編輯:gt
電子發(fā)燒友App





























評論