asia域名發(fā)布網(wǎng)站谷歌瀏覽器安卓下載
一、簡介
HC-SR04 工作參數(shù):
? 探測距離:2~600cm
? 探測精度:0.1cm±1%
? 感應(yīng)角度:<15°
? 輸出方式:GPIO
? 工作電壓:DC 3~5.5V
? 工作電流:5.3mA
? 工作溫度:-40~85℃
?
- ?怎么讓它發(fā)送波 Trig?
????????給Trig端口至少10us的高電平
- 怎么知道它開始發(fā)了波 Echo引腳?
????????由低電平跳轉(zhuǎn)到高電平,表示開始發(fā)送波
- 怎么知道接收了返回波 Echo?
????????由高電平跳轉(zhuǎn)回低電平,表示波回來了
- 怎么算時間 ?
????????Echo引腳維持高電平的時間,波發(fā)出去的那一下,開始啟動定時器 波回來的那一下,我們開始停止定時器,計算出中間經(jīng)過多少時間
- 怎么算距離?
????????距離 = 速度(343m/s) * 時間 / 2
?二、實驗前期準(zhǔn)備
????????因為想把測出來的距離打印在串口上,所以復(fù)制項目文件19-串口打印功能,重命名25-超聲波傳感器,新建文件夾hc-sr04
打開工程文件
加載文件
引腳接線
三、代碼:
main.c
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "hcsr04.h"int main(void)
{HAL_Init(); /* 初始化HAL庫 */stm32_clock_init(RCC_PLL_MUL9); /* 設(shè)置時鐘, 72Mhz */led_init();//初始化led燈hcsr04_init();uart1_init(115200);while(1){ printf("距離是:%.2f\r\n",hcsr04_get_lenght());delay_ms(1000);}
}
hcsr04.c
#include "hcsr04.h"
#include "delay.h"TIM_HandleTypeDef tim2_handle = {0};//定義結(jié)構(gòu)體//定時器初始化函數(shù)
void timer_init()//把ARR和PSC當(dāng)作參數(shù)傳進來
{tim2_handle.Instance = TIM2; //選擇使用的定時器tim2_handle.Init.Prescaler = 72-1; //PSC:使其讀一個數(shù)用1ustim2_handle.Init.Period = 65536-1; //ARRtim2_handle.Init.CounterMode = TIM_COUNTERMODE_UP;//配置成向上的,默認向上的tim2_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; //自動重裝載,默認自動重裝載HAL_TIM_Base_Init(&tim2_handle);
// HAL_TIM_Base_Start_IT(&tim2_handle);//設(shè)置使能更新中斷,和啟動計數(shù)器
}//msp函數(shù)
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2){__HAL_RCC_TIM2_CLK_ENABLE();
// HAL_NVIC_SetPriority(TIM2_IRQn,2,2);//設(shè)置優(yōu)先級
// HAL_NVIC_EnableIRQ(TIM2_IRQn);//設(shè)置使能中斷}
}
//定時器啟動的函數(shù)
void tim2_start(void)
{HAL_TIM_Base_Start(&tim2_handle);
}
//定時器關(guān)閉的函數(shù)
void tim2_stop(void)
{HAL_TIM_Base_Stop(&tim2_handle);
}
//讀CNT計數(shù)器的值
uint16_t tim2_get_cnt(void)
{return __HAL_TIM_GetCounter(&tim2_handle);
}
//將CNT計數(shù)器的值傳遞進來
void tim2_set_cnt(uint16_t val)
{__HAL_TIM_SetCounter(&tim2_handle,val);
}
//初始化gpio口引腳
void hcsr04_gpio_init(void)
{ GPIO_InitTypeDef gpio_initstruct;//定義一個結(jié)構(gòu)體gpio_initstruct//打開trig和echo時鐘TRIG_GPIO_CLK_ENABLE();ECHO_GPIO_CLK_ENABLE();//調(diào)用TRIG的GPIO初始化函數(shù)gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;//推挽輸出gpio_initstruct.Pin = TRIG_PIN;//trig對應(yīng)的引腳gpio_initstruct.Pull = GPIO_NOPULL;//引腳不拉gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;//高速HAL_GPIO_Init(TRIG_PORT,&gpio_initstruct);//調(diào)用echo的GPIO初始化函數(shù)gpio_initstruct.Mode = GPIO_MODE_INPUT;//作為輸入引腳gpio_initstruct.Pin = ECHO_PIN;//echo對應(yīng)的引腳HAL_GPIO_Init(ECHO_PORT,&gpio_initstruct);
}
//初始化超聲波
void hcsr04_init(void)
{timer_init();//初始化定時器hcsr04_gpio_init();//初始化GPIO引腳}
//讀取超聲波測出來的距離
float hcsr04_get_lenght(void)
{uint16_t total_time = 0; //定義一個變量用于接收CNT的值float distance = 0;//1、Trig,給Trig端口至少10us的高電平TRIG_HIGH();delay_us(15);TRIG_LOW();//2、Echo引腳,由低電平跳轉(zhuǎn)到高電平,表示開始發(fā)送波//波發(fā)出去的那一下,開始啟動定時器while(ECHO_STATUS() == GPIO_PIN_RESET);//用echo引腳是否從低電平變成高電平來決定波是否發(fā)出去了tim2_start(); //啟動定時器2tim2_set_cnt(0);//將定時器初始值置0//3、Echo,由高電平跳轉(zhuǎn)回低電平,表示波回來了//波回來的那一下,我們開始停止定時器while(ECHO_STATUS() == GPIO_PIN_SET);//用echo引腳是否從高電平變成低電平來決定波是否接到tim2_stop();//關(guān)掉定時器//4、Echo引腳維持高電平的時間=計算出中間經(jīng)過多少時間total_time = tim2_get_cnt();//用total_time接收CNT定時器里面的值//距離 = 速度(343m/s) * 時間 / 2//343m/s = 34300cm/s,因為距離是一個來回,所以要/2(這里速度除2下面路程就不用除2了)// = 34300/2 = 17150cm/s = 0.017150cm/usdistance = total_time * 0.01715;return distance;
}
hcsr04.h
#ifndef __HCSR04_H__
#define __HCSR04_H__#include "sys.h"#define TRIG_PORT GPIOB //trig對應(yīng)gpio的哪一組
#define TRIG_PIN GPIO_PIN_6 //trig對應(yīng)gpio的哪個引腳
#define TRIG_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() //gpio口時鐘打開
#define TRIG_HIGH() HAL_GPIO_WritePin(TRIG_PORT,TRIG_PIN,GPIO_PIN_SET)//trig對應(yīng)的引腳拉高
#define TRIG_LOW() HAL_GPIO_WritePin(TRIG_PORT,TRIG_PIN,GPIO_PIN_RESET)//trig對應(yīng)的引腳拉低#define ECHO_PORT GPIOB //echo對應(yīng)gpio的哪一組
#define ECHO_PIN GPIO_PIN_7 //echo對應(yīng)gpio的哪個引腳
#define ECHO_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() //gpio口時鐘打開
#define ECHO_STATUS() HAL_GPIO_ReadPin(ECHO_PORT,ECHO_PIN) //讀取echo對應(yīng)的引腳電平void hcsr04_init(void);
float hcsr04_get_lenght(void);#endif
打開串口助手,每一秒超聲波都在測距