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