目錄
超聲波模塊介紹
超聲波模塊在電子DIY作品中實(shí)現(xiàn)小車避障測距等方面均應(yīng)用廣泛,在大學(xué)生智能車DIY愛好者中尤為顯眼。
①實(shí)物圖
②產(chǎn)品說明
HC-SR04超聲波測距模塊可提供2cm-400cm的非接觸式距離感測功能,測距精度可達(dá)3mm,包括發(fā)射器、接收器與控制電路,它是一種壓電式傳感器,利用電致伸縮現(xiàn)象而制成。
③電氣參數(shù)
電氣參數(shù) | HCSR04超聲波模塊 |
---|---|
工作電壓 | DC5V |
工作電流 | 15mA |
工作頻率 | 40KHz |
最遠(yuǎn)射程 | 4M |
最近射程 | 2cm |
測量角度 | 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ān)運(yùn)算就可以得到對(duì)應(yīng)的距離,具體公式如下:
測試距離 = (高電平時(shí)間聲速(340M/S)/2)= ((float)t/58.0)
這個(gè)公式的具體換算過程,大家可以用以前學(xué)過的知識(shí)進(jìn)行還算下,最后得到的距離單位是厘米。
下面放一張超聲波的引腳功能示意圖,能更好的理解HCSR04的具體使用和接線在代碼中:
驅(qū)動(dòng)代碼
之前寫過用51單片機(jī)驅(qū)動(dòng)HCSR04在LCD1602上的驅(qū)動(dòng)代碼,這篇文章我使用STM32驅(qū)動(dòng)HCSR04在0.96OLED(使用人數(shù)較多并且開源初始化代碼方便移植)上面使用的驅(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); //打開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è)置用來作為TIMx時(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) //檢查TIM更新中斷是否發(fā)生
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除TIM更新中斷標(biāo)志位
msHcCount++;
}
}
①超聲波驅(qū)動(dòng)應(yīng)用代碼
下面展示寫根據(jù)超聲波時(shí)序圖可以寫出下面的驅(qū)動(dòng)代碼:
//開始計(jì)數(shù)
static void StartTimer() //打開定時(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ù)平均值,為了使測距所得到的值更加精確可采取多次測距的平均值來使用應(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(); //打開計(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;
}
具體測試現(xiàn)象
本次使用OLED屏幕顯示超聲波所測距離并顯示如下圖所示:文章來源:http://www.zghlxwxcb.cn/news/detail-786434.html
總結(jié)
文章中使用的顯示方式為0.96寸OLED模塊顯示,驅(qū)動(dòng)MCU使用的為STM32F103C8T6,在使用HCSR04的過程中也可以自己根據(jù)HCSR04的驅(qū)動(dòng)代碼所得到的距離值去做其他的接口應(yīng)用,例如做小車,或者其他測距案例均可移植使用,需要完整工程的可下方留言郵箱獲取。文章來源地址http://www.zghlxwxcb.cn/news/detail-786434.html
到了這里,關(guān)于STM32F103驅(qū)動(dòng)HCSR04超聲波測距顯示的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!