一、超聲波簡介
超聲波原理:
利用聲音測距,聲音在空氣中的速度是340m/s(15℃)
當(dāng)聲音傳播時,若遇到障礙物時,就會被反彈回來,通過計時反彈回來的時間就可以計算出從發(fā)射端到障礙物的距離
引腳定義:
工作電壓:3V-5.5V寬電壓供電
測距盲區(qū):2cm最小盲區(qū)
接口定義如圖
序號 |
接口定義 |
說明 |
1 |
Vcc |
供電電源 |
2 |
Trig/Rx/SCL |
GPIO模式:???Trig ??觸發(fā)信號 UART模式: ??Rx?????接收信號 IIC 模式: ??SCL ???時鐘信號 |
3 |
Echo/Tx/SDA |
GPIO模式為???Echo ??反饋信號 UART模式: ??Tx?????發(fā)射信號 ICC 模式: ??SCL ???數(shù)據(jù)信號 |
4 |
Gnd |
地 |
GPIO模式測量原理:
?
外部MCU給模塊Trig腳一個大于10uS的高電平脈沖;模塊會給出一個與距離等比的高電平脈沖信號,可根據(jù)脈寬時間“T”算出:距離=T*C/2 ?(C為聲速)
即本文中使用的距離 = t / 58 cm
聲速溫度公式:c=(331.45+0.61t/℃)m?s-1 (其中330.45是在0℃)
?????0℃聲速: ??330.45M/S
?????20℃聲速: ?342.62M/S
?????40℃聲速: ?354.85M/S
0℃-40℃聲速誤差7%左右。實際應(yīng)用,如果需要精確距離值,必需要考慮溫度影響,做溫度補償。
二、代碼解析
HCSR04.c
初始化部分
void Sr04_Init()
{
/*GPIO初始化*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽輸出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//設(shè)置發(fā)生電平引腳trig
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//接受電平引腳echo
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_11);//默認(rèn)低電平
GPIO_ResetBits(GPIOB,GPIO_Pin_10);//默認(rèn)低電平
/*定時器TIM2初始化*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_InternalClockConfig(TIM2);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 1000-1;//ARR
TIM_TimeBaseStructure.TIM_Prescaler = 72-1;//PSC
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除標(biāo)志位
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//使能更新中斷->NVIC
/*NVIC初始化*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStructure);
}
開、關(guān)定時器
/*打開定時器*/
void OpenTimer()
{
TIM_SetCounter(TIM2,0);
count=0;//計數(shù)為零
TIM_Cmd(TIM2,ENABLE);
}
/*關(guān)閉定時器*/
void CloseTimer()
{
TIM_Cmd(TIM2,DISABLE);
}
定時器中斷
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)== SET)
{
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
count++;// 72M/(PSC+1)/(ARR+1)即72M/72/1000=1ms
}
}
獲取計數(shù)值
u32 GetEchoTimer()
{
u32 t=0;
t = count*1000;
t +=TIM_GetCounter(TIM2);
TIM2->CNT = 0;
Delay_ms(50);
return t;
}
計算距離
float Sr04GetLength()
{
u32 t = 0;
int i = 0;
float length = 0;
float sum = 0;
while(i!=5)
{
GPIO_SetBits(GPIOB,GPIO_Pin_11);//trig發(fā)出高電平
Delay_us(20);
GPIO_ResetBits(GPIOB,GPIO_Pin_11);
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10) == 0);//echo等待回響
OpenTimer();//′打開定時器
i = i + 1;//每收到一次,回響信號+1,計算收到5次的平均值
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10) == 1);
CloseTimer();//關(guān)閉定時器
t = GetEchoTimer();
length = ((float)t/58.0);//cm
sum = length + sum ;
}
length = sum/5.0;
return length;
}
LED.c
我這里L(fēng)ED接的是高電平,所以STM32給低電平點亮
/*LED初始化*/
void LED_Init()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
void LED_ON()
{
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
}
void LED_OFF()
{
GPIO_SetBits(GPIOA,GPIO_Pin_0);
}
main.c
OLED顯示距離。文章來源:http://www.zghlxwxcb.cn/news/detail-766520.html
當(dāng)距離小于10cm時,LED點亮;大于10cm時,LED熄滅。文章來源地址http://www.zghlxwxcb.cn/news/detail-766520.html
a=Sr04GetLength();//距離變量a
int main(void)
{
LED_Init();
OLED_Init();
Sr04_Init();
OLED_ShowString(1,1,"length:");
while(1)
{
a=Sr04GetLength();
OLED_ShowNum(2,1,a,4);
if(a<10)
{
LED_ON();
}
else
{
LED_OFF();
}
}
}
到了這里,關(guān)于STM32超聲波測距(OLED顯示距離)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!