目錄
AD/DA介紹
硬件電路模型
硬件電路
運算放大器
DA原理
T型電阻網絡DA轉換器
PWM型DA轉換器
AD原理
逐次逼近型AD轉換器
AD/DA性能指標
XPT2046
XPT2046時序
AD/DA介紹
AD(Analog to Digital):模擬-數字轉換,將模擬信號轉換為計算機可操作的數字信號。有時候我們也把AD叫做ADC(C是轉換器converter的縮寫)。比如說模擬電壓,單片機是數字信號,數字信號是只有0V和5V兩種狀態,如果說輸入個2.5V時,那我們怎么讀它呢?它是屬于高電平還是低電平呢?這時候,我們要讀它就需要用一個AD轉換器,將2.5V轉換為一個數字存儲在空間里。這就是AD轉換的一個作用。
DA(Digital to Analog):數字-模擬轉換,將計算機輸出的數字信號轉換為模擬信號。有時候我們也把DA叫做DAC(C是轉換器converter的縮寫)。DA是反過來的,它是數字到模擬轉化。比如說單片機只能輸出高電平和低電平(5V和0V),我們怎么輸出1V,2V和3V呢?我們要輸出一個數據,然后通過DA把這個數據轉化為一個電壓。這就是DA的作用。
AD/DA轉換打開了計算機與模擬信號的大門,極大的提高了計算機系統的應用范圍,也為模擬信號數字化處理提供了可能。
上面第一張圖是光敏電阻,阻值會隨著光線的變化而變化。
第二張圖是熱敏電阻,阻值會隨著溫度的變化而變化。如果我們把上圖的光敏電阻換成熱敏電阻,也就可以獲取熱敏電阻這一點的電壓,從而可以知道溫度的高低。
第三張圖是麥克風,也可以通過這種電阻分壓的形式,將人說話的聲音信號轉換為一個電壓信號,然后通過電壓采集,那數字系統就可以采集到這個聲音信號了。
第四張圖是一個揚聲器(麥克風),像我們電腦里存的數字音樂就是數字信號,怎么才能將它輸出到揚聲器進行播放呢?就需要DA將這個數字信號代表的電壓轉換成實際的電壓,形成一個連續的電壓波形,再送給麥克風,這樣就可以聽到數字信號儲存的音樂了。
AD/DA在開發板的這里
硬件電路模型
PS:模擬量和數字量是成正比的,比如說模擬量是0V,則數字量就是0;如果模擬量是5V,則數字量就是255;如果模擬量是2.5V,則數字量就是255/2;
DA的應用一般可以用PWM來代替,所以DA的使用沒有AD廣泛。
AD轉換通常有多個輸入通道,用多路選擇開關連接至AD轉換器,以實現AD多路復用的目的,提高硬件利用率
AD/DA與單片機數據傳送可使用并口(速度快、原理簡單),也可使用串口(接線少、使用方便)
可將AD/DA模塊直接集成在單片機內,這樣直接寫入/讀出寄存器就可進行AD/DA轉換,單片機的IO口可直接復用為AD/DA的通道
硬件電路
我們開發板上的原理圖上的AD芯片:
原理圖上的DA芯片:
但是我們這一篇主要介紹ADC0809和DA0832,這兩個芯片是比較老舊的,但是它比較經典。所以我們主要了解它們的原理,實際應用的話還是可以用現在新的一些開發板上的AD、DA芯片。
ADC0809:
DA0832:
先看ADC0809的內部框圖和實際芯片
再看DA0832的芯片引腳圖和內部框圖:
在介紹AD/DA的原理之前先介紹一下運算放大器
運算放大器
運算放大器(簡稱“運放”)是具有很高放大倍數的放大電路單元。內部集成了差分放大器、電壓放大器、功率放大器三級放大電路,是一個性能完備、功能強大的通用放大電路單元,由于其應用十分廣泛,現已作為基本的電路元件出現在電路圖中
運算放大器可構成的電路有:電壓比較器、反相放大器、同相放大器、電壓跟隨器、加法器、積分器、微分器等
運算放大器電路的分析方法:虛短、虛斷(負反饋條件下)
其實對于運放的初學者,只需要記住下面這一張圖基本可以解決很多問題了。
首先這是電路中運放的符號,主體是一個三角形,上面有5個引腳
這兩個是電源
上正下負,分別可以接5V和-5V
也可以分別接5V和地,一般來說這種接法是比較多的
這兩個是輸入
這個是輸出
這是運放的傳輸特性圖
運放的內部工作我們可以認為里面是一個開關,這個開關可以打到VCC即5V的一邊,也可以打到GND即0V的一邊。
那這個開關什么時候打到VCC這邊或GND的一邊呢?
這取決于Up和Un的差值。
當Up>Un時,(開關打到VCC)則輸出電壓就接近于正電源電壓Uout=5V
當Up<Un時,(開關打到GND)則輸出電壓就接近于負電源電壓Uout=0V
當Up和Un差不多大時,則輸出電壓=A(Up-Un)+2.5
A是運放的放大倍率,運放的固有參數,我們一開始并不需要太關注這個參數,只需要知道一般來說A都非常大,可以達到幾十萬,也就是說這根線會非常陡峭,或者說這部分的寬度非常窄。Up和Un相差幾十微伏或者更小時,才會進入這個區間。
以上就是運放的初級理論知識,下面開始看運放的第一個實際應用。
運放作為一個電壓比較器來使用
我們來看這是一顆非常常見的運放LM358,價格相當便宜,只要幾毛錢。
而且里面還集成了兩個運放
我們只需要用到其中一個就可以了
給它接好電源和地,然后Up這邊用信號發生器給它輸入一個正弦波,Un這邊通過這個可調電阻,讓它從0V到5V開始變化。
Un電壓從0V上升到5V的過程中,輸出電壓分別會是什么樣子的波形?
顯然當Un電壓在正弦波下面時,Up都是大于Un的,所以輸出為高電平
當Un電壓處于正弦波中間時,下面這部分對應輸出低電平,上面這部分對應輸出高電平
顯然當Un電壓在正弦波上面時,輸出就為低電平
在實際使用的時候,正弦波的輸入可以替換為一些傳感器電壓的輸入
比如說這樣一個電路
給光敏電阻光照時,Un>Up,運放就輸出低電平
沒有光照時,Un<Up,運放就輸出高電平
那么運放作為一個電壓比較器來使用時,我們發現這個實際應用中我們主要用到的是運放的這兩個區間:
也就是運放的非線性區或者叫飽和區
而運放真正的核心其實是在這一個狹窄的區間里,也就是線性區
但是這個區間實在是太狹窄了,為了能夠用到這個區間,需要引入一個概念:負反饋。
可以這么說,有了負反饋,運算放大器才能被稱為是運算放大器,否則只能被稱為放大器。
下面我們來看一下這張圖
將Un和輸出接在一起,問Un電壓是多少?
此時Un大概等于Un=2.9999x
因為只要Un和Up不相等,或者說差的很多,那么輸出電壓就一定會變成5V或者0V,進而通過這個路徑反饋回來,不斷修正Un的電壓,直到它和Up電壓差不多為止。
也就是會對應到這條線上的某一個點,這就是所謂的負反饋。
負反饋的過程:
因為當Up>Un時,Uout要從Un上升到5V,上升到3.1V左右時,此時 Uout=Un>Up,Uout又要下降到0,但在下降到2.9V時,Uout=Un<Up,于是Uout又要上升。所以Uout會在 Up 附近震蕩,且越來越接近Up。
如果初學者想不明白負反饋的過程也沒關系,我們只需要記住一個非常重要的結論:
當給運放引入負反饋,也就是把輸出和Un接在一起時,Un就約等于Up。同時又因為Up和Un差的實在太少了,只相差幾十微伏不到,所以我們就認為Up等于Un了。
這里的負反饋不一定是完全短接,通過一個電阻電容連接都是可以的。然后在這些電路中輸入輸出的關系分別是這樣子的(如圖中的關系式),你會發現第一個電路實現了比例的運算,第二個電路實現了加法的運算,而這個電路實現了積分的運算。
所以所謂的運算放大器,它是真的可以用來做運算的
不過在這些圖中,初學者用的最多的是這張圖:
那它有什么用呢?
我們可以這樣子把它接入一個系統
其中Rs是一顆阻值非常小的采樣電阻,用來檢測系統的電流,比如說10毫歐姆。
假如說流過負載的電流有1A,那么此時Rs這一端大概會產生一個10mV的電壓。
這個電壓實在太小了,以至于我們沒有辦法很好的測量到,所以此時運放的這部分電路就派上用處了。假設此時R1是49千歐姆,R2是1千歐姆,那么這個運放就可以把Rs上的電壓放大50倍輸出。這樣我們就可以很方便的通過測量輸出電壓。反推負載上的電流了。
以上就介紹完了初學者需要掌握的運放的兩個主要應用場景。
一個作為比較器,另外一個是作為比例放大器來使用
以上電壓放大器是一種同向放大器。
同向放大器只要稍微變化一下就可以做一個電壓跟隨器
電壓跟隨器(Uin=Uout)。雖然沒有電壓放大的特性,但是它有功率放大的特性。它可以提高輸入信號的驅動能力,因為它內部有功率放大器。比如說輸入信號沒有驅動能力時,通過這個電路時,可以輸出一個一模一樣的信號,同時它有了驅動能力。
我們再補充一下它作為一個反向放大器的實際運用:
反向放大器(輸入的電壓和輸出的電壓是反向的)
這種放大器必須接雙電源,就是接VCC和GND。
再補充兩個知識點:
虛短狀態:負反饋狀態下負極輸入的電壓和正極輸入的電壓是基本相等的。
虛斷狀態:由于輸入阻抗比較大,電流既不從負極輸入端流入也不流出。
那我們利用這兩個知識來分析一下反向放大器的電路:
首先負反饋條件下,負極輸入端和正極輸入端處于虛短狀態,由于正極輸入接了GND,則負極輸入端=正極輸入端=0V。
我們假設負極輸入一個0.1V的電壓,這時就產生一個電流0.1V/R1,由于輸入阻抗非常大,這里處于虛斷狀態,所以這個電流既不會從輸入端流出也不流入,所以電流往R2所在的支路流,,這時候R2所在的支路就產生壓降(電流流過電阻會產生電壓下降,簡稱壓降),壓降=0.1V/R1(電流)*R2,那么輸出端的電壓就等于0V-壓降,即0V-(0.1V/R1)*R2= -(Uin/R1)*R2。(R2/R1就是我們可以靈活調節的放大倍數)
同理,同向放大器的電路(輸入的電壓和輸出的電壓是同向的)也可以利用這兩個知識點來分析:
首先負反饋條件下,負極輸入端和正極輸入端處于虛短狀態,則負極輸入端=正極輸入端=Uin。
經過R1電流是Uin/R1。由于輸入阻抗非常大,負極輸入這里處于虛斷狀態,所以沒有電流從輸入端流入,有一個大小和方向一樣的電流從R2所在的支路流向R1所在支路。這時候R2所在的支路就產生壓降,壓降=(Uin/R1)*R2,那么輸出端的電壓就等于Uin+壓降,即Uin+(Uin/R1)*R2=(1+R2/R1)*Uin。((1+R2/R1)就是我們可以靈活調節的放大倍數)
其他運放應用電路的分析同理。
了解了電壓放大器之后,我們就可以開始分析AD/DA的工作原理了!
DA原理
T型電阻網絡DA轉換器
上圖是前面講過的這個芯片的內部結構
解析:
看了上圖的解析,我們知道了當Rfb=R時的輸出電壓,那么如果Rfb不等于R呢?電壓的表達式怎么來的呢?
我們知道這其實是一個我們前面講過的反向放大器模型。
如果我們能算出這一點的電流,那么電流通過反饋電阻分壓,就可以得出輸出電壓了。
我們看圖就知道這一點的電流是上面的模擬開關撥到1時,上面的所有支路上下來的電流的總和。
首先電阻網絡部分下來的總電流I如何確定呢?
這么多電阻并聯有串聯,最終總阻值等于R,則總電流I=Vref/R
那每一支路的電流是多少呢?
每一個并聯支路的電流的2倍就等于相應干路上的電流。
最終總電流I就等于2倍的I7:I=2I7
這樣實現的是下面8位二進制數據的每一個的位權。比如D1就是D0的2倍,D2就是D1的2倍。
最終I7就等于多少呢?如果以I0為一個單位的話,I7=128*I0
那么I=2I7=2*128*I0=256*I0
I0=I/256=(Vref/R)/256
這樣其他的支路電流就都可以計算出來了。
I7=128*I0,I6=64*I0,I5=32*I0,I4=16*I0,I3=8*I0,I2=4*I0,I1=2*I0
從模擬開關上下來的支流電流匯集在一起是多少個I0呢,就取決于下面8位數據量表示的數值。如果這個數據量表示128,二進制數是1000 0000,則只有第一個模擬開關撥到了1,那么只有I7下來,則從模擬開關上下來的支流電流匯集在一起是128個I0。
則輸出電壓的表達式可以出來了
PS:總電流I=Vref/R,匯集下來多少份電流=(D7~D0)/256*總電流;
匯集下來多少份電流就是流過Rfb的電流,則輸出電壓=0V - 匯集下來多少份電流*Rfb
當然我們常用的是Rfb=R的情況,所以輸出電壓表達式是:
以上這種T型電阻網絡DA轉換器的缺點是比較占用IO口。
我們開發板上的應用的是PWM型DA轉換器,這種模型的好處就是比較節省IO口(一個口輸出PWM信號,一個輸出端),并且輸出的電壓精度比較高(只要占空比比較精細)。缺點是比較消耗單片機資源,因為得輸出PWM波形,而且如果低通濾波器的性能不好的話,輸出的電壓還會有一定的紋波。
我們來看一下這種PWM型DA轉換器:
PWM型DA轉換器
這其實就是我們開發板上用的這種PWM型的DAC,只不過我們開發板上的原理圖比較復雜一點。
解析:
那為什么PWM信號加低通濾波器就能變成一個穩定的直流電壓信號呢?
是因為0~5V的PWM信號占空比50%,它其實是有一個直流分量和一個交流分量在里面的。加一個低通濾波器,截止頻率很低,它可以把交流分量給過濾掉,剩下的就是直流分量(這個直流分量最終就是DA輸出),也就是直流分量就是PWM信號的平均值。那這個平均值是多少呢?如果占空比是50%,那平均值就是2.5V,如果高電平的時間長一點,那很明顯平均值就會上升。如果全是高電平的話,平均值就是5V。如果全是低電平的話,平均值就是0V。
當然后面的結構驅動能力是很弱的,如果接負載,就會影響濾波性能。為了隔離后面的輸出電路,一般會跟一個電壓跟隨器(輸入電壓=輸出電壓,驅動能力很強)
這整個模型的關系式:
PS:VH是高電平
通過上面的分析,其實我們可以將我們開發板上的原理圖簡化成這樣:
AD原理
逐次逼近型AD轉換器
這個就是我們前面說的這個芯片的內部圖
它的工作原理就是,比如輸入一個信號,比如說是2.5V,但是我們還不知道是多少V,我們用DAC輸出一個電壓和這個未知的電壓進行比較,如果DAC的比未知電壓小,就把DAC的電壓調高,反之則調小。最終讓這兩個電壓接近相等,那DAC的電壓就可以表示未知的這個電壓了。間接地把模擬的電壓量轉換成數字量的了。
比較的結果就是高低電平,這個結果就會控制DAC輸出,如果DAC輸出高了,就把DAC的降一下,如果輸出低了,就把DAC的升一下,一位一位地試,當把8位DAC精度試完之后,就可以把DAC的8位數據當做未知模擬電壓值,然后再加定時和控制,EOC(是否轉換完)這些標志位,另外DAC還需要參考電壓。
最后用一個輸出緩存器就可以把這個數字量輸出了。
其實以上的工作原理是利用的二分法查找這種方法
比如,輸入一個在0V~5V范圍的模擬電壓,我們首先讓DAC產生一個2.5V的中間值和這個未知電壓進行比較,如果這個未知電壓比2.5V小的話,我們就把DAC調成(0+2.5)/2=1.25V再進行對比,如果比未知電壓大的話,我們就把ADC調成(1.25+2.5)/2的電壓和它對比,如此循環,最終8次對比就可以和未知電壓的值接近了。
根據這個例子,我們其實是將DAC的8位數據從左往右,就是將第一位置1,第二位置1......這樣開始和未知電壓進行對比。那么比如首先把DAC的2.5V,即1000 0000(也即128)和未知電壓進行對比,如果未知量比這個數小,那么我們把第一位置0,第二位置1,即0100 0000(表示64,也即1.25V),如果未知量比這個數大,那么這個1就保留,再把第三個置1,即0110 0000(表示96,也即(1.25+2.5)/2)再比較......依次判斷8位,最終這8位數據取出來就是表示我們的未知電壓。
AD/DA性能指標
分辨率:指AD/DA數字量的精細程度,通常用位數表示。例如,對于5V電源系統來說,8位的AD可將5V等分為256份,即數字量變化最小一個單位時,模擬量變化5V/256=0.01953125V,所以,8位AD的電壓分辨率為0.01953125V,AD/DA的位數越高,分辨率就越高。
轉換速度:表示AD/DA的最大采樣/建立頻率,通常用轉換頻率或者轉換時間來表示,對于采樣/輸出高速信號,應注意AD/DA的轉換速度。
通過以上介紹我們了解了逐步逼近型AD轉換器的原理,那么我們來看一款逼近型AD轉換器芯片:
XPT2046
XPT2046時序
比如下圖,三個設備共用那三根線,每個芯片都有單獨的CS片選,如果主機要和設備1進行通信,那就把第一個CS選中,其他設備不影響通信。
注:有時候DIN也叫MISO(主設備輸入從設備輸出),DOUT也叫MOSI(主設備輸出從設備輸入)
解析圖:
再看我們開發板上原理圖:
以上就是本篇全部內容,下一節開始代碼演示!
聲明:
本專欄是本人跟著B站江科大的視頻的學習過程中記錄下來的筆記,部分內容借鑒了江科大的視頻資料。我之所以記錄下來是為了方便自己日后復習。如果你也是跟著江科大的視頻學習的,可以配套本專欄食用,如有問題可以留言交流,同時也可以私信我拉進微信群聊。