HC_SR04超声波模块的应用
生活随笔
收集整理的這篇文章主要介紹了
HC_SR04超声波模块的应用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 簡介
HC-SR04 超聲波測距模塊可提供 2cm-400cm 的非接觸式距離感測功能,測 距精度可達高到 3mm ;模塊包括超聲波發射器、接收器與控制電路。
| 工作電壓 | DC 5 V |
| 工作電流 | 15mA |
| 工作頻率 | 40kHz |
| 最遠射程 | 4m |
| 最近射程 | 2cm |
| 測量角度 | 15 度 |
| 輸入觸發信號 | 10uS 的 TTL 脈沖 |
| 輸出回響信號 | 輸出 TTL 電平信號,與射程成比例 |
| 規格尺寸 | 45X20X15mm |
2 時序圖
簡單來說:
- 提供一個 10uS 以上脈沖觸發信號,該模塊內部將發出 8 個 40kHz 周期電平并檢測回波。
- 一旦檢測到有回波信號則輸出回響信號。回響信號的脈沖寬度與所測的距離成正比。
- 由此通過發射信號到收到的回響信號時間間隔可以計算得到距離。
測算公式:距離=高電平時間*聲速(340M/S)/2。
聲速與溫度有關,如果環境溫度變化顯著,必須考慮溫度補償問題。空氣中聲速與溫度的關系可以表示為
幾點注意事項:
- 建議測量周期為 60ms 以上,以防止發射信號對回響信號的影響。
- 此模塊不宜帶電連接,若要帶電連接, 則先讓模塊的 GND 端先連接,否則會影響模塊的正常工作。
- 測距時,被測物體的面積不少于 0.5 平方米且平面盡量要求平整,否則影響測量的結果。
3 程序設計(stm32)
思路:測量的距離與高電平的時間有關,而且高電平時間不超過60ms,那我們可以利用定時器來獲取高電平的時間。將定時器設置為720分頻,自動重裝載值為 7000,則每70ms進入一次中斷(如果進入了中斷說明距離超出最大測量范圍), 記一次數是10us。
3.1 測量函數
u8 sr04_over_flag; //當高電平時間大于70ms,說明超出最大測量范圍/** 函數功能:發送觸發信號*/ void SendTrigSign(void) {Trig=1;delay_us(15);Trig=0; }/** 函數功能:計算距離* 返 回 值:Distance 距離 */ float distance_Count(void) { u8 time = 0;float Speed;float Distance;time = TIM_GetCounter(TIM4);TIM_SetCounter(TIM4,0);//計數器值清零Speed = 331.4 + 0.607 * Temp;//計算聲速,Temp是當前溫度值Distance = (time*Speed)/2; //距離測算return Distance; }/** 函數功能:控制定時器,測量高電平時間* 返 回 值: f 距離*/ float Ultrasound_Measure(void) {float f = 0.0 ;sr04_over_flag = 0 ; SendTrigSign() ;while(!Echo); //當回響信號為零時等待TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);//使能或者失能指定的TIM中斷TIM_Cmd(TIM4,ENABLE);//使能TIM4外設while(Echo);TIM_ITConfig(TIM4,TIM_IT_Update,DISABLE);//使能或者失能指定的TIM中斷TIM_Cmd(TIM4,DISABLE);//失能TIM4外設 if(sr04_over_flag==1){f = 400 ;//最大距離,高電平時間持續大于70ms了}else {f = distance_Count();}return f ; }3.2 初始化函數
/** 函數功能:初始化超聲波模塊的兩個管腳* Trig 觸發信號控制輸入-----PC9配置成推挽輸出* Echo 回響信號輸出---------PC8配置成上拉輸入*/ void Ultrasonic_IO_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能PC端口時鐘GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //Trig-->PC.9 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; ; //上拉輸入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHzGPIO_Init(GPIOC, &GPIO_InitStructure); //根據設定參數初始化GPIOC.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //Echo-->PC.8 端口配置, 推挽輸出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHzGPIO_Init(GPIOC, &GPIO_InitStructure); //推挽輸出 ,IO口速度為50MHzGPIO_ResetBits(GPIOC,GPIO_Pin_9); //PC.9 輸出低 }/** 函數功能:通用定時器4初始化* 形 參:arr:自動重裝值* psc:時鐘預分頻數*/ void TIM4_time_init(u16 arr,u16 psc ) {TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //時鐘使能TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置用來作為TIMx時鐘頻率除數的預分頻值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位 NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //TIM4中斷NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占優先級0級NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //從優先級3級NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能NVIC_Init(&NVIC_InitStructure); //根據NVIC_InitStruct中指定的參數初始化外設 }3.3 定時器中斷服務函數
void TIM4_IRQHandler(void) //TIM4中斷 {if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //檢查指定的TIM中斷發生與否:TIM 中斷源 {TIM_ClearITPendingBit(TIM4, TIM_IT_Update); //清除TIMx的中斷待處理位:TIM 中斷源 sr04_over_flag = 1; } }3.4 main.c
int main(void) { float dis;delay_init(); //延時函數初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級uart_init(9600);Ultrasonic_IO_Init();TIM4_time_init(6999,719);//定時器70ms中斷一次T = ((719+1)*(6999+1)) /72000 000 =70ms while(1){dis = Ultrasound_Measure();printf("距離為%f\r\n",dis);//單位cm}總結
以上是生活随笔為你收集整理的HC_SR04超声波模块的应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何使32位Win7支持超过4GB的内存
- 下一篇: 键盘钢琴发音原理