這個51單片機函數信號發生器論文,大家可以看看
摘要 本文以STC89C51單片機為核心設計了一個低頻函數信號發生器。信號發生器采用數字波形合成技術,通過硬件電路和軟件程序相結合,可輸出自定義波形,如正弦波、方波、三角波、三角波、梯形波及其他任意波形,波形的頻率和幅度在一定范圍內可任意改變。波形和頻率的改變通過軟件控制,幅度的改變通過硬件實現。介紹了波形的生成原理、硬件電路和軟件部分的設計原理。本系統可以產生最高頻率798.6HZ的波形。該信號發生器具有體積小、價格低、性能穩定、功能齊全的優點。
1設計選題及任務 設計題目:基于單片機的信號發生器的設計與實現 任務與要求: 設計一個由單片機控制的信號發生器。運用單片機系統控制產生多種波形,這些波形包括方波、三角波、鋸齒波、正弦波等。信號發生器所產生的波形的頻率、幅度均可調節。并可通過軟件任意改變信號的波形。 基本要求: 1. 產生三種以上波形。如正弦波、三角波、矩形波等。 2.最大頻率不低于 500Hz。并且頻率可按一定規律調節,如周期按1T,2T,3T,4T或1T,2T,4T,8T變化。 3.幅度可調,峰峰值在0——5V之間變化。 擴展要求:產生更多的頻率和波形。
2系統概述 2.1方案論證和比較 2.1.1總體方案: 方案一:采用模擬電路搭建函數信號發生器,它可以同時產生方波、三角波、正弦波。但是這種模塊產生的不能產生任意的波形(例如梯形波),并且頻率調節很不方便。 方案二:采用鎖相式頻率合成器,利用鎖相環,將壓控振蕩器(VCO)的輸出頻率鎖定在所需頻率上,該方案性能良好,但難以達到輸出頻率覆蓋系數的要求,且電路復雜。 方案三:使用集成信號發生器發生芯片,例如AD9854,它可以生成最高幾十MHZ的波形。但是該方案也不能產生任意波形(例如梯形波),并且價格昂貴。 方案四:采用AT89C51單片機和DAC0832數模轉換器生成波形,加上一個低通濾波器,生成的波形比較純凈。它的特點是可產生任意波形,頻率容易調節,頻率能達到設計的500HZ以上。性能高,在低頻范圍內穩定性好、操作方便、體積小、耗電少。 經比較,方案四既可滿足課程設計的基本要求又能充分發揮其優勢,電路簡單,易控制,性價比高,所以采用該方案.
2.1.2改變幅度方案: 方案一:可以將送給DA的數字量乘以一個系數,這樣就可以改變DA輸出電流的幅度,從而改變輸出電壓;但是這樣做有很嚴重的問題,單片機在做乘法運算時需要很長的時間,這樣的話輸出波形的頻率就會很低,達不到至少500HZ的要求; 并且該方案的輸出電壓做不到連續可調,當DA的輸入數字量比較小時,輸出的波形失真就會比較嚴重。 方案二:將輸出電壓通過一個運算放大器的放大。這樣還有個優點是幅度連續可調。 經比較,方案二既可滿足課程設計的基本要求,并且電路也挺簡單。
2.2工作原理 數字信號可以通過數/模轉換器轉換成模擬信號,因此可通過產生數字信號再轉換成模擬信號的方法來獲得所需要的波形。89C51單片機本身就是一個完整的微型計算機,具有組成微型計算機的各部分部件:中央處理器CPU、隨機存取存儲器RAM、只讀存儲器ROM、I/O接口電路、定時器/計數器以及串行通訊接口等,只要將89C51再配置鍵盤及、數模轉換及波形輸出、放大電路等部分,即可構成所需的波形發生器,其信號發生器構成系統框圖如下圖所示。
系統框圖
89C51是整個波形發生器的核心部分,通過程序的編寫和執行,產生各種各樣的信號,并從鍵盤接收數據,進行各種功能的轉換和信號幅度的調節。當數字信號電路到達轉換電路,將其轉換成模擬信號也就是所需要的輸出波形。 波形ROM表是將信號一個周期等間距地分離成64個點,儲存在單片機得RON內。具體ROM表是通過MATLAB生成的,例如正弦表,MATLAB生成的程序如下: x=0:2*pi/64:2*pi; y=round(sin(x)*127)+128
3單元電路設計與分析 3.1.1主控電路 設計中主要采用STC89C51型單片機,它具有如下優點:(1)擁有完善的外部擴展總線,通過這些總線可方便地擴展外圍單元、外圍接口等。(2)該單片機內部擁有4K字節的FLASH ROM程序存儲器空間和256字節的RAM數據存儲空間,完全可以滿足程序的要求。由于該芯片可電擦寫,故可重復使用。如果更改程序內容,可將芯片拿下重新燒寫。(3)該單片機與工業標準的MCS-51型機的指令集和輸出引腳兼容。 中斷系統是使處理器具有對外界異步事件的處理能力而設置的。當中央處理器CPU正在 處理某件事的時候外界發生了緊急事件,要求CPU暫停當前的工作,轉而去處理這個緊 急事件。 在波形發生器中,用兩個開光直接與外部中斷0和外部中斷1的管腳相連,其中S1開光用來改變波形,S2開光用來改變頻率。在程序主函數中,我們寫了個死循環一直輸出一個默認的波形,當S1或S2按下又抬起時,程序會暫時跳出死循環,進入中斷處理程序,從而對波形和頻率進行改變。 時鐘電路。由于頻率較大時,三角波、正弦波、方波等波中每一點延時時間為幾微秒,故延時時間還要加上指令時間即可得到指定頻率的波形,該電路用11.0592MHz晶振。 主控電路圖
3.1.2 數/模轉換電路 由于單片機產生的是數字信號,要想得到所需要的波形,就要把數字信號轉換成模擬信號,所以該文選用價格低廉、接口簡單、轉換控制容易并具有8位分辨率的數模轉換器DAC0832。DAC0832主要由8位輸入寄存器、8位DAC寄存器、8位D/A轉換器以及輸入控制電路四部分組成。但實際上,DAC0832輸出的電量也不是真正能連續可調,而是以其絕對分辨率為單位增減,是準模擬量的輸出。DAC0832是電流型輸出,在應用時外接運放使之成為電壓型輸出。 根據對DAC0832的數據鎖存器和DAC寄存器的不同的控制方式,DAC0832有三種工作方式:直通方式、單緩沖方式和雙緩沖方式。本設計選用直通方式。 DAC0832的數據口和單片機的P0口相連。 CSDA:片選信號輸入線(選通數據鎖存器),低電平有效; WR:數據鎖存器寫選通輸入線,負脈沖(脈寬應大于500ns)有效。由ILE、CS、WR1的邏輯組合產生LE1,當LE1為高電平時,數據鎖存器狀態隨輸入數據線變換,LE1的負跳變時將輸入數據鎖存; 數模轉換電路
3.1.3運算放大電路和低通濾波電路 LM324的5管腳與DAC0832的(IOUT2)12管腳相連,LM324的6管腳與DAC0832的(IOUT1)11管腳相連,LM324的7管腳與DAC0832的REF(9)管腳相連. 第一級運算放大器的作用是將DAC0832輸出的電流信號轉化為電壓信號V1,第二級運算放大器的作用是將V1通過反向放大電路-(R2/R1)倍。 題目要求輸出的電壓在0-5V可調,而V1的電壓大約是5V,所以R1選擇5K的電阻,R2選擇10K的電位器,這樣最大的輸出電壓為5*(10/2)=10,最小電壓為0,可以實現題目要求的0-5V。 在第二個運算放大器的輸出端連了一個低通濾波器。如果不加低通濾波器,也能夠生成波形,但是產生的信號中毛刺很多,加一個低通濾波器不僅起到的濾波的作用,還起到了平滑的作用。低通濾波器的截止頻率F=1/(2*pi*R3*C6),這里我們選擇R3 為100歐姆電阻,C6為104電容,截止頻率F=16KHZ。實驗表明,此時的輸出波形效果不錯。
3.1.4串口通信電路 通用異步收發器(UART)是一種串行接口,一般微處理器中都包含這種外設接口。異步串行接口提供了一種簡單的途徑,使兩個器件無需共享同一個時鐘信號就能進行通信。如果再加入一個合適的電平轉換器MAX232,串口就能能用在RS232和RS485等網絡中實現通信,或者與計算機的COM端口連接。串口只需兩根信號線(RX和TX)即可實現,而且只要兩端器件都采用同樣的位格式和波特率,那么它們無需其它任何對方的信息就可以成功傳輸數據。 串口通信電路圖
3.2系統軟件設計 軟件設計上,根據功能分了幾個模塊編程。模塊主要有:主程序模塊、外部中斷0模塊,外部中斷1模塊。 主程序: 主程序先是進行一些初始化的工作,然后根據波形標志a,b,c,d,e的值進入相應的while 循環。這樣寫的好處是輸出的波形頻率可以790多HZ。在while循環中,單片機根據地址標志位不停低查表,然后把查得的值賦給DAC0832的數據口,然后地址標志位加一,并判斷地址標志位是否等于64,如果是就置0再往下執行,如果不是直接往下執行。然后根據頻率標志位進行相應的延時。 主程序流程圖
中斷服務程序: 本程序中兩個外部中斷分別起到了控制波形和頻率的作用。在程序中還加入了消抖部分。
4安裝調試及測量數據分析 4.1調試過程; 1. 不通電,用萬用表根據電路圖仔細檢查各線路連接是否正常。 2. 首先是調試單片機部分,DA和運算放大器芯片不接。用STC_ISP_V483軟件通過串口下程序。看是否可以正常下程序。 3.當可以正常下程序時,給51單片機下一個讓所有I/0口一會兒輸入0,延時,再輸出1,以此類推。用萬用表測量各I/O口得電壓是不是一會兒高,一會兒低。 4.安上DA和運算放大器芯片,給單片機下一個輸出正弦波的測試程序,通過示波器看輸出是否正常。 5. 給單片機下一個完整的程序,分別按下S1,看波形是否改變。按下S2,看頻率是否改變。
4.2頻率的測量數據: 單位:HZ
4.3出現的問題與解決的方法: 1. 調試單片機的串口時,發現不能正常的下程序。我想可能是單片機壞了借了一塊學習板測試了一下單片機芯片,發現可以正常下載。這說明很可能是MAX232的電路出了問題。我仔細查看了電路圖,又上網查了下其他的MAX232的電路圖,發現我的電路圖和別人的不一樣。我是按照郭天翔的那本《新概念51單片機C語言教程 入門、提高、開發、拓展全》第130頁的串口電路畫的圖,電路圖中MAX232的TIOU1接串口的第3腳。而其他書上有些電路圖卻是MAX232的TIOU1接到了串口的第2腳。于是我將MAX232的TIOU1接串口的第2腳,再下程序,終于可以正常下載了。 2.剛開始寫的測試程序輸出的波形失真很大。我想可能是波形的ROM表里的數據值過小,導致DA輸出的誤差很大。因而臥將波形的ROM表里的數據值調大,在測試時發現波形變得好多了。 3. 調試波形的時候我發現矩形波的失真比較大。我想到可能是低通濾波器的截止頻率太低了,因而我將RC低通濾波器的電阻由1K換成了100歐姆,效果好了很多。
4.4系統仿真波形: 矩形波 鋸齒波 正弦波
4.5效果分析: 由4.2的頻率理論值與實際值,可知頻率在T,2T,3T,4T,5T,6T,7T,8T上頻率誤差很小。 最終的波形輸出效果也很不錯。
4.6測量儀器 示波器 直流穩壓電源 萬用表
5結束語 基于單片機的信號發生器設計,這個信號發生器的設計中涉及到一個典型的控制過程。通過單片機控制一個模數轉換器DAC0832產生所需要的電流,然后使用運算放大器LM324可以將其電流輸出線性地轉換成電壓輸出,再將電壓經過運算放大器的放大,可以得到足夠幅度的信號。通過程序的控制,可以產生一系列有規律的波形。這樣一個信號發生裝置在控制領域有相當廣泛的應用范圍。 最終做出來的信號發生器滿足了題目中的所有要求: 1.產生五種波形。正弦波、三角波、矩形波、梯形波,鋸齒波。 2.最大頻率為798.6HZ。并且頻率可按按1T,2T,3T,4T,5T,6T,7T,8T變化。 3.幅度可調,峰峰值在0——5V之間變化。 當然還是存在不足的地方,比如不能實現頻率的按一個小的步進調整。并且當頻率太小時矩形波會有些失真。 信號發生器可以生成更多的波形,只需要再加些波形表即可。 在這里得感謝學校為我們提供個這樣一個實踐的機會,當然還得感謝實驗室指導老師們的細心指導。
參考文獻: [1] 郭天翔.新概念51單片機C語言教程 入門、提高、開發、拓展全.北京.電子工業出版社 2009.1 [2] 童詩白.模擬電路技術基礎[M].北京:高等教育出版社,2000.171~202.
附錄 1:總電路圖
附錄2:源程序
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit csda=P2^2;
- sbit wr=P2^1;
- sbit s1=P3^2;
- sbit s2=P3^3;
- uchar k=0,p=0,delay=0;
- uchar bxxz=0;pinglv=0;
- uchar a=1,b=0,c=0,d=0,e=0;
-
- uchar code sin[64]={
- 135,145,158,167,176,188,199,209,218,226,234,240,245,249,252,254,254,253,251,247,243,237,230,222,213,204,193,182,170,158,
- 146,133,121,108,96,84,72,61,50,41,32,24,17,11,7,3,1,0,0,2,5,9,14,20,28,36,45,55,66,78,90,102,114,128
- };
- uchar code juxing[64]={
- 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- };
- uchar code juchi[64]={
- 0,4,8,12,16,20,24,28,32,36,40,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,130,134,138,142,
- 146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,215,219,223,227,231,235,239,243,247,251,255
- };
- uchar code tixing[64]={
- 0,13,26,39,52,65,78,91,104,117,130,143,156,169,182,195,208,221,234,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,
- 247,247,247,247,247,247,247,242,229,216,203,190,177,164,151,138,125,112,99,86,73,60,47,34,21,8
- };
- uchar code sanjiao[64]={
- 0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,
- 248,240,232,224,216,208,200,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0
- };
- void delay1()
- {
- int a,b;
- for(a=1;a>0;a--)
- for(b=122;b>0;b--);
- }
- void int0() interrupt 0
- {
- EX0=0;
- delay1();
- if(s1==0){
- bxxz++;
- if(bxxz==5)
- bxxz=0;
- switch(bxxz)
- {
- case 0 :
- {a=1,b=0,c=0,d=0,e=0;}
- break;
- case 1 :
- {a=0,b=1,c=0,d=0,e=0;}
- break;
- case 2 :
- {a=1,b=0,c=1,d=0,e=0;}
- break;
- case 3 :
- {a=0,b=0,c=0,d=1,e=0;}
- break;
- case 4 :
- {a=0,b=0,c=0,d=0,e=1;}
- break;
- }
- delay1();
- while(!s1);
- }
- while(!s1);
- EX0=1;
- }
- void int1() interrupt 2
- {
- EX1=0;
- delay1();
- if(s2==0){
- p++;
- if(p==8)
- p=0;
- switch(p)
- {
- case 1 :
- pinglv=3;
- break;
- case 2 :
- pinglv=6;
- break;
- case 3 :
- pinglv=9;
- break;
- case 4 :
- pinglv=12;
- break;
- case 5 :
- pinglv=15;
- break;
- case 6 :
- pinglv=18;
- break;
- case 7 :
- pinglv=21;
- break;
- default :
- pinglv=0;
- break;
- }
- delay1();
- while(!s2);
- }
- while(!s2);
- EX1=1;
- }
- void main()
- {
- csda=0;
- wr=0;
- EA=1;
- IT0=1;
- EX0=1;
- IT1=1;
- EX1=1;
- while(1)
- {
- while(a)
- {
- delay=pinglv;
- P0=sin[k];
- k++;
- if(k==64)
- k=0;
- while(delay)
- delay--;
- }
- while(b)
- {
- delay=pinglv;
- P0=juxing[k];
- k++;
- if(k==64)
- k=0;
- while(delay)
- delay--;
- }
- while(c)
- {
- delay=pinglv;
- P0=juchi[k];
- k++;
- if(k==64)
- k=0;
- while(delay)
- delay--;
- }
- while(d)
- {
- delay=pinglv;
- P0=tixing[k];
- k++;
- if(k==64)
- k=0;
- while(delay)
- delay--;
- }
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
完整論文下載:
基于51單片機的信號發生器-完整電路、程序.doc
(384 KB, 下載次數: 534)
2017-5-3 17:14 上傳
點擊文件名下載附件
可以看看
|