天天看點

[自娛自樂] 3、超音波測距子產品DIY筆記(三)

前言

上一節我們已經研究了超音波接收子產品并自己設計了一個超音波接收子產品,在此基礎上又嘗試用單片機加反相器構成生成40KHz的超音波發射電路,可是發現采用這種設計的發射電路存在嚴重的發射功率太低問題,對齊的情況下最多隻有10CM。本節主要介紹并制造一種大功率超音波發射裝置~

目錄

一、浪裡淘金,尋找最簡超音波功率提高方案

  1.1、優化波形發生程式

  1.2、嘗試各種其他超聲子產品方案

  1.3、用三極管放大信号

  1.4、MAX232放大信号方案 

二、步步為營,打造高效準确超聲測距算法

  2.1、接收MCU區分接收頭信号并統計時差算法初試

  2.2、折衷——單MCU上內建收發子產品實作測距

  2.3、命中注定——分手的時候到了

三、階段小結

四、相關連結

1.1、優化波形發生程式

>_<" 上節講到的利用反相器加單片機生成40KHz的超音波發射裝置存在嚴重的功率問題,然後在上次之後的研究中我發現通過調節定時器的定時,功率會有稍微的提高,但還是比較弱~(因為條件限制,根本買不起示波器這種神器,所有隻有酷比的調試代碼啦!)下面的代碼即改進後的51單片機代碼,這次定時器采用的是定時器2,16位重裝模式~

<a></a>

[自娛自樂] 3、超音波測距子產品DIY筆記(三)

1.2、嘗試各種其他超聲子產品方案

&gt;_&lt;" 發現上面的方法不能大幅度改變發射功率,于是還是繼續網上找資料,于是看上一節最後留下的第二個連結中的文章,找個簡單的實驗了下。結果在protues中仿真發現怎麼也不是想要的效果,另一方面考慮到要提供9V的電壓,于是就放棄了在面包闆上連接配接實物實驗。然後又在protues裡實驗了用555做超音波發送子產品的方案,結果不知道為什麼,protues裡似乎不能給555加9V電壓(一直報錯)。最後大緻浏覽下這個文檔中的方案,發現基本上都需要9V電壓,而且模電較多(我這裡電子元件不是太多,最坑的是沒有示波器!)

[自娛自樂] 3、超音波測距子產品DIY筆記(三)

1.3、用三極管放大信号

&gt;_&lt;" 一個偶然的發現某同學的畢業設計中的方案:他介紹在脈沖發生電路和脈沖發射電路中加一個三極管來放大信号,覺得這個簡單易行,我在面包闆上簡單的用一個2N3904三極管,照着模拟電路書本上簡單放大電路連接配接好,将上述産生40KHz的單片機脈沖發生電路的引腳和三極管的基極相連,集電極加載一個12V的電壓,測試結果發現可以很有效地提高發射功率,但是隻成功了一小會,然後再怎麼實驗都無法再收到超音波了(我懷疑是把三極管弄壞了),是以該方案又失敗了~

[自娛自樂] 3、超音波測距子產品DIY筆記(三)

1.4、MAX232放大信号方案

&gt;_&lt;" 通過上面的各種嘗試,我發現上面發射部分設計方案有一個共同的特點:都需要較高的驅動電壓。但是我購買的HC-SR04超過聲波測距子產品卻隻需要用5V就能發射功率很強的成聲波,這點引起了我的思考。于是直接找來HC-SR04的設計圖:

[自娛自樂] 3、超音波測距子產品DIY筆記(三)

通過研究發現:其發射部分采用STC系列單片機作為40KHz的脈沖發生器,然後把13、14兩路(他一定是讓這兩路提供反向電平作為輸出)連結到 MAX232的兩個輸入端!一看到MAX232瞬間就明白了:MAX232是經常用在序列槽通信中用于将序列槽信号放大來傳播更遠距離的晶片,他這裡采用 MAX232這個特點用于将信号放大,然後在輸出端直接驅動發射頭!非常機智!于是我利用手頭上的序列槽轉TTL子產品做一個簡單的實驗,結果令人振奮,果然能夠對信号進行很強的放大:

[自娛自樂] 3、超音波測距子產品DIY筆記(三)

于是一鼓作氣,重新設計一個信号更強勁的方案,并把電路焊接成發射子產品:這次采用MAX232的2個輸入和輸出通道,将兩個方波同時放大,将産生更加強勁的效果!

[自娛自樂] 3、超音波測距子產品DIY筆記(三)
[自娛自樂] 3、超音波測距子產品DIY筆記(三)

&gt;_&lt;" 到上面為止我們已經完美地把超音波發射與接收子產品都做好了,那麼現在就要研究下如何利用他們進行測距了~(PS:嘻嘻這裡俺可不是簡單的用一個發送子產品一個接收子產品進行直線空間上的測距,這種東西早都比較成熟了,網上一搜一把,而且非常便宜!我要做的是利用2個接收子產品及一個接收子產品在二維平面上對物體進行定位!)

[自娛自樂] 3、超音波測距子產品DIY筆記(三)

2.1、接收MCU區分接收頭信号并統計時差算法初試

&gt;_&lt;" 還記得我們上節用到的最最簡單的信号檢測算法嗎?該程式是放到接收部分MCU中運作的,因為超音波接收部分一旦接收到超音波就會産生一個1-0-1信号,是以我們上一節隻是簡單的将接收子產品輸對外連結接到單片機的一個引腳,在單片機程式中對該引腳電平進行輪詢輸出。但是這裡我們用了2個接收頭,如果處理不當,會很難分辨是哪一個接收頭産生的信号,如果采用順序輸出又不滿足兩個信号到達的先後順序不同且會變的事實,綜上,這裡先初步用一個ok作為标記:為0表示沒收到一個信号;為1表示隻收到1好接收子產品的信号;為2表示隻收到2号接收子產品的信号;為3表示兩個都收到了,具體如下:[圖中連續ab之間的+号的個數表示兩個信号之間的時間差]

 code

[自娛自樂] 3、超音波測距子產品DIY筆記(三)

2.2、折衷——單MCU上內建收發子產品實作測距

&gt;_&lt;" 為了展現咱們是步步為營的,是以俺剛開始并沒有直接去挑戰發送和接收子產品分開或者直接兩個接收子產品去測距,而是先嘗試一下在一個MCU上連接配接一個發射子產品和一個接收子產品,自制一個簡單的超音波測距儀(市場上賣的那種直線型的)。這個程式不難了解,但是麻雀雖小,五髒俱全,這裡用到了51單片機的幾乎所有中斷:1)負責接收子產品監聽的外部中斷2)負責計時的T0計數器3)負責序列槽的T1定時器4)負責産生方波的T2定時器~然後測距的思路很簡單:首先發送子產品在短時間内發送100周期的40KHz超音波,然後計時器開始計數,等到接收子產品輸出引腳産生1-0-1下降沿觸發外部中斷時停止計數,然後根據轉換公式将超音波傳播計數轉換為距離并把資料通過序列槽發送給上位機。

 View Code

[自娛自樂] 3、超音波測距子產品DIY筆記(三)
[自娛自樂] 3、超音波測距子產品DIY筆記(三)

上面的代碼将資料發送給上位機的過程放大中斷中去處理不是太好,于是就将序列槽資料發送改到main函數中了,優化後的代碼如下:

但是僅僅有一個接收子產品肯定不是我們的最終目标,于是再向前邁一步,這次加入一個接收子產品,于是把單片機剩下的那個外部中斷也給用上了,程式大緻和上面的很像~但是這裡出現個問題:因為定時器就一個,如果用這一個定時器去計算兩個接收子產品接收時間的話,看似可以(你可能會想到用一個秒表給多人計時),但是超音波不是人!一方面,當其中一個接收子產品觸發中斷時并進行相應的處理會影響計時器;另一方面,如果強制想實作這個計時過程要添加很多标志和判斷處理,這樣很不明智!下面是初步嘗試時的程式,他隻能測出首先接受到超音波信号的接收頭的資料,另一個會被自動放棄掉~

本來我以為那種掐表模式的多接收子產品計時模型肯定能實作,于是浪費了很長時間,把代碼改的很亂,最後還是不能完美的完成目标~就在我吃飯的路上突然受分時作業系統的影響産生了一個新的靈感:由于測量頻率很快,我可以把一個測量周期分為兩部分,一部分用于隻用接收子產品1進行測距,另一部分隻用接收子產品2進行測量,這樣一個測量周期就能完美的測量出兩個接收子產品的測距資料!代碼如下:

[自娛自樂] 3、超音波測距子產品DIY筆記(三)
[自娛自樂] 3、超音波測距子產品DIY筆記(三)

2.3、命中注定——分手的時候到了

&gt;_&lt;" 上面我們已經實作了在一個MCU上實作了一個發射子產品兩個接收子產品分别測距,但是将發射和接收放在同一個子產品上是很不理想的一種折衷,那麼現在是時候來一個高超的手術了!

&gt;_&lt;" 通過分析上面內建在一個MCU上的代碼可以知道:發送部分僅占用40KHz發送函數用于适時的發送一段連續的超音波;接收部分負責計時、等待接收子產品的1-0-1中斷、計算距離、将資料發送給上位機等功能。其中有一個核心而隐蔽的問題,即:時間同步問題!當在一個MCU上時,我們隻要簡單的啟動計時器同時啟動超音波發送,而在兩個MCU上實作這個并不是件容易的事!最終我想到了用一根線來同步時間,即:當接收子產品準備好時,把該線上的電平置1-0産生下降沿(P20引腳),然後把該線的另一端連接配接将發送子產品的外部中斷0的引腳(P32引腳),采用中斷方式監聽起跑指令。當發送子產品收到起跑指令時便發送一串超音波,同時接收子產品開始計數,剩下的部分就和在同一個MCU上的原理很相似了~具體請參考代碼(注意接收部分在發送起跑指令後的延時技巧!這是一種可以被中斷剪短的延時,用來等待超音波接收子產品接收有效的資料)

 發送代碼

 接收代碼

[自娛自樂] 3、超音波測距子產品DIY筆記(三)

&gt;_&lt;" 經過這三個階段,我們已經從分析需求-&gt;調研市場-&gt;研究資料-&gt;購買原料-&gt;動手實踐-&gt;模數結合-&gt;軟硬兼修-&gt;調試修改-&gt;優化....最終完成了我們的超音波測距的硬體子產品(鼓掌)!然後下一階段将進入PC上基于C#的測距用戶端軟體的開發,更多有趣小制作敬請關注~

相關連結

本文轉自beautifulzzzz部落格園部落格,原文連結:http://www.cnblogs.com/zjutlitao/p/4069272.html,如需轉載請自行聯系原作者

繼續閱讀