目錄
超聲波模塊介紹
超聲波模塊在電子DIY作品中實(shí)現(xiàn)小車(chē)避障測(cè)距等方面均應(yīng)用廣泛,在大學(xué)生智能車(chē)DIY愛(ài)好者中尤為顯眼。
①實(shí)物圖

②產(chǎn)品說(shuō)明
HC-SR04超聲波測(cè)距模塊可提供2cm-400cm的非接觸式距離感測(cè)功能,測(cè)距精度可達(dá)3mm,包括發(fā)射器、接收器與控制電路,它是一種壓電式傳感器,利用電致伸縮現(xiàn)象而制成。
③電氣參數(shù)
| 電氣參數(shù) | HCSR04超聲波模塊 |
|---|---|
| 工作電壓 | DC5V |
| 工作電流 | 15mA |
| 工作頻率 | 40KHz |
| 最遠(yuǎn)射程 | 4M |
| 最近射程 | 2cm |
| 測(cè)量角度 | 15° |
| 輸入觸發(fā)信號(hào) | 10us的TTL脈沖 |
| 輸出回響信號(hào) | 輸出TTL電平信號(hào),與射程成比例 |
④超聲波工作原理
首先我們可以看下面的一張超聲波的時(shí)序圖:
圖中我們可以大致看出,要使用HCSR04這個(gè)超聲波模組,我們必須先給超聲波發(fā)送一個(gè)觸發(fā)信號(hào),引導(dǎo)超聲波內(nèi)部循環(huán)發(fā)出8個(gè)40Khz的脈沖然后輸出回響信號(hào)引腳上拉為高電平,然后我們利用超聲波回響信號(hào)引腳的高電平所得計(jì)數(shù)時(shí)間經(jīng)過(guò)相關(guān)運(yùn)算就可以得到對(duì)應(yīng)的距離,具體公式如下:
測(cè)試距離 = (高電平時(shí)間聲速(340M/S)/2)= ((float)t/58.0)
這個(gè)公式的具體換算過(guò)程,大家可以用以前學(xué)過(guò)的知識(shí)進(jìn)行還算下,最后得到的距離單位是厘米。
下面放一張超聲波的引腳功能示意圖,能更好的理解HCSR04的具體使用和接線在代碼中:
驅(qū)動(dòng)代碼
之前寫(xiě)過(guò)用51單片機(jī)驅(qū)動(dòng)HCSR04在LCD1602上的驅(qū)動(dòng)代碼,這篇文章我使用STM32驅(qū)動(dòng)HCSR04在0.96OLED(使用人數(shù)較多并且開(kāi)源初始化代碼方便移植)上面使用的驅(qū)動(dòng)代碼。
①STM32配置初始化代碼
時(shí)鐘和GPIO以及中斷相關(guān)配置:
void HCSR04_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //定義定時(shí)器結(jié)構(gòu)體
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//IO 初始化
GPIO_InitStructure.GPIO_Pin = HCSR04_TRIG; //發(fā)送高點(diǎn)平引腳
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);
GPIO_InitStructure.GPIO_Pin = HCSR04_ECHO; //返回電平引腳
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);
//定時(shí)器初始化使用基本定時(shí)器3
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //打開(kāi)TIM3定時(shí)器時(shí)鐘
TIM_DeInit(TIM3);
TIM_TimeBaseStructure.TIM_Period = 65535; //(1000-1); //設(shè)置在下一個(gè)更新時(shí)間裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值 計(jì)數(shù)到1000為1ms
TIM_TimeBaseStructure.TIM_Prescaler =(72-1); //設(shè)置用來(lái)作為T(mén)IMx時(shí)鐘頻率除數(shù)的預(yù)分頻 1M的計(jì)時(shí)頻率 1US計(jì)數(shù)
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //不分頻
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計(jì)數(shù)模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時(shí)間基數(shù)單位
TIM_ClearFlag(TIM3, TIM_FLAG_Update); //清除更新中斷避免立即產(chǎn)生更新中斷
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //啟用計(jì)時(shí)器更新中斷
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //設(shè)置中斷服務(wù)
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //主優(yōu)先級(jí)
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //次優(yōu)先級(jí)
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //啟用中斷
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM3,DISABLE);
}
//定時(shí)器中斷服務(wù)程序
void TIM3_IRQHandler(void) //TIM3中斷
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //檢查T(mén)IM更新中斷是否發(fā)生
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除TIM更新中斷標(biāo)志位
msHcCount++;
}
}
①超聲波驅(qū)動(dòng)應(yīng)用代碼
下面展示寫(xiě)根據(jù)超聲波時(shí)序圖可以寫(xiě)出下面的驅(qū)動(dòng)代碼:
//開(kāi)始計(jì)數(shù)
static void StartTimer() //打開(kāi)定時(shí)器
{
TIM_SetCounter(TIM3,0); //清除計(jì)數(shù)
msHcCount = 0;
TIM_Cmd(TIM3, ENABLE); //啟用TIM3外設(shè)
}
static void StopTimer() //關(guān)閉定時(shí)器外設(shè)
{
TIM_Cmd(TIM3, DISABLE); //關(guān)閉TIM定時(shí)器外設(shè)
}
//獲取計(jì)時(shí)器時(shí)間
float GetEchoTimer(void)
{
u32 t = 0;
t = msHcCount*1000; //得到ms
t += TIM_GetCounter(TIM3); //得到us
TIM3- >CNT = 0; //將TIM3定時(shí)計(jì)數(shù)器的寄存器清零
delay_ms(50);
return t;
}
②超聲波距離計(jì)算代碼
//取五次數(shù)據(jù)平均值,為了使測(cè)距所得到的值更加精確可采取多次測(cè)距的平均值來(lái)使用應(yīng)用中
float HCSR04GetLength(void)
{
u32 t = 0;
int i = 0;
float lengthTemp = 0;
float sum = 0;
float distance;
for(i=0;i< 5;i++){
TRIG_SEND = 1; //發(fā)送高電平輸出
delay_us(20);
TRIG_SEND = 0;
while(ECHO_RECEIVE == 0); //等待接收高電平輸出
StartTimer(); //打開(kāi)計(jì)時(shí)器
while(ECHO_RECEIVE == 1);
StopTimer(); //關(guān)閉計(jì)時(shí)器
t = GetEchoTimer(); //獲取時(shí)間,解析度為1US
lengthTemp = ((float)t/58.2); //cm
sum = lengthTemp + sum ;
}
distance = 100*sum/5.0;
return distance;
}
具體測(cè)試現(xiàn)象
本次使用OLED屏幕顯示超聲波所測(cè)距離并顯示如下圖所示:
總結(jié)
文章中使用的顯示方式為0.96寸OLED模塊顯示,驅(qū)動(dòng)MCU使用的為STM32F103C8T6,在使用HCSR04的過(guò)程中也可以自己根據(jù)HCSR04的驅(qū)動(dòng)代碼所得到的距離值去做其他的接口應(yīng)用,例如做小車(chē),或者其他測(cè)距案例均可移植使用,需要完整工程的可下方留言郵箱獲取。
-
模塊
+關(guān)注
關(guān)注
7文章
2849瀏覽量
53458 -
超聲波
+關(guān)注
關(guān)注
63文章
3327瀏覽量
146130 -
測(cè)距
+關(guān)注
關(guān)注
2文章
115瀏覽量
20863
發(fā)布評(píng)論請(qǐng)先 登錄
求msp430f149與hcsr04程序,
單片機(jī)hcsr04超聲波對(duì)射測(cè)距
基于STM32超聲波測(cè)距設(shè)計(jì)的合集
基于STM32的超聲波測(cè)距設(shè)計(jì)
STM32f103是如何驅(qū)動(dòng)超聲波測(cè)距模塊
淺析TM32F1系列超聲波測(cè)距程序
STM32F103ZET6超聲波測(cè)距hcsr04模塊
超聲波HCSR-04的驅(qū)動(dòng)及開(kāi)發(fā)講解
基于單片機(jī)的HCSR04超聲波測(cè)距傳感器設(shè)計(jì)有哪些注意事項(xiàng)
超聲波HCSR04模塊的工作原理是什么
用lcd1602顯示超聲波hcsr04測(cè)出的距離
使用STM32F103單片機(jī)實(shí)現(xiàn)超聲波測(cè)距OLED顯示的設(shè)計(jì)程序和電路圖
使用HCSR04超聲波傳感器DIY測(cè)距儀
STM32F103驅(qū)動(dòng)HCSR04超聲波測(cè)距顯示
評(píng)論