信號發(fā)生器的設計.ppt
《信號發(fā)生器的設計.ppt》由會員分享,可在線閱讀,更多相關《信號發(fā)生器的設計.ppt(77頁珍藏版)》請在裝配圖網上搜索。
電子工業(yè)出版社,單片機控制技術 項目式教程 (C語言版),電子工業(yè)出版社,項目9 信號發(fā)生 器的設計,能了解D/A轉換器的相關技術指標; 能理解DAC0832的工作原理與應用方法; 能掌握DAC0832與51單片機的接口方法; 能掌握信號發(fā)生器的硬件電路的分析與設計方法; 能熟練編寫信號發(fā)生器產生各種波形信號的單片機控制程序。,學習目標,敘述D/A轉換器的技術指標要求; 敘述DAC0832的工作原理; 設計單片機控制的信號發(fā)生器的工作電路; 編寫信號發(fā)生器產生各種波形信號的單片機控制程序。,工作任務,任務9.1 燈光亮度調節(jié)器的設計 任務9.2 信號發(fā)生器的設計 項目拓展 串行D/A轉換芯片PCF8591在實驗板 上的應用 項目小結 思考與訓練,項目9 信號發(fā)生器的設計,任務9.1 燈光亮度調節(jié)器的設計,D/A轉換的功能就是將數(shù)字量轉換成模擬量。 基本的D/A轉換器由電壓基準或電流基準、精密電阻網絡、電子開關及全電流求和電路構成。,9.1.1 D/A轉換器的基本原理,1.D/A 轉換器的分類 按工作方式分:并行D/A轉換器(權電阻D/A轉換器、 R- 2R T型D/A轉換器) 串行D/A轉換器 間接D/A轉換器,按D/A轉換的分辨率分:低分辨率D/A轉換器 中分辨率D/A轉換器 高分辨率D/A轉換器,按模擬量輸出方式分:電流輸出D/A轉換器 電壓輸出D/A轉換器,按模擬電子開關電路的不同分: CMOS開關型D/A轉換器(速度要求不高) 雙極型開關D/A轉換器 電流開關型(速度要求較高) ECL電流開關型(轉換速度更高),,2.D/A 轉換器的組成,D/A轉換器由數(shù)碼寄存器、模擬電子開關電路、解碼網絡、求和電路及基準電壓等幾部分組成。 以R-2R T型D/A轉換器為例,其由基準電壓Vref、T型(R-2R)電阻網絡、位切換開關和運算放大器組成。,3.D/A 轉換器的工作原理,數(shù)字量是用代碼按數(shù)位組合起來表示的,對于有權碼,每位代碼都有一定的位權。為了將數(shù)字量轉換成模擬量,必須將每1位的代碼按其位權的大小轉換成相應的模擬量,然后將這些模擬量相加,即可得到與數(shù)字量成正比的總模擬量,實現(xiàn)數(shù)字—模擬轉換。,R-2R T型D/A轉換器工作原理:,圖9.1 R-2R T型D/A轉換器原理電路,,圖示的電路是一個3位二進制數(shù)的D/A轉換電路,每位二進制數(shù)控制一個開關S。當?shù)趇位的數(shù)碼為“0”時,開關Si打在左邊;當?shù)趇位的數(shù)碼為“1”時,開關Si打在右邊。當S0接通時, I0′= I0〞= I0 , I1′= I0′+ I0〞= 2I0 同理 I1′= I1〞= I1 , I2′= 2I1 I2′= I2〞= I2 , I = 2I2 推出 I0 = I/8 ,I1 = I/4 ,I2 = I/2 ∑I = I0 + I1 + I2 =(1/8 + 1/4 + 1/2)I = - Uref(1/8 + 1/4 + 1/2)/R,,將上式推廣到n位二進制數(shù)的轉換,可得一般表達式 ∑I=- Uref(a0/2n + a1/2n-1 + … + an-1/21 +an/20)/R 則輸出電壓為 Uo=(∑I)Rf=-Uref(a0/2n+ a1/2n-1+…+an-1/21+an/20)Rf/R,輸出電壓會因器件誤差、集成運放的非理想特性而產生一定的轉換誤差。,,一般D/A轉換器:,UOUT = BUr 其中:Ur為常量,由參考Uref決定。 B為輸入數(shù)字量,為二進制數(shù)。B可為8位、12位、16 位等,由DAC芯片型號決定。 當B為n位時: B=bn-1bn-2…b1b0=bn-12n-1+ bn-22n-2+…+ b121+b020 式中,bn-1為最高位;b0為最低位。,,1.分辨率 分辨率是D/A轉換器對輸入量變化敏感程度的描述,與輸入數(shù)字量的位數(shù)有關。如果數(shù)字量的位數(shù)為n,則D/A轉換器的分辨率為1/2n。即數(shù)/模轉換器能對滿刻度的1/2n輸入量作出反應。,9.1.2 D/A轉換器的技術性能指標,分辨率=輸出模擬量的滿量程值/2n,如:8位數(shù)的分辨率為1/256,10位數(shù)分辨率為1/1024,通常用D/A轉換器輸入數(shù)字量的位數(shù)來表示分辨率。,D/A轉換器??煞譃?位、10位、12位三種。,,2.精度,如果不考慮D/A的轉換誤差,D/A轉換的精度為其分辨率的大小。因此,要獲得一定精度的D/A轉換結果,首要條件是選擇有足夠分辨率的D/A轉換器。,轉換速度是DAC每秒可以轉換的次數(shù),其倒數(shù)為轉換時間。轉換時間是指從輸入數(shù)字量到轉換為模擬量輸出所需的時間。當D/A轉換器的輸出形式為電流時,轉換時間較短;當D/A轉換器的輸出形式為電壓時,轉換時間要加上運算放大器的延遲時間而長一點,一般在幾十微秒內。,3.轉換速度,,4.建立時間,建立時間是指從輸入數(shù)字量變化到輸出達到終值誤差(1/2)LSB(最低有效位)時所需的時間,即輸入的數(shù)字量變化后,輸出模擬量穩(wěn)定到相應的數(shù)字范圍內所需的時間。 通常以建立時間來表示轉換速度。,輸入編碼形式是指D/A轉換電路輸入的數(shù)字量的形式。如二進制碼、BCD碼等。,5.輸入編碼形式,,6.線性度,線性度是指D/A轉換器的實際轉移特性與理想直線之間的最大誤差,或最大偏移。通常給出在一定溫度下的最大非線性度,一般為0.01%~0.03%。,大部分D/A轉換芯片是電壓型輸出,一般為5~10V;也有高壓輸出型的,為24~30V。有一些是電流型的輸出,低者為20mA左右,高者可達3A。,7.輸出電平,8.尖峰,尖峰是輸入的數(shù)字量發(fā)生變化時產生的瞬時誤差。通常尖峰的轉換時間很短,但幅度很大。在許多場合是不允許有尖峰存在的,應采取措施予以消除。,,正確了解D/A轉換器件的技術性能參數(shù),對于合理選用轉換芯片、正確設計接口電路十分重要。,D/A轉換器的性能指標很多,但在選用合適的芯片型號時主要考慮的是它的分辨率、精度和轉換速度。,,目前單片機系統(tǒng)常用的D/A轉換器的轉換精度有8位、10位、12位等,與單片機的接口方式有并行接口、串行接口。,9.1.3 DAC0832芯片及其與單片機接口電路,1.DAC0832芯片介紹,(1)DAC0832的性能 8位D/A轉換器,單電源供電,在+5~+15 V范圍均可正常工作?;鶞孰妷旱姆秶鸀?0V;電流建立時間為1μs;CMOS工藝,低功耗(僅為20 mW)。,DAC0832主要特性: 輸出電流線性度可在滿量程下調節(jié); 轉換時間(電流建立時間)為1μs; 數(shù)據(jù)輸入可采用雙緩沖、單緩沖或直通方式; 增益溫度補償為0.02%FS/℃; 每次輸入數(shù)字為8位二進制數(shù); 低功耗,20mW; 邏輯電平輸入與TTL兼容; 基準電壓的范圍為10V; 單電源供電,可在+5~+15V 內正常工作。,(2)DAC0832的內部結構,該轉換器由輸入寄存器和DAC寄存器構成兩級數(shù)據(jù)輸入鎖存。使用時數(shù)據(jù)輸入可以采用兩級鎖存(雙鎖存)形式,或單級鎖存(一級鎖存,一級直通)形式,或直接輸入(兩級直通)形式。 此外,由3個與門電路可組成寄存器輸出控制邏輯電路,該邏輯電路的功能是進行數(shù)據(jù)鎖存控制。當 =0時,輸入數(shù)據(jù)被鎖存;當 =1時,鎖存器的輸出跟隨輸入的數(shù)據(jù)。 D/A轉換電路是一個R-2R T型電阻網絡,可實現(xiàn)8位數(shù)據(jù)的轉換。,(3)DAC0832的引腳 DAC0832為20引腳、雙列直插式封裝。,Vcc:電源線。DAC0832的電源可以在+5~+15V內變化。典型使用時用+15V電源。 AGND和DGND:AGND為模擬量地線,DGND為數(shù)字量地線。使用時,這兩個接地端應始終連在一起。,CS:片選輸入信號,低電平有效。只有當CS=0時,這片DAC0832才被選中。 DI0~DI7:8位數(shù)字量輸入端。應用時,如果數(shù)據(jù)不足8位,則不用的位一般接地。,,ILE:輸入鎖存允許信號,高電平有效。只有當ILE=1時,輸入數(shù)字量才可能進入8位輸入寄存器。 WR1:寫信號1,低電平有效,控制輸入寄存器的寫入。ILE和WR1信號控制輸入寄存器是數(shù)據(jù)直通方式還是數(shù)據(jù)鎖存方式:當ILE=1且WR1=0時,為輸入寄存器直通方式;當ILE=1且WR1=1時,為輸入寄存器鎖存方式。 WR2:寫信號2,低電平有效,控制DAC寄存器的寫入。 XFER:數(shù)據(jù)傳送控制輸入信號,低電平有效,控制數(shù)據(jù)從輸入寄存器到DAC寄存器的傳送。WR2和XFER信號控制DAC寄存器是數(shù)據(jù)直通方式還是數(shù)據(jù)鎖存方式:當WR2=0且XFER =0時,為DAC寄存器直通方式;當WR2=1或XFER =1時,為DAC寄存器鎖存方式。,,,,,,,,,,,,Vref:參考電壓線。Vref接外部的標準電源,與芯片內的電阻網絡相連接,該電壓可正可負,范圍為-10~+10V。 Iout1和Iout2:電流輸出端。Iout1為DAC電流輸出1,當DAC寄存器中的數(shù)據(jù)為0xFF時,輸出電流最大,當DAC寄存器中的數(shù)據(jù)為0x00時,輸出電流為0。Iout2為DAC電流輸出2。DAC轉換器的特性之一是Iout1+Iout2=常數(shù)。在實際使用時,總是將電流轉為電壓來使用,即將Iout1和Iout2加到一個運算放大器的輸入端。,Rfb:運算放大器的反饋電阻端,電阻(15kΩ)已固化在芯片中。因為DAC0832是電流輸出型D/A轉換器,為得到電壓的轉換輸出,使用時需在兩個電流輸出端接運算放大器,Rfb即為運算放大器的反饋電阻。,圖9.5 運算放大器的接法,(4)DAC0832的工作原理,將數(shù)字量的每一位按權值分別轉換成模擬量,再通過運算放大器求和相加,D/A轉換器內部有一個解碼網絡,以實現(xiàn)按權值分別進行D/A轉換。,(5)DAC0832的輸出,DAC0832是電流輸出型D/A轉換器。,圖9.6 DAC0832單極性電壓輸出電路,單極性輸出運放: Vout=-Iout1Rfb =-BVref/256,雙極性輸出運放: Vout = -( Vout1/R +Vref/2R )2R = -2Vout1-Vref = 2BVref/256-Vref = BVref/128-Vref = Vref(B-128)/128,圖9.7 DAC0832雙極性電壓輸出電路,當Vref為正,數(shù)字量在0x01~0x7F之間變化時,Vout為負值;當數(shù)字量在0x80~0xFF之間變化時,Vout為正值。,(1)直通方式下的接口電路 直通方式是數(shù)據(jù)直接輸入(兩級直通)的形式。 兩個8位數(shù)據(jù)寄存器都處于數(shù)據(jù)接收狀態(tài),LE1=1,LE2=1,ILE=1,而WR1、WR2、CS和XFER均為0。輸入數(shù)據(jù)直接送到內部D/A轉換器去轉換。,2.DAC0832與51單片機的接口電路,DAC0832的工作方式:直通方式、單緩沖方式和雙緩沖方式,圖9.8 直通方式下89C51與DAC0832的連接圖,(2)單緩沖方式下的接口電路 單緩沖方式是單級鎖存(一級鎖存,一級直通)形式, 就是使DAC0832的兩個8位數(shù)據(jù)寄存器中有一個處于直通方式,而另一個處于受控的鎖存方式,或者兩個8位數(shù)據(jù)寄存器處于同時受控的方式,即同時送數(shù),同時鎖存。,① 在單緩沖工作方式下,可以將8位DAC寄存器置于直通方式。為此,應將WR2和XFER接地,而輸入寄存器的工作狀態(tài)受單片機的控制。,WR=0,P2.7=0, DAC0832的地址為 0x7FFF, 將數(shù)字量0x08轉換為模擬量的程序: #define DAC0832 XBYTE[0x7FFF] DAC0832=0x08; 或 output(0x7FFF,0x08);,②兩個輸入寄存器同時受控的連接方法,WR1和WR2一起接89C51的WR,CS和XFER共同接89C51的P2.7,因此兩個寄存器的地址相同。,(3)雙緩沖方式下的接口電路 雙緩沖方式的數(shù)據(jù)輸入可以采用兩級鎖存(雙鎖存)的形式,就是把DAC0832的兩個鎖存器都接成受控鎖存方式。DAC0832的WR1、WR2、CS和XFER都受單片機送來的信號的控制。,當 WR=0,P2.7=0,P2.6=1,8位輸入寄存器處于送數(shù)狀態(tài), 8位DAC寄存器處于鎖存狀態(tài),不能進行D/A轉換。,雙緩沖方式下89C51與兩片DAC0832的連接圖,如DAC0832的8位輸入寄存器地址為0x7FFF, WR=0,P2.7=1,P2.6=0,8位DAC寄存器處于送數(shù)據(jù)狀態(tài),開始進行D/A轉換。DAC0832的8位DAC寄存器的地址為0xBFFF,將一個數(shù)字量轉換為模擬量的程序:,#define DAC0832_1 XBYTE[0xBFFF] #define DAC0832_2 XBYTE[0x7FFF] DAC0832_1=0x08; DAC0832_2=0x08; 或 output(0xBFFF, 0x08) ; output(0x7FFF, 0x08) ;,1.任務要求,9.1.4 燈光亮度調節(jié)器的設計,用AT89C51單片機和DAC0832控制一個發(fā)光二極管,使發(fā)光二極管的亮度逐漸變暗,再逐漸變亮,不斷循環(huán)。,2.任務分析,改變發(fā)光二極管的亮度,就要改變通過發(fā)光二極管的電流。方法很多,利用AT89C51控制DAC0832數(shù)模轉換芯片,DAC0832的輸出轉換成電壓去驅動發(fā)光二極管。當DAC0832的輸入數(shù)字量變化時,輸出電壓改變,通過發(fā)光二極管的電流變化,發(fā)光二極管的亮度就改變。,3.任務設計,(1)器件選擇,(2)硬件原理圖設計 DAC0832單緩沖方式, P2和P0決定地址,片選信號CS低電平有效,P2.7為0,DAC0832的地址為0x7FFF。,(3)軟件程序設計: #include #include #define uint unsigned int #define uchar unsigned char #define DAC0832 XBYTE[0x7FFF] //延時子程序 void DelayMS(uint x) { uchar t; while(x--) for(t=0;t120;t++); },//主程序控制燈光亮度變化 void main() { uchar i; while(1) {for(i=256;i0;i--) {AC0832=i; DelayMS(1); } for(i=0;i256;i++) {AC0832=i; DelayMS(1); } } },(4)軟硬件聯(lián)合調試 在Protus環(huán)境下,將編譯好的軟件下載到AT89C51中運行,可以看到LED燈如任務要求的一樣先由亮逐漸變暗,再由暗逐漸變亮。,1.任務要求,任務9.2 信號發(fā)生器的設計,用單片機AT89C51和D/A轉換芯片DAC0832組成的信號發(fā)生器生成要求周期和幅度(0V~+5V)的鋸齒波、三角波、方波或正弦波。,2.任務分析,鋸齒波:向DAC0832反復送入0x00~0xFF數(shù)據(jù),就會生成 幅度為0V~+5V的鋸齒波 三角波:向DAC0832反復送入0x00~0xFF和0xFF ~0x00數(shù) 據(jù),就會生成幅度為0V~+5V的三角波,方波:向DAC0832送入一定時長的0x00和一定時長的0xFF, 就會生成幅度為0V~+5V的方波,波形的周期與單片機的機器周期和程序中的延時長短相關。,正弦波:等時間間隔分割正弦信號,計算出分割時刻的信 號幅值,將幅值對應的數(shù)字量存儲到ROM中,然后 用查表的方法取出這些取樣值,送到DAC0832轉換 后輸出,那么輸出信號就是正弦波形。,如:波形頻率為50Hz的正弦波信號, 正弦波信號以5作為1個階梯, 則分成 360/5=72份, 時間間隔為 20ms/72=0.278ms。 當參考電壓為-5V時,72個采樣值、輸 出電壓值、正弦值、角度如表9.2所示。,表9.2 正弦波數(shù)據(jù)表,3.任務設計,(1)器件選擇,(2)硬件原理圖設計 DAC0832工作于單緩沖方式,地址為0x7FFF。Vref接-5V電壓,輸出的單極性電壓在0~+5V之間變化。,(3)軟件程序設計: ①產生鋸齒波的源程序如下: #include #include #define uint unsigned int #define uchar unsigned char #define DAC0832 XBYTE[0x7FFF] //延時子程序 void DelayMS(uint x) { uchar t; while(x--) for(t=0;t120;t++); },// 主程序生成鋸齒波 void main() { uchar i; while(1) {for(i=0;i256;i++) DAC0832=i; DelayMS(1); } },②產生三角波的源程序如下: #include #include #define uint unsigned int #define uchar unsigned char #define DAC0832 XBYTE[0x7FFF] //延時子程序 void DelayMS(uint x) { uchar t; while(x--) for(t=0;t120;t++); },// 主程序生成三角波 void main() { uchar i; while(1) {for(i=0;i0;i--) DAC0832=i; DelayMS(1); } },③產生正弦波的源程序如下: #include #include #define uint unsigned int #define uchar unsigned char #define DAC0832 XBYTE[0x7FFF],//初始化正弦波波形數(shù)據(jù)數(shù)組 uchar code data[ ]={0x7F,0x8A,0x95,0xA0,0xAB,0XB5, 0xBF,0xC8,0xD1,0xD9,0xE1,0xE7,0xED,0xF3, 0xF7,0xFA,0xFD,0xFE,0xFF,0xFE,0xFD,0xFA, 0xBF,0xF3,0xED,0xE7,0xE1,0xD9,0xD1,0xC8, 0xBF,0xB5,0xAB,0xA0,0x95,0x8A,0x7F,0x75, 0x6A,0x5F,0x54,0x4A,0x40,0x36,0x2D,0x25, 0x1E,0x17,0x11,0x0C,0x07,0x04,0x02,0x01, 0x00,0x01,0x02,0x04,0x07,0x0C,0x11,0x17, 0x1E,0x25,0x2D,0x36,0x40,0x4A,0x54,0x5F, 0x6A,0x75};,//延時子程序 void DelayMS(uint x) { uchar t; while(x--) for(t=0;t120;t++); } //主程序生成正弦波 void main() { uchar i; while(1) {for(i=0;i72;i++) DAC0832= data[i]; DelayMS(1); } },(4)軟硬件聯(lián)合調試 將上面相應波形的程序編譯為*.hex文件后,在Proteus繪制的原理圖中,將*.hex文件加載到單片機AT89C51中運行,在虛擬示波器上可以看到對應的波形圖。在Proteus仿真運行過程中可能會提示CPU過載,這時虛擬示波器可能會無法實時顯示波形,可將虛擬示波器通道A中指向1的黃色旋鈕從1開始先正向旋轉一圈,再反向旋轉一圈,這樣會使虛擬示波器盡快刷新顯示波形。,1.PCF8591簡介,項目拓展 串行D/A轉換芯片PCF8591在實驗板上的應用,PCF8591是一個單片集成的具有I2C總線接口的8位A/D及D/A轉換器,有4路A/D輸入,1路D/A輸出。PCF8591的輸入輸出地址、控制和數(shù)據(jù)信號都是通過I2C總線以串行的方式進行傳輸。,PCF8591的主要特性: 單獨供電 PCF8591的操作電壓范圍+2.5V~+6V 低待機電流 通過IC總線串行輸入/輸出 PCF8591通過3個硬件地址引腳尋址 PCF8591的采樣率由IC總線速率決定 4個模擬輸入可編程為單端型或差分輸入 自動增量頻道選擇 PCF8591的模擬電壓范圍從VSS到VDD PCF8591內置跟蹤保持電路 8-bit逐次逼近A/D轉換器 通過1路模擬輸出實現(xiàn)DAC增益,2.PCF8591內部結構框圖,3.PCF8591引腳功能,4.PCF8591工作原理,PCF8591采用典型的I2C總線接口器件尋址方法,即總線地址由器件地址(1001)、引腳地址(由A0~A2接地或+5V來確定,接地代表0,接+5V代表1)、方向位(即R/W)組成。在I2C總線系統(tǒng)中最多可接8個這樣的器件。,表9.5 PCF8591總線地址,R/W=1表示讀操作,R/W=0表示寫操作。如果將A0~A2接地,則讀地址為91H;寫地址為90H。 地址字節(jié):由器件地址、引腳地址、方向位組成,它是通信時主機發(fā)送的第一字節(jié)數(shù)據(jù)。 控制字節(jié):用于控制PCF8951的輸入方式、輸入通道、D/A轉換等,是通信時主機發(fā)送的第二字節(jié)數(shù)據(jù),其格式如下表。,,,,,,,,,,,,,,,,,D/A轉換的數(shù)據(jù)輸入和A/D轉換的數(shù)據(jù)輸出都是通過I2C總線串行輸入和輸出的。因此PCF8951中I2C總線的通信格式包括寫數(shù)據(jù)格式和讀數(shù)據(jù)格式。,,,,,,,,,,,,,,,,,PCF8591的I2C總線寫數(shù)據(jù)格式:,PCF8591的I2C總線讀數(shù)據(jù)格式:,5.I2C總線,(1)I2C總線數(shù)據(jù)位的傳輸,I2C總線上每傳輸一個數(shù)據(jù)位必須產生一個時鐘脈沖,I2C總線上數(shù)據(jù)傳輸?shù)挠行砸骃DA線上的數(shù)據(jù)必須在時鐘線SCL的高電平期間保存穩(wěn)定,數(shù)據(jù)線的改變只能在時鐘線為低電平期間。,I2C總線由2根線:串行數(shù)據(jù)線(SDA)和串行時鐘線(SCL)。,總線上的每一個器件都有一個唯一的地址。,(2)I2C總線數(shù)據(jù)的傳輸,數(shù)據(jù)傳輸中的應答:相應的應答位由接收方(從機)產生,在應答的時鐘脈沖期間,發(fā)送方(主機)應釋放SDA線(使其為高電平)。在應答過程中,接收方(從機)必須將數(shù)據(jù)線SDA拉低,使它在這個時鐘脈沖的高電平期間保持穩(wěn)定的低電平。,數(shù)據(jù)傳輸?shù)淖止?jié)格式:發(fā)送到SDA線上的每一個字節(jié)必須為8位,每次發(fā)送的字節(jié)數(shù)量不受限制,從機在接收完一個字節(jié)后向主機發(fā)送一個應答位,主機在收到從機應答后才會發(fā)送第二字節(jié)數(shù)據(jù),發(fā)送數(shù)據(jù)時先發(fā)數(shù)據(jù)的最高位。,(3) I2C總線的傳輸協(xié)議,主機寫數(shù)據(jù)到從機的通信格式:,主機從從機中讀數(shù)據(jù)的通信格式:,6. 實驗板上鋸齒波信號的輸出,(1)STC89C52控制PCF8591生成鋸齒波信號的電路設計,將U15的J23的19和20腳用杜邦線與J8的SDA和SCL腳連接。,(2)生成鋸齒波的軟件設計,① 主程序main.c: // PCF8591 的DA轉換程序 #include #include “i2c.h“ #define AddWr 0x90 //寫數(shù)據(jù)地址 #define AddRd 0x91 //讀數(shù)據(jù)地址 //鋸齒波數(shù)據(jù)表,表格數(shù)值越多,波形越平滑 unsigned char code tab[] = { 0,10,20,30,40,50,60,70,80,90, 100, 110,120,130,140,150,160,170,180, 190,200, 210,220,230,240,250 }; //定義全局變量 extern bit ack;,//寫入DA轉換數(shù)值,dat表示需要輸入轉換的DA數(shù)值,從0-255 bit WriteDAC(unsigned char dat,unsigned char num) { unsigned char i; Start_I2c(); //啟動總線 SendByte(AddWr); //發(fā)送器件地址 if(ack==0) return(0); SendByte(0x40); //發(fā)送器件子地址 if(ack==0) return(0); for(i=0;inum;i++) { SendByte(dat); //發(fā)送數(shù)據(jù) if(ack==0) return(0); } Stop_I2c(); },//主程序 main() { unsigned char i; while (1) { for(i=0;i26;i++) WriteDAC(tab1[i],1); } },②I2C頭文件i2c.h: #ifndef __I2C_H__ #define __I2C_H__ #include //頭文件的包含 #include #define _Nop() _nop_() //定義空指令 //啟動總線 void Start_I2c(); //結束總線 void Stop_I2c(); //字節(jié)數(shù)據(jù)傳送函數(shù) void SendByte(unsigned char c); #endif,③I2C程序i2c.c: //函數(shù)是采用軟件延時的方法產生SCL脈沖, 晶振頻率是12MHz,即機器周期為1us #include “i2c.h“ #define _Nop() _nop_() //定義空指令 bit ack; //應答標志位 sbit SDA=P2^1; sbit SCL=P2^0;、 //啟動總線 void Start_I2c() { SDA=1; //發(fā)送起始條件的數(shù)據(jù)信號 _Nop(); SCL=1; _Nop(); //起始條件建立時間大于4.7us,延時 _Nop(); _Nop(); _Nop(); _Nop();,SDA=0; //發(fā)送起始信號 _Nop(); //起始條件鎖定時間大于4μ _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; //鉗住I2C總線,準備發(fā)送或接收數(shù)據(jù) _Nop(); _Nop(); } //結束總線 void Stop_I2c() { SDA=0; //發(fā)送結束條件的數(shù)據(jù)信號 _Nop(); //發(fā)送結束條件的時鐘信號 SCL=1; //結束條件建立時間大于4μ _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SDA=1; //發(fā)送I2C總線結束信號 _Nop(); _Nop(); _Nop(); _Nop(); },//字節(jié)數(shù)據(jù)傳送函數(shù) void SendByte(unsigned char c) { unsigned char BitCnt; for(BitCnt=0;BitCnt8;BitCnt++) //要傳送的數(shù)據(jù)長度為8位 { if((cBitCnt) },_Nop(); _Nop(); SDA=1; //8位發(fā)送完后釋放數(shù)據(jù)線,準備接收應答位 _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop(); if(SDA==1) ack=0; else ack=1; //判斷是否接收到應答信號 SCL=0; _Nop(); _Nop(); },將上面的幾個程序放入Kiel C51的一個工程文件中進行編譯,生成*.hex文件后,通過USB口下載到實驗板中。程序運行之后,用示波器測量J33的上面一個OUT腳,調節(jié)示波器,可以清晰地看到鋸齒波波形。,注意:在使用PCF8591進行D/A轉換時,硬件電路連接非常簡單,軟件相對比較復雜,單片機通過I2C總線發(fā)送數(shù)字信號,所以一定要嚴格按照I2C總線的通信格式要求發(fā)送數(shù)據(jù)。,項目小結,本項目介紹了單片機常用的外接8位并行D/A轉換芯片DAC0832的原理和應用。通過兩個任務學習了采用單片機和DAC0832實現(xiàn)各種信號發(fā)生器的設計方法。 DAC0832完成數(shù)字信號到模擬信號的轉換后是以電流形式輸出,必須外接運算放大器把電流轉換成電壓信號。DAC0832 與單片機根據(jù)接口方式不同有三種工作方式:直通方式、單緩沖方式和雙緩沖方式。實際應用中根據(jù)實際情況選擇合適的工作方式。 在介紹并行D/A轉換芯片的應用之后,以PCF8591為例介紹了串行D/A轉換芯片的特點、工作原理以及在實驗板上的應用方法。,思考與訓練,(一)知識思考: 在單片機應用系統(tǒng)中為什么要進行A/D和D/A轉換,它們的作用是什么? DAC0832與8051單片機接口時有哪些控制信號?作用分別是什么? 使用DAC0832時,單緩沖方式如何工作?雙緩沖方式如何工作?它們各占用8051外部RAM的哪幾個單元?軟件編程有什么區(qū)別? 怎樣用DAC0832得到電壓輸出信號?有哪幾種方法? 多片D/A轉換器為什么必須采用雙緩沖接口方式? PCF8591的主要特點是什么?簡述其工作原理。 PCF8591輸入和輸出數(shù)字信號的格式各是怎樣的? I2C總線的特點和通信格式是怎樣的?,(二)項目訓練: 1. 試用DAC0832芯片設計單緩沖方式的D/A轉換器接口電路,并編寫2個程序,分別使DAC0832輸出負向鋸齒波和15個正向階梯波。 2. 根據(jù)圖9.17的電路接法,判斷DAC0832是工作在直通方式、單緩沖方式還是雙緩沖方式?欲用DAC0832產生如圖9.18所示波形,則如何編程?(設滿量程電壓5V,周期為2s)。 3. 參照任務2,將圖9.18的硬件電路作修改,設計成一個完整的信號發(fā)生器,通過按鍵控制輸出鋸齒波、三角波、方波或正弦波,并寫出完整的程序。,- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- 信號發(fā)生器 設計
裝配圖網所有資源均是用戶自行上傳分享,僅供網友學習交流,未經上傳用戶書面授權,請勿作他用。
鏈接地址:http://m.jqnhouse.com/p-2479104.html