超聲波模塊介紹
SR04超聲波模塊是一款廣泛應用的測距傳感器,主要用于使用超聲波測量物體與傳感器之間的距離。它是一個成本低廉、精度較高且易于使用的傳感器,常用于機器人、智能家居、無人機、汽車防撞系統等項目。以下是SR04超聲波模塊的主要特點和應用:
測距范圍: SR04模塊的測距范圍通常在2厘米到400厘米之間,適合多種應用。
高精度: 它具備較好的測量精度,通常可達±3毫米,這使其適用于需要精確測量的場合。
工作原理: SR04模塊通過發射超聲波脈沖并測量聲波反射回來的時間來計算距離。傳感器的超聲波發射和接收分別由兩個探頭(發射器和接收器)完成。
簡單接口: 通常使用簡單的GND、VCC、Trig(觸發信號)和Echo(回聲信號)四個引腳,便于連接到微控制器(如Arduino)上。
低功耗: 在待機狀態下,SR04的功耗較低,適合電池供電的項目。
超聲波模塊工作原理

只需要在 Trig 管腳(觸發信號)輸入一個 10US 以上的高電平,系統便可發出 8 個 40KHZ 的超聲波脈沖,然后檢測回波信號。當檢測到回波信號后,通過 Echo 管腳輸出。根據 Echo 管腳輸出高電平的持續時間可以計算距離值。即距離值為:(高電平時間*340m/s)/2。
當測量距離超過 HC-SR04 的測量范圍時,仍會通過 Echo管腳輸出高電平的信號,高電平的寬度約為 66ms。如圖所示:

測量周期:當接收到 HC-SR04 通過 Echo 管腳輸出的高電平脈沖后,便可進行下一次測量,所以測量周期取決于測量距離,當距離被測物體很近時,Echo 返回的脈沖寬度較窄,測量周期 就很短;當距離被測物體比較遠時,Echo 返回的脈沖寬度較寬,測量周期也就相應地變長。最壞情況下,被測物體超出超聲波模塊的測量范圍,此時 返回的脈沖寬度最長,約為 66ms,所以最壞情況下的測量周期稍大于 66ms 即可(取 70ms 足夠)。
電路連接
該模塊在主控制板上與CW32L012/F030連接如下:

兩個引腳分別接到了PA8與PA15端口。
工程代碼
在文件HC_SR04.C中編寫如下代碼
#define Trig_Send(x) GPIO_WritePin(CW_GPIOA, GPIO_PIN_8, (GPIO_PinState)(x)) #define Echo_Input GPIO_ReadPin(CW_GPIOA, GPIO_PIN_15) uint16_t Get_Time; /************************** 定時器配置 中斷周期為1ms **************************/ void TIM_Init(void) { RCC_APBPeriphClk_Enable2(RCC_APB2_PERIPH_BTIM,ENABLE); BTIM_TimeBaseInitTypeDef BTIM_Initstructure; BTIM_Initstructure.BTIM_Mode=BTIM_Mode_TIMER; BTIM_Initstructure.BTIM_OPMode=BTIM_OPMode_Repetitive; BTIM_Initstructure.BTIM_Period=1000-1; BTIM_Initstructure.BTIM_Prescaler=BTIM_PRS_DIV64;//64分頻 BTIM_TimeBaseInit(CW_BTIM1,&BTIM_Initstructure); BTIM_ITConfig(CW_BTIM1,BTIM_IT_OV,ENABLE); // BTIM_Cmd(CW_BTIM1,ENABLE); NVIC_SetPriority(BTIM1_IRQn,8);//中斷優先級 NVIC_EnableIRQ(BTIM1_IRQn);//開啟中斷 } void HC_SR04_Init(void) { __RCC_GPIOA_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.IT=GPIO_IT_NONE; GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pins=GPIO_PIN_8; GPIO_InitStruct.Speed=GPIO_SPEED_HIGH; GPIO_Init(CW_GPIOA, &GPIO_InitStruct); GPIO_InitStruct.IT=GPIO_IT_NONE; GPIO_InitStruct.Mode=GPIO_MODE_INPUT_PULLDOWN; GPIO_InitStruct.Pins=GPIO_PIN_15; GPIO_InitStruct.Speed=GPIO_SPEED_HIGH; GPIO_Init(CW_GPIOA, &GPIO_InitStruct); Trig_Send(0); TIM_Init(); } void BTIM1_Start(void)//打開定時器 { BTIM_SetCounter(CW_BTIM1,0); Get_Time=0; BTIM_Cmd(CW_BTIM1,ENABLE); } void BTIM1_Stop(void)//關閉定時器 { BTIM_Cmd(CW_BTIM1,DISABLE); } uint32_t Get_Tim_Timer(void)//得到信號反射時間 { uint32_t time; time=Get_Time*1000; time+=BTIM_GetCounter(CW_BTIM1); BTIM_SetCounter(CW_BTIM1,0); return time; } float Get_Disance(void)//距離計算 { uint8_t i; uint16_t time=0; float Distance=0; float Temp=0; float num=0; for(i=0;i10;i++) { Trig_Send(1);//trig拉高信號,發出高電平 delay10us(2); Trig_Send(0);//trig拉低信號,發出低電平 while(Echo_Input==0); BTIM1_Start(); while(Echo_Input==1); BTIM1_Stop(); /*Echo發出信號 等待回響信號*/ /*輸入方波后,模塊會自動發射8個40KHz的聲波,與此同時回波引腳(echo)端的電平會由0變為1; (此時應該啟動定時器計時);當超聲波返回被模塊接收到時,回波引 腳端的電平會由1變為0; (此時應該停止定時器計數),定時器記下的這個時間即為 超聲波由發射到返回的總時長;*/ time=Get_Tim_Timer(); Temp=(float)time/58.2; // 獲取時間,分辨率為1us num+=Temp; Delay_ms(4); } Distance=num/10.0; return Distance; } void BTIM1_IRQHandler(void) { if(BTIM_GetITStatus(CW_BTIM1,BTIM_IT_OV)==1) { Get_Time++; } BTIM_ClearITPendingBit(CW_BTIM1,BTIM_IT_OV); }
在main.c中編寫如下代碼
int main(void)
{
OLED_Init();//初始化
HC_SR04_Init();
OLED_ShowString(1,1,"hello");//OLED顯示字符串
while(1)
{
OLED_ShowString(2,1,"Dis:");
OLED_ShowNum(2,5,Get_Disance(),3);//距離顯示
OLED_ShowString(2,9,"cm");;
}
}
工作現象
將代碼燒入主控制板之后,可以觀察到以下現象
OLED顯示屏第一行第一列顯示字符串hello
第二行顯示距離單位cm
-
超聲波
+關注
關注
63文章
3301瀏覽量
145261 -
智能小車
+關注
關注
87文章
560瀏覽量
83430 -
CW32
+關注
關注
1文章
299瀏覽量
1843
發布評論請先 登錄
CW32L012/F030靈眸X1智能小車——板載WS2812驅動示例
CW32L012小型機器人控制評估板活動 四足機器人+智能小車 開箱評測
超聲波模塊測距問題
HC-SR04超聲波模塊的工作原理是什么
超聲波模塊的原理
利用超聲波模塊設計智能避障的WiFi小車
怎么使用STM32F1驅動超聲波模塊
超聲波模塊的工作原理與時序圖學習
怎樣利用HY-SRF05超聲波模塊實現超聲波的測距避障呢
利用HY-SRF05 超聲波模塊實現超聲波的測距避障
CW32L012/F030靈眸X1智能小車——超聲波模塊配置
評論