一、簡(jiǎn)介
1.C-SR04超聲波模塊是一種常用的測(cè)距模塊,其通過(guò)發(fā)射超聲波并接收其反射信號(hào)來(lái)實(shí)現(xiàn)測(cè)距功能。因其成本低、精度高、使用簡(jiǎn)便等特點(diǎn),被廣泛應(yīng)用于以下場(chǎng)景:
(1)避障機(jī)器人:HC-SR04超聲波模塊可以用于避障機(jī)器人的距離測(cè)量,通過(guò)檢測(cè)障礙物與機(jī)器人的距離,實(shí)現(xiàn)避障控制。
(2)智能家居:HC-SR04超聲波模塊可用于智能家居中的人體檢測(cè)和距離測(cè)量。例如,在門(mén)口安裝超聲波模塊,可以檢測(cè)人的接近并觸發(fā)開(kāi)門(mén)動(dòng)作,或者用于室內(nèi)的距離測(cè)量和觸發(fā)自動(dòng)照明等。
2.本實(shí)驗(yàn)用到了CW32F030C8T6小藍(lán)板、0.96寸OLED顯示屏、HC-SR04超聲波模塊及Keil5開(kāi)發(fā)環(huán)境。
二、超聲波模塊測(cè)距的使用方法
使用流程 連接電源 將VCC引腳連接到+5V,GND引腳連接到GND。
連接觸發(fā)引腳
將Trig引腳連接到單片機(jī)的數(shù)字輸出引腳。
連接回波引腳
將Echo引腳連接到單片機(jī)的數(shù)字輸入引腳。
發(fā)送信號(hào)
通過(guò)向Trig引腳發(fā)送一個(gè)至少10微秒的高電平觸發(fā)信號(hào)來(lái)啟動(dòng)測(cè)距過(guò)程
接收信號(hào)
模塊發(fā)送觸發(fā)信號(hào)后,自動(dòng)發(fā)射超聲波,并等待接收反射信號(hào)。當(dāng)接收到反射信號(hào)時(shí),Echo引腳會(huì)輸出一個(gè)高電平信號(hào),持續(xù)時(shí)間與超聲波的往返時(shí)間成正比。
計(jì)算距離
通過(guò)測(cè)量Echo引腳輸出高電平信號(hào)的持續(xù)時(shí)間,可以計(jì)算得到距離,一般使用以下公式計(jì)算:
距離= 高電平持續(xù)時(shí)間 × 聲波在空氣中傳播的速度 / 2。
重復(fù)測(cè)量
根據(jù)需要可定時(shí)測(cè)量距離,以實(shí)現(xiàn)連續(xù)的距離監(jiān)測(cè)。
需要注意的是,HC-SR04超聲波模塊的測(cè)距精度受到多種因素的影響,如溫度、超聲波傳播介質(zhì)等。在使用過(guò)程中,需要結(jié)合具體的應(yīng)用場(chǎng)景和需求進(jìn)行參數(shù)調(diào)整和校準(zhǔn),以獲得準(zhǔn)確的距離測(cè)量結(jié)果。
三、核心代碼
HC_SR04.c: #include "HC_SR04.h" extern unsigned int time; void HC_GPIO_Init(void) { __RCC_GPIOB_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.IT=GPIO_IT_NONE; GPIO_InitStruct.Mode=GPIO_MODE_INPUT_PULLDOWN;//下拉輸入 GPIO_InitStruct.Pins=GPIO_PIN_8; //Echo GPIO_Init(CW_GPIOB,&GPIO_InitStruct); GPIO_InitStruct.Speed=GPIO_SPEED_HIGH; GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP; //推挽輸出 GPIO_InitStruct.Pins=GPIO_PIN_9; //Trig GPIO_Init(CW_GPIOB,&GPIO_InitStruct); PB09_SETLOW(); //Trig拉低,為輸出脈沖觸發(fā)信號(hào)做準(zhǔn)備 } unsigned int Measure_Distance(void) //測(cè)距 { unsigned int distance=0; SetTrig(); //10us的脈沖觸發(fā)信號(hào) Delay_us(10); ResetTrig(); while(ReadEcho()==0); //等待Echo輸出高電平 time=0; //開(kāi)始記錄回波信號(hào)脈寬 while(ReadEcho()==1); //等待Echo輸出低電平 distance=time*1.7;//根據(jù)聲速和時(shí)間計(jì)算距離,即distance=time*340/2/100 /* 關(guān)于分辨力(mm): 定時(shí)器每次對(duì)time加1是10us,10us=0.01ms,340m/s=340mm/ms 計(jì)算距離時(shí),最小分辨力為:0.01(ms) * 340(mm/ms) / 2 = 1.7(mm) 小于模塊標(biāo)準(zhǔn)精度3mm,故測(cè)距結(jié)果十分精準(zhǔn) */ return distance; //返回距離,單位mm } main.c: #include "HC_SR04.h" extern unsigned int time; void HC_GPIO_Init(void) { __RCC_GPIOB_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.IT=GPIO_IT_NONE; GPIO_InitStruct.Mode=GPIO_MODE_INPUT_PULLDOWN;//下拉輸入 GPIO_InitStruct.Pins=GPIO_PIN_8; //Echo GPIO_Init(CW_GPIOB,&GPIO_InitStruct); GPIO_InitStruct.Speed=GPIO_SPEED_HIGH; GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP; //推挽輸出 GPIO_InitStruct.Pins=GPIO_PIN_9; //Trig GPIO_Init(CW_GPIOB,&GPIO_InitStruct); PB09_SETLOW(); //Trig拉低,為輸出脈沖觸發(fā)信號(hào)做準(zhǔn)備 } unsigned int Measure_Distance(void) //測(cè)距 { unsigned int distance=0; SetTrig(); //10us的脈沖觸發(fā)信號(hào) Delay_us(10); ResetTrig(); while(ReadEcho()==0); //等待Echo輸出高電平 time=0; //開(kāi)始記錄回波信號(hào)脈寬 while(ReadEcho()==1); //等待Echo輸出低電平 distance=time*1.7;//根據(jù)聲速和時(shí)間計(jì)算距離,即distance=time*340/2/100 /* 關(guān)于分辨力(mm): 定時(shí)器每次對(duì)time加1是10us,10us=0.01ms,340m/s=340mm/ms 計(jì)算距離時(shí),最小分辨力為:0.01(ms) * 340(mm/ms) / 2 = 1.7(mm) 小于模塊標(biāo)準(zhǔn)精度3mm,故測(cè)距結(jié)果十分精準(zhǔn) */ return distance; //返回距離,單位mm }
四、實(shí)驗(yàn)最終現(xiàn)象
![]() |
![]() |
-
單片機(jī)
+關(guān)注
關(guān)注
6076文章
45494瀏覽量
670260 -
模塊
+關(guān)注
關(guān)注
7文章
2837瀏覽量
53282 -
超聲波
+關(guān)注
關(guān)注
63文章
3301瀏覽量
145260 -
CW32
+關(guān)注
關(guān)注
1文章
299瀏覽量
1843
原文標(biāo)題:【CW32】基于CW32的超聲波模塊的應(yīng)用
文章出處:【微信號(hào):CW32生態(tài)社區(qū),微信公眾號(hào):CW32生態(tài)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
超聲波模塊測(cè)距的使用方法


評(píng)論