模擬信號的幅度一般隨時間變化而連續變化。以下就是不同性質模擬量的波形
而單片機中一般運算用的是數字量(0/1的組合),這就涉及到了外圍電路需要有一個模數轉換的過程。顧名思義是把輸入的模擬信號盡可能無失真地轉化為數字量。
如果把數字量形容成是一個個分塊儲存信息的模塊,那模擬量這種連續的信息在轉換過程中要盡可能避免信息的喪失。處不來講轉換的思路就是把數字量分塊,以數字的形式轉換至數字量中。如數字量為有六位(000000-111111),那么就可以把模擬量均等分為64份,每份中儲存著轉換過來的相應信息。
但是這個只是我們的初步思路,從原理上講,一般的A/D轉換分為采樣保持,量化和編碼三個過程。采樣的量一般是電壓(電流不好取),通過一定的采樣保持時間過后把采樣的電壓量轉換為數字量,并按一定形式的0/1編碼順序給出轉換結果,這就是得到了相應的數字信號。框圖如下:
下面分別介紹相應的理論知識。
1.采樣定理:(信號里面基本接觸過,還可以參考無失真系統需要具備的條件等知識)
采樣定理反映了采樣信號頻率與輸入信號頻率之間的制約關系,可理解為采樣信號的頻譜(低通濾波器)一定要包含輸入信號頻譜的全部內容。
因為每次將采樣電壓轉化為數字量需要一定的時間,所以采樣后也必須把采樣電壓保持一段時間,故在采樣過程中最后反應出的Vi都是采樣結束時候的值。
2.量化與編碼
數字信號一定是在數值上離散的。且任何一個數字量都會是一個基礎數字量的整數倍。
故選取一個最小的變量作為單位變量。將模擬電壓與之相除后就能得出相應的數字二進制代碼,經推算也可以得出對應的模擬電平。
上圖的單位變量就為1/8V,量化誤差(每兩個單位間隔中可能出現的最大誤差)也是1/8.
這其中有一個小知識點。怎么設計電路使其有采樣和保持的功能。
簡單的采樣保持電路如下圖所示,其將MOS管作為啟動和停止的開關,將信號通過反相放大器后得出輸出電壓。
這里的場效應管也有反相截止的功能。即當輸入由高轉低時,電流無法通過場效應管。
對于這種采樣速度低的電路,可以有以下改進
VL引腳控制著開關的閉合,當為高電平時開關打開。模擬電壓可經過兩級跟隨器傳至Vo
當VL由高變低時,還有電容Ch放電提供相應電壓,電平得以維持。
當輸入的電壓比較大,超出了開關所能承受的最大電壓時,引入一個二極管電路,通過單向導通的性質可以起到分壓的作用,且當電壓合適時該電路不起分壓作用。
常用的A/D轉換器有直接A/D轉換器(并行型/反饋比較型)以及間接A/D(需要轉成T,f等中間變量后再轉換)
1.直接
電壓比較器是對輸入電壓進行分類,如圖所示,運放的負極接模擬電平大小為2n-1/15(n=1,2,……7)的端口,分壓電阻每兩個電阻之間的節點都接在VI引出的這條總線上。進行電壓比較后將比較結果數據傳到寄存器。寄存器設置的目的是因為比較結果可能會有變化,待穩定后通過譯碼器部分對相應的結果轉化為二進制數字變量。各種變量之間的對應關系如下
這種電路特點是傳輸速度較快,但缺點是隨著二進制數字量位數的增加,需要比較器的數量呈指數型增長(2^n-1),且自帶采樣保持功能
(2)反饋比較型A/D
引入一個D/A轉換器和一個計數器,計數器傳送數字信號至D/A,轉為模擬信號后在電壓比較器這里與VI按位做比較,若一致就直接傳送至計數器,不一致通過比較器后也會變為正確的那一項,按位比較重復多次后,計數器將數據傳送至輸出寄存器。因為在比較過程中數字不斷變化,故設置了輸出寄存器。這樣就可以起到逐步逼近模擬量的功能。
(3)逐次比較器
為了進一步提升比較的速度,設計了逐次比較器。下圖是三位逐次比較器的原理圖
引入了具有鎖存功能的d觸發器,三位得出比較結果分別上接三個RS觸發器,在比較器C的正極輸入前又加入了累加器,減去了半個量化誤差。當要輸出的位數越小時,時鐘端的頻率就越高,處理速度就會越快
2.間接比較器
一般使用的是V-T比較和V-F比較兩類
剩下一個問題是關于A/D轉換的參數指標。
大致有分辨率(轉換器對輸入信號的分辨能力),轉換誤差(實際輸出與理論輸出之間的差別)轉換精度及轉換時間四類。主要介紹分辨率及轉換時間
1.分辨率:輸入位數越多,轉換位數越多,分辨率就越高。
eg:5V是一個轉換器的輸入最大值,若要輸入8位二進制數,則有分辨率5/2^8V=19.53mV
2.轉換時間:
即在實際運用中,需要綜合考慮選用哪一種轉換器最為合適
eg:
每個熱電偶平均1/16s的轉換時間,上述比較器都能用。
從0.1°C可知該轉換器要求的分辨率為1/4500 通過最大電壓范圍0.025/2^n《=1/4500就可得出位數。
接著介紹集成A/D轉換器的工作原理及實現方法。
因為不同的集成方式下對接口可以有不同的處理方式,一般逐次性轉換器用的比較多,常用型號是ADC0804,實物圖如下
需要注意的端口如下:
因為本人使用的是郭天祥老師的TX-1C增強版,現給出該開發板上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接口,這個在編程中定義端口時要用到
在這里十分重要的是芯片啟動的時序圖,在編程中需要對圖中的先后次序以及涉及到機器周期方面的細節有所體現,這才算告訴編譯器一個時序變化的全過程
下圖是寫入數據時的過程
我們在寫單片機程序啟動AD時應該遵循上面的時序
下面是讀取數據的過程
具體代碼如下
#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為三位顯示在主函數中的變量名
//adval是中間變量
wela=1;
P0=0x7f;//初值
wela=0;
while(1)
{
adwr=1;//寫的全過程(類似于波形)
_nop_();
adwr=0;
_nop_();
adwr=1;
for(a=10;a》0;a--)//由于開發板頻率較低,搞出點延時來
{
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
評論
查看更多