1、超聲波模塊簡介
如上圖接線,VCC供3.3v~5V電源,GND為地線,TRIG觸發控制信號輸入,ECHO回響信號輸出等四個接口端。
- 品牌:HC-SR04
- 可提供2cm~400cm的非接觸式的距離感測功能
- 精度高達3mm.
- 模塊包括聲波發射器、接收器與控制電路。
- 工作電壓:3.3V-5V.
2、基本工作原理
(1)采用IO口TRIG觸發測距,給最少10us 的高電平信號。
(2)模塊自動發送8個40khz的方波,自動檢測是否有信號返回;
(3)有信號返回,通過IO口 ECHO輸出一個高電平,高電平持續的時間就是超聲波從發射到返回的時間。測試距離=(高電平時間*聲速(340M/S))/2;
3、電氣參數
4、超聲波時序圖
以上時序圖表明你只需要TRIG腳提供一個10uS以上脈沖觸發信號,該模塊內部將發出8個40kHz周期電平並檢測回波。--旦檢測到有回波信號則輸出回響信號。回響信號的脈沖寬度與所測的距離成正比。由此通過發射信號到收到的回響信號時間間隔可以計算得到距離。公式: uS/58=厘米或者 uS/148=英寸;或是:距離=高電平時間*聲速(340M/S) /2;建議測量周期為60ms以上,以防止發射信號對回響信號的影響。
注:
- 此模塊不宜帶電連接,若要帶電連接,則先讓模塊的GND端先連接,否則會影響模塊的正常工作。
- 測距時,被測物體的面積不少於0.5平方米且平面盡量要求平整,否則影響測量的結果。
此實驗將超聲波模塊接到STM32F407ZT06的camera腳上進行實驗。
如上圖,超聲波模塊的TRIG腳接到DCMI_D1(即接到STM32的PC7腳,),ECHO接到DCMI_D2(PC8)
- 由時序圖上可以看出TRIG作為輸出腳,先輸出低電平,再輸出一個至少10us高電平的觸發信號給模塊。
- 模塊內部會發8個40KHZ周期電平並檢測回波。(發到模塊內部,不是發到ECHO腳,所以代碼中不用處理這個電平)。
- 一旦檢測到回波,模塊則會通過ECHO腳(對於MCU是輸入)輸出回響信號(即高電平),通過MCU收到的高電平信號的時間就可以算出距離。距離=高電平時間*聲速(340m/s)/2,(因為超聲波發出去再反射回來,所以測出來的距離要除以2)。
5、代碼
//Sr.04文件 { GPIO_InitTypeDef GPIO_InitStruct; //1.初始化時鍾 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); //2.初始化硬件 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;//PC8 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;//輸出模式 GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽輸出 GPIO_InitStruct.GPIO_Speed = GPIO_Fast_Speed;//速度 快速 25MHz GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOC,&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;//PC1 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;//輸出模式 GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽輸出 GPIO_InitStruct.GPIO_Speed = GPIO_Fast_Speed;//速度 快速 25MHz GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOC,&GPIO_InitStruct); } uint32_t Get_Sr04_Distance(void) { uint32_t t=0; //空閑狀態 PCout(7)=0; delay_us(5); //1.TRIG觸發信號 ----是一個至少10us的高電平 PCout(7)=1; delay_us(12); PCout(7)=0; //2.模塊自動發送8個40KHz的方波,我們不用管 //3.計算高電平持續時間 while(!PCin(8));//把低電平跑完 while(PCin(8))//只需要算出這個循環持續的時間就是高電平持續時間 { //340m/s-->340000mm/1000000us=0.34mm/us //3mm/0.34 = 8.82....us 約等於 9us 也就是說一個3mm就需要9us delay_us(9); t++;//一個t就對應一個3mm } t=t/2;//超聲波一個來回,所以除以2 return (3*t);//返回的是mm級別 }