STM32超声波测距(OLED显示距离)

这篇具有很好参考价值的文章主要介绍了STM32超声波测距(OLED显示距离)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、超声波简介

超声波原理:

利用声音测距,声音在空气中的速度是340m/s(15℃)
当声音传播时,若遇到障碍物时,就会被反弹回来,通过计时反弹回来的时间就可以计算出从发射端到障碍物的距离

引脚定义:

工作电压:3V-5.5V宽电压供电

测距盲区:2cm最小盲区

接口定义如图

序号

接口定义

说明

1

Vcc

供电电源

2

Trig/Rx/SCL

GPIO模式:   Trig   触发信号

UART模式:   Rx     接收信号

IIC 模式:   SCL    时钟信号

3

Echo/Tx/SDA

GPIO模式为   Echo   反馈信号

UART模式:   Tx     发射信号

ICC 模式:   SCL    数据信号

4

Gnd

GPIO模式测量原理:

stm32超声波的数据,stm32,单片机,嵌入式硬件

 

外部MCU给模块Trig脚一个大于10uS的高电平脉冲;模块会给出一个与距离等比的高电平脉冲信号,可根据脉宽时间“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%左右。实际应用,如果需要精确距离值,必需要考虑温度影响,做温度补偿。

二、代码解析

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;//设置发生电平引脚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);//默认低电平	
GPIO_ResetBits(GPIOB,GPIO_Pin_10);//默认低电平

/*定时器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);//清除标志位
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);
}

开、关定时器

/*打开定时器*/
void OpenTimer()
{
	TIM_SetCounter(TIM2,0);
	count=0;//计数为零
	TIM_Cmd(TIM2,ENABLE);
}

/*关闭定时器*/
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
	}
}

获取计数值

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发出高电平
      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();//关闭定时器    
      t = GetEchoTimer();        
      length = ((float)t/58.0);//cm
      sum = length + sum ;        
   }
    length = sum/5.0;
    return length;
}

LED.c

我这里LED接的是高电平,所以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显示距离。

当距离小于10cm时,LED点亮;大于10cm时,LED熄灭。文章来源地址https://www.toymoban.com/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();
		}
	}
}

到了这里,关于STM32超声波测距(OLED显示距离)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 电赛MSP430F5529之超声波测距+OLED 显示(含主要代码)

    目录 前言 一、超声波介绍 二、部分代码 三、总结 哎,又双叒叕,电赛延期了,看起来像是遥遥无期,但是肯定要考虑大局,大家就继续抓紧时间学习知识,巩固自己的知识,更进一步。好了,今天主要是继承上一篇博文(OLED显示)写的,主要是写超声波测距的(US-015)

    2024年02月14日
    浏览(55)
  • 基于STM32的超声波测距

    一、HC-SR04模块介绍 HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可高达3mm;模块包括超声波发射器、接收器、与控制电路。 模块的基本工作原理为: (1)采用 IO口 TRIG触发测距,给最少 10us的高电平信呈。 (2)模块自动发送 8个 40khz的方波,自动检测是

    2024年02月13日
    浏览(47)
  • stm32之14.超声波测距代码

           -------------------- 源码  

    2024年02月11日
    浏览(50)
  • 基于STM32超声波测距系统设计

    随着社会的发展和科技的进步,人们对测距的要求越来越高,特别是在一些要求实时测距的场合,传统的测距方式已经无法满足人们的需求,而超声波测距由于其非接触和实时反馈的特点在生活中得到广泛应用。 本系统硬件部分由电源模块、控制模块、显示模块、报警模块、

    2024年02月04日
    浏览(56)
  • 最详细STM32,cubeMX 超声波测距

    这篇文章将详细介绍 STM32使用 cubeMX驱动超声波测距 。 实验材料:STM32F103C8T6开发板, HC-SR04 超声波模块。 所需软件:keil5 , cubeMX ,AiThinker Serial Tool 串口助手。 实验目的:了解 STM32使用 cubeMX驱动超声波 。 实验:超声波测距。 HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触

    2024年02月08日
    浏览(52)
  • STM32:两种方式实现超声波测距

    超声波模块HC-SR04的工作原理很简单,有很多办法可以完成超声波测距,这里简单介绍两种。 配置定时器的中断并声明一个Time的变量,在中断中先判断标志位,然后检查echo端口是否为高电平,如果是,Time++,然后变量time乘以定时时间就能得到echo端口高电平持续的时间,经过

    2024年04月16日
    浏览(51)
  • 基于STM32_HAL库实现超声波测距

    核心板               : STM32F103C8T6。 超声波测距模块 : HC-SR04超声波测距模块 实验目的            : 利用超声波测距,将测量的距离打印在串口并输出。 HC-SR04超声波测距模块介绍         接口定义:Vcc、 Trig(控制端——PA2)、 Echo(接收端——PA11)、 Gnd        

    2024年02月16日
    浏览(52)
  • 基于STM32F407实现超声波测距(SR04)

    今天要实现的功能是超声波测距,这一功能在很多的地方都能用到,比如:在智能小车上可以添加超声波避障功能。今天需要用到SR04超声波模块,在使用这一模块的时候我很会接触到时序图。 模块如图所示: 模块有四个引脚 VCC 供 5V电源, GND 为地线, TRIG 触 发 控 制 信 号

    2024年02月11日
    浏览(58)
  • stm32-CS100A 超声波测距芯片原理及代码解读

            CS100A 是苏州顺憬志联新材料科技有限公司(www.100sensor.com)推出的一款工 业级超声波测距芯片,CS100A 内部集成超声波发射电路,超声波接收电路,数字处理电 路等,单芯片即可完成超声波测距,测距结果通过脉宽的方式进行输出,通信接口兼容 现有超声波模块

    2024年02月04日
    浏览(164)
  • 【STM32篇】驱动HC_SR04超声波测距模块

    CH_SR04 HC_SR04超声波测距模块可提供 2cm-400cm 的非接触式测距感测功能,测距精度高达3mm;模块包括超声波发射器,接收器与控制电路。 基本工作原理: (1)采用IO口TRIG触发测距,需要给最少10us的高电平。 (2)模块自动发送8个40kHz的方波,自动检测是否有信号返回。 (3)有

    2024年02月17日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包