|
這是我大三時(shí)的電子課程設(shè)計(jì),做的聲音定位系統(tǒng),課設(shè)具體要求如下:
0.png (122.57 KB, 下載次數(shù): 99)
下載附件
2018-6-26 05:41 上傳
附件里包含了,整個(gè)系統(tǒng)的源碼,設(shè)計(jì)報(bào)告(含原理圖)
2.png (53.78 KB, 下載次數(shù): 100)
下載附件
2018-6-25 16:44 上傳
3.png (13.05 KB, 下載次數(shù): 81)
下載附件
2018-6-25 16:44 上傳
本次設(shè)計(jì)采用 STC89C52RC 單片機(jī)進(jìn)行運(yùn)算處理和驅(qū)動(dòng) LCD12864 液晶顯示
屏顯示定位結(jié)果,即利用單片機(jī)內(nèi)部定時(shí)器 0 計(jì)時(shí),由外部中斷 0、外部中斷 1和定時(shí)器 1觸發(fā),檢測(cè)接收信號(hào)的下降沿,通過(guò)這種方式計(jì)算聲音傳播后,不同模塊接收到信號(hào)的時(shí)間差,通過(guò)時(shí)間差計(jì)算出聲源信號(hào)到接收模塊距離,然后由單片機(jī)編程計(jì)算出聲源的位置坐標(biāo),最終顯示在液晶屏上。 STC89C52RC 單片機(jī)小系統(tǒng)電路和 LCD12864驅(qū)動(dòng)電路如下圖所示:
五、算法與程序設(shè)計(jì)
5.1數(shù)據(jù)處理原理:
本算法基于時(shí)間差算出未知點(diǎn)的坐標(biāo)點(diǎn)。從理論上分析,只需三個(gè)已知點(diǎn)就可以對(duì)聲音源進(jìn)行定位,我們首先先將問(wèn)題簡(jiǎn)化為二維平面內(nèi)對(duì)聲音源進(jìn)行定位。 如下圖所示,在一個(gè)平面內(nèi)分布有三個(gè)傳感器A、 B和C坐標(biāo)分別為(0,350)、(0,0)、(500,0)。當(dāng)平面內(nèi)某處 S(x,y)發(fā)出聲音時(shí),3 個(gè)傳感器將先后接收到信號(hào),設(shè)信號(hào)到達(dá)A,B的時(shí)間差為 t1,到達(dá)B,C的時(shí)間差為 t2,則有:
0.png (41.33 KB, 下載次數(shù): 88)
下載附件
2018-6-26 05:35 上傳
0.png (37.99 KB, 下載次數(shù): 83)
下載附件
2018-6-26 05:36 上傳
0.png (33.12 KB, 下載次數(shù): 77)
下載附件
2018-6-26 05:36 上傳
六、測(cè)試方案
6.1 主要的測(cè)試儀器、儀表
本次主要使用的測(cè)試儀器與儀表有,函數(shù)信號(hào)發(fā)生器、示波器與數(shù)字萬(wàn)用表。
6.2 測(cè)試方法
在硬件測(cè)試中,按鍵發(fā)聲模塊通過(guò)示波器測(cè)試電路輸出波形,調(diào)節(jié)電位器改變電阻值來(lái)調(diào)節(jié)觸發(fā)時(shí)間,保證發(fā)出的聲響持續(xù)時(shí)間為 1s;另外使用數(shù)字萬(wàn)用表測(cè)量按鍵發(fā)聲模塊的功耗。聲音接收模塊通過(guò)數(shù)字萬(wàn)用表,測(cè)量當(dāng)發(fā)聲模塊距接收模塊不同距離時(shí),比較器輸出電壓,直至調(diào)節(jié)電位器,改變比較器靈敏度使輸出電壓在要求距離內(nèi)能受到信號(hào),并以下降沿觸發(fā)單片機(jī)。聲響模塊和接收模塊都可以使用函數(shù)發(fā)生器和示波器來(lái)檢測(cè)電路的連接是否正常。
在軟件測(cè)試中,我們組軟件調(diào)試的中心思想是分模塊調(diào)試。先將程序分為三個(gè)接受模塊,算法模塊,顯示模塊,我們?cè)诜謮K調(diào)試時(shí),將各個(gè)模塊的輸出都顯示出來(lái)以便于觀察各模塊是否正確。運(yùn)用這種方法,可以將軟件上的錯(cuò)誤精確定位到某一個(gè)環(huán)節(jié),大大提高了調(diào)試的效率。以下是具體方法:
1、將程序中的標(biāo)志位signalA,signalB,signalC 通過(guò)LCD屏幕顯示出來(lái),以方便
觀察是否所有傳感器都收到了信號(hào)。
2、將各信號(hào)間的時(shí)間差通過(guò) LCD 屏幕顯示出來(lái),以方便觀察各傳感器的響應(yīng)速度以及接受信號(hào)的先后順序是否與實(shí)際一致。
3、在接入傳感器前,先用另一片單片機(jī)模仿傳感器發(fā)出的信號(hào),并通過(guò)程序設(shè)置時(shí)間差等參數(shù),用于檢查算法是否正確。
七、系統(tǒng)調(diào)試
7.1 按鍵發(fā)聲模塊
測(cè)試輸出電流(通過(guò)測(cè)量蜂鳴器串聯(lián)的 1Ω的電阻得到電流值),從圖中可知
為0.042A:
0.png (306 KB, 下載次數(shù): 91)
下載附件
2018-6-26 05:37 上傳
7.2 聲音接收模塊
當(dāng)聲響模塊離接收模塊距離較近時(shí),接收模塊輸出電壓達(dá)到 3.6V 左右。
0.png (271.34 KB, 下載次數(shù): 102)
下載附件
2018-6-26 05:37 上傳
當(dāng)聲響模塊離接收模塊較遠(yuǎn)時(shí)(但坐標(biāo)仍屬于坐標(biāo)紙的范圍),接收模塊輸出電壓將會(huì)變小。這個(gè)時(shí)候就需要調(diào)節(jié)電位器,改變電阻值以減小比較器 LM358 輸入端參考電壓的值。
0.png (278.76 KB, 下載次數(shù): 94)
下載附件
2018-6-26 05:37 上傳
7.3 LCD 液晶顯示模塊
進(jìn)行測(cè)試時(shí),LCD12864 液晶顯示模塊除了顯示坐標(biāo) X 與 Y的值外,還會(huì)顯示A、B、C 三個(gè)聲音接收模塊的中斷觸發(fā)標(biāo)志值(如下圖顯示屏中第一行所顯示的內(nèi)容,其中顯示值為 0 表示未觸發(fā),為 1 則表示已觸發(fā)),以及 A、B 和 C 三個(gè)聲音接收模塊依次收到信號(hào)時(shí)的計(jì)時(shí)時(shí)刻(其中從右到左依次為0us,65us和68us,此時(shí)模塊 C 最先收到聲音信號(hào)) ,這樣方便系統(tǒng)調(diào)試。 下圖坐標(biāo) X 與Y值在誤差范圍內(nèi),滿足測(cè)量要求。
0.png (285.78 KB, 下載次數(shù): 90)
下載附件
2018-6-26 05:38 上傳
0.png (84.16 KB, 下載次數(shù): 87)
下載附件
2018-6-26 05:38 上傳
從表 8.2 可以看出,當(dāng)電位器阻值較小時(shí)即比較器輸入端參考電壓接近 0 時(shí)更易收到信號(hào),但實(shí)際上這樣做也更容易受到干擾。接收模塊 C 相較于A、B 模塊了,由于焊接工藝的問(wèn)題,靈敏度較低。合理調(diào)節(jié)電位器阻值之后,三個(gè)模塊最終都能受到信號(hào),滿足設(shè)計(jì)要求。
8.3 聲源實(shí)測(cè)坐標(biāo)記錄表
對(duì)處于不同坐標(biāo)的聲源進(jìn)行了實(shí)際測(cè)量,最終得到了以下的一些實(shí)測(cè)數(shù)據(jù)如下
0.png (14.08 KB, 下載次數(shù): 87)
下載附件
2018-6-26 05:39 上傳
從表中可以看出,除個(gè)別點(diǎn)外,坐標(biāo)紙的四個(gè)方向邊緣區(qū)域以及中間區(qū)域共取了5個(gè)點(diǎn),其實(shí)測(cè)坐標(biāo)基本滿足設(shè)計(jì)要求。而個(gè)別點(diǎn)的誤差可能是由于接收模塊放置的位置不準(zhǔn)確或聲源放置地不準(zhǔn)確而產(chǎn)生。
九、總結(jié)
本次設(shè)計(jì)以 STC89C52 為核心部件,利用了聲音檢測(cè)與辨識(shí)技術(shù),利用嚴(yán)密的數(shù)學(xué)方法實(shí)現(xiàn)和確定了聲源的準(zhǔn)確定位。在系統(tǒng)設(shè)計(jì)過(guò)程中,力求硬件電路簡(jiǎn)單,降低硬件成本,節(jié)約功耗。
在這次課程設(shè)計(jì)中,我們遇到了許多問(wèn)題,這些問(wèn)題我們之前從未遇到過(guò),
但最終我們都找到了解決這些問(wèn)題的辦法,這對(duì)我們來(lái)說(shuō)是一次很好的鍛煉。在程序設(shè)計(jì)與軟件調(diào)試的過(guò)程之中,由于我們同時(shí)使用了 STC89C52 單片機(jī)中的四個(gè)中斷進(jìn)行控制處理,對(duì)于單片機(jī)各個(gè)中斷的優(yōu)先級(jí)與觸發(fā)的考慮更為復(fù)雜,但只要結(jié)合函數(shù)信號(hào)發(fā)生器模擬聲音信號(hào)觸發(fā)單片機(jī)得到調(diào)試結(jié)果,并且根據(jù)這些結(jié)果不斷改正程序,就能得到最優(yōu)的程序設(shè)計(jì)。另外在程序設(shè)計(jì)過(guò)程,由于子程序中數(shù)據(jù)處理十分重要,我們查閱了許多的資料,對(duì)于 C51中的數(shù)據(jù)類型以及常用的庫(kù)函數(shù)也更加的熟悉。 在硬件調(diào)試過(guò)程中,出現(xiàn)了聲音接收模塊電路不穩(wěn)定,易受到干擾,以及放大電路難以調(diào)試的問(wèn)題。對(duì)于接下來(lái)課程設(shè)計(jì)之后,我們也會(huì)考慮重新設(shè)計(jì)相關(guān)電路,例如采用雙比較器電路進(jìn)行比較放大,來(lái)提高電路的性能。
主程序源碼
- #include<reg52.h>
- #include<stdio.h>
- #include "delay.h"
- #include "lcd.h"
- #include<math.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define BOOL bit
- #define BYTE unsigned char
- #define WORD unsigned int
- uchar signalA,signalB,signalC;
- uchar wolsignalA,wolsignalB,wolsignalC;
- uchar wolCount,obv;
- unsigned int posX,posY; //坐標(biāo)取值
- code unsigned char byValidShow[] = {" V值: "};
- code unsigned char DispX[] = {" X軸: "};
- code unsigned char DispY[] = {" Y軸: "};
- void Init_Show() //LCD初始化顯示子程序
- {
- Delay400Ms();
- LCDInit();
- LCDClear();
- Delay5Ms();
- LCDClear();
- //DisplayListChar(0,1,byValidShow);
- DisplayListChar(0,2,DispX);
- DisplayListChar(0,3,DispY);
- Delay5Ms();
- }
- void Init_isr() //中斷初始化設(shè)置子程序
- {
- EA = 0;
- TMOD = 0x62;
- /*外部中斷0*/
- IT0 = 1; EX0 = 1;
- /*外部中斷1*/
- IT1 = 1; EX1 = 1;
- /* 計(jì)數(shù)器 0*/
- TH1 = 0xFF; TL1 = 0xFF; TR1 = 1; ET1 = 1;
- /* 定時(shí)器 1*/
- TH0 = 246; TL0 = 246; TR0 = 0; ET0 = 0;
- /***********/
- IE0=0;IE1=0;TF1=0;TF0=0;
- EA = 1;
- }
- void signalchuli(float m,float n) //坐標(biāo)定位計(jì)算程序
- {
- BOOL r1=0;
- BOOL r2=0; //方程是否成立變量
- BOOL suc=0; //解題是否成功變量
- float x,y;
- for(x=10;x<=500;x+=10)
- {
- for(y=10;y<=350;y+=10)
- {
- if(fabs(sqrt(x*x+(350-y)*(350-y))- sqrt(x*x+y*y)-m)<=20.0)
- r1=1;
- //else r1=0;
- if(fabs(sqrt(x*x+y*y)-sqrt(y*y+(500-x)*(500-x)) -n)<=20.0)
- r2=1;
- //else r2=0;
- if(r1&&r2)
- {
- suc=1;
- break;
- }
- else
- {
- r1=0;
- r2=0;
- }
- }
- if(suc)
- break;
- }
-
- posX=x;
- posY=y;
-
- }
- void main()
- {
- float cha1,cha2;
- uchar cha1_temp,cha2_temp;
- EA=0;
- Init_Show();
- Init_isr();
- while(1)
- {
- if( signalA && signalB && signalC)
- {
- EA = 0;
- TR0=0;
- obv++;
- cha1_temp = wolsignalA - wolsignalB;
- cha2_temp = wolsignalB - wolsignalC;
- if(wolsignalA < wolsignalB)
- {
- cha1_temp = 65536 - cha1_temp;
- cha1 = -(3.4*cha1_temp);
- }
- else
- {
- cha1 = 3.4*cha1_temp;
- }
- if(wolsignalB < wolsignalC)
- {
- cha2_temp = 65536 - cha2_temp;
- cha2 = -(3.4*cha2_temp);
- }
- else
- {
- cha2 = 3.4*cha2_temp;
- }
- signalchuli(cha1,cha2);
- DisplayADData(4,2,posX);
- DisplayADData(4,3,posY); //顯示坐標(biāo)
- signalA = 0;
- signalB = 0;
- signalC = 0;
- wolCount = 0;
- Init_isr();
- }
- DisplayADData(0,4,wolsignalA);
- DisplayADData(3,4,wolsignalB);
- DisplayADData(6,4,wolsignalC); //顯示時(shí)間插值,方便調(diào)試
- DisplayADData(0,1,signalA);
- DisplayADData(3,1,signalB);
- DisplayADData(6,1,signalC); //顯示觸發(fā)標(biāo)志位,方便調(diào)試
- }
- }
- void JsA_isr() interrupt 0 //外部中斷0,下降沿觸發(fā)
- {
- EX0 = 0;
- if(wolCount == 0)
- {
- wolsignalA = 0;
- TR0 = 1;
- ET0 = 1;
- }
- else
- {
- wolsignalA = wolCount;
- }
- signalA = 1;
- }
- void JsB_isr() interrupt 2 //外部中斷1,下降沿觸發(fā)
- {
-
- if(wolCount == 0)
- {
- wolsignalB = 0;
- TR0 = 1;
- ET0 = 1;
- }
- else
- {
- wolsignalB = wolCount;
- }
- signalB =1;
- EX1 = 0;
- }
- void Timer1_isr() interrupt 3 //計(jì)數(shù)器1,工作方式2
- {
- if(wolCount == 0)
- {
- wolsignalC = 0;
- TR0 = 1;
- ET0 = 1;
- }
- else
- {
- wolsignalC = wolCount;
- }
- signalC = 1;
- ET1 = 0;
- }
- void Timer0_isr() interrupt 1 //定時(shí)器0,工作方式2 , 10us
- {
- wolCount++;
- }
復(fù)制代碼 仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (16.36 KB, 下載次數(shù): 101)
下載附件
2018-6-26 05:42 上傳
全部資料51hei下載地址:
聲音定位系統(tǒng).rar
(1.6 MB, 下載次數(shù): 353)
2018-6-25 16:44 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|