STM32F103驱动HCSR04超声波测距显示
STM32F103驱动HCSR04超声波测距显示
- 目录
- 超声波模块介绍
- ①实物图
- ②产品说明
- ③电气参数
- ④超声波工作原理
- 驱动代码
- ①STM32配置初始化代码
- ①超声波驱动应用代码
- ②超声波距离计算代码
- 具体测试现象
- 总结
目录
超声波模块介绍
超声波模块在电子DIY作品中实现小车避障测距等方面均应用广泛,在大学生智能车DIY爱好者中尤为显眼。
①实物图
点击图片购买
②产品说明
HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达3mm,包括发射器、接收器与控制电路,它是一种压电式传感器,利用电致伸缩现象而制成。
③电气参数
电气参数 | HCSR04超声波模块 |
---|---|
工作电压 | DC5V |
工作电流 | 15mA |
工作频率 | 40KHz |
最远射程 | 4M |
最近射程 | 2cm |
测量角度 | 15° |
输入触发信号 | 10us的TTL脉冲 |
输出回响信号 | 输出TTL电平信号,与射程成比例 |
④超声波工作原理
首先我们可以看下面的一张超声波的时序图:
图中我们可以大致看出,要使用HCSR04这个超声波模组,我们必须先给超声波发送一个触发信号,引导超声波内部循环发出8个40Khz的脉冲然后输出回响信号引脚上拉为高电平,然后我们利用超声波回响信号引脚的高电平所得计数时间经过相关运算就可以得到对应的距离,具体公式如下:
测试距离 = (高电平时间声速(340M/S)/2)= ((float)t/58.0)
这个公式的具体换算过程,大家可以用以前学过的知识进行还算下,最后得到的距离单位是厘米。
下面放一张超声波的引脚功能示意图,能更好的理解HCSR04的具体使用和接线在代码中:
驱动代码
之前写过用51单片机驱动HCSR04在LCD1602上的驱动代码,这篇文章我使用STM32驱动HCSR04在0.96OLED(使用人数较多并且开源初始化代码方便移植)上面使用的驱动代码。
①STM32配置初始化代码
时钟和GPIO以及中断相关配置:
void HCSR04_Init(void)
{ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //定义定时器结构体GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//IO 初始化GPIO_InitStructure.GPIO_Pin = HCSR04_TRIG; //发送高点平引脚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); //定时器初始化使用基本定时器3RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //打开TIM3定时器时钟TIM_DeInit(TIM3);TIM_TimeBaseStructure.TIM_Period = 65535; //(1000-1); //设置在下一个更新时间装入活动的自动重装载寄存器周期的值 计数到1000为1msTIM_TimeBaseStructure.TIM_Prescaler =(72-1); //设置用来作为TIMx时钟频率除数的预分频 1M的计时频率 1US计数TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //不分频TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 TIM_ClearFlag(TIM3, TIM_FLAG_Update); //清除更新中断避免立即产生更新中断TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //启用计时器更新中断NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //设置中断服务NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //主优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //次优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //启用中断NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIM3,DISABLE);
}//定时器中断服务程序
void TIM3_IRQHandler(void) //TIM3中斷
{if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM更新中断是否发生{TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除TIM更新中断标志位msHcCount++;}
}
①超声波驱动应用代码
下面展示写根据超声波时序图可以写出下面的驱动代码:
//开始计数
static void StartTimer() //打开定时器
{TIM_SetCounter(TIM3,0); //清除计数msHcCount = 0;TIM_Cmd(TIM3, ENABLE); //启用TIM3外设
}static void StopTimer() //关闭定时器外设
{TIM_Cmd(TIM3, DISABLE); //关闭TIM定时器外设
}//获取计时器时间
float GetEchoTimer(void)
{u32 t = 0;t = msHcCount*1000; //得到mst += TIM_GetCounter(TIM3); //得到usTIM3->CNT = 0; //将TIM3定时计数器的寄存器清零delay_ms(50);return t;
}
②超声波距离计算代码
//取五次数据平均值,为了使测距所得到的值更加精确可采取多次测距的平均值来使用应用中
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; //发送高电平输出delay_us(20);TRIG_SEND = 0;while(ECHO_RECEIVE == 0); //等待接收高电平输出StartTimer(); //打开计时器while(ECHO_RECEIVE == 1);StopTimer(); //关闭计时器t = GetEchoTimer(); //获取时间,解析度为1USlengthTemp = ((float)t/58.2); //cmsum = lengthTemp + sum ;}distance = 100*sum/5.0;return distance;
}
具体测试现象
本次使用OLED屏幕显示超声波所测距离并显示如下图所示:
总结
文章中使用的显示方式为0.96寸OLED模块显示,驱动MCU使用的为STM32F103C8T6,在使用HCSR04的过程中也可以自己根据HCSR04的驱动代码所得到的距离值去做其他的接口应用,例如做小车,或者其他测距案例均可移植使用,需要完整工程的可下方留言邮箱获取。
STM32F103驱动HCSR04超声波测距显示相关推荐
- arduino与hcsr04_Arduino 驱动 HC-SR04 超声波测距模块
/* Arduino Uno 驱动HC-SR04 超声波测距传感器模块 Created 2014 by 太极创客 http://www.taichi-maker.com 使用Arduino Uno驱动 ...
- STM32—驱动HC-SR04超声波测距模块
文章目录 超声波测距原理 HC-SR04工作原理 STM32实现驱动 1.引脚的配置 2.时序控制 3.时间差测量 4.如何将距离测出来 超声波测距原理 利用HC-SR04超声波测距模块可以实现比较精 ...
- STM32F103—有关HC-SR04超声波测距模块的代码
关于HC-SR04超声波测距模块(Trig和Echo的引脚可以自定义,我用的TRIG是PBout(11) ECHO是PBin(10)) 硬件连接: Vcc :5V输入(最好不要用3.3V输入) Tri ...
- 基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距
系列文章目录 一.基于STM32F103C8T6最小系统板和STM32CubeMX实现LED灯循环闪烁 二.基于STM32F103C8T6和STM32CubeMX实现UART串口通信数据收发 三.实战 ...
- 基于51单片机驱动HC-SR04超声波模块(LCD1602显示)
基于51单片机驱动HC-SR04超声波模块(LCD1602显示) 一.基本参数 二.通信时序 三.部分代码展示 四.实际效果 总结 一.基本参数 点击图片购买 HC- SR04+是一款宽电压工作的超声 ...
- 基于51单片机HC-SR04超声波测距带温度补偿
基于51单片机HC-SR04超声波测距带温度补偿 1 开发环境 2 功能说明介绍 3 程序 3.1 工程文件 3.2 代码 4 原理图 5 元器件清单 6 PCB 7全部资料 1 开发环境 仿真图:p ...
- 基于DE2 115开发板驱动HC_SR04超声波测距模块【附源码】
目录 1. 实验平台与目的 2. 实验要求 3. 实验原理 3.1. 理论原理 3.2. 硬件模块时序图 4. 系统架构设计 5. 模块说明 5.1. hc_sr_driver端口信号列表 5.2. ...
- 学习HC-SR04超声波测距模块,代码附带卡尔曼滤波
硬件引脚 VCC-供5V的电压(一定要是5v) GND-接地 Trig-HC-SR04超声波测距模块上的触发引脚,用于向模块发送一个10微秒的高电平触发信号,触发模块开始进行距离测量 Echo-用于接 ...
- HC-SR04超声波测距模块
1.产品特点 HC-SR04超声波测距模块可提供2cm-400cm 的非接触式距离感测功能,测距精度可达高到3mm:模块包括超声发射器.接收器与控制电路. 基本工作原理: (1)采用 ...
最新文章
- 读书笔记:编写高质量代码--web前端开发修炼之道(二:5章)
- linux的crash之hardlock排查记录
- python3 执行系统命令
- Java机器学习库ML之五样本不均衡
- python 类可以调用实例变量_python面向对象中类对象、实例对象、类变量、实例变量、类方法、实例方法、静态方法...
- matlab中基于cdma的锁相环,答辩-基于MATLAB的CDMA通信系统设计与仿真.ppt
- 整合Swagger接口文档
- jQuery Mobile中页面page的data-*选项
- HTML DOM教程 18-HTML DOM Body 对象
- java将时间戳转换成字符串_java 时间戳与日期字符串相互转换详解
- mac安装maven
- 标签打印软件如何制作箭头样式
- 深度学习-LeCun、Bengio和Hinton的联合综述
- ASP.NET2.0 ReportingServices报表灵魂的收割者(一)
- unable to resolve column. This inspection performs unresolved sql references check.
- 计算机与英语教学的论文开题报告,英语教学法毕业论文开题报告范文
- 《学Unity的猫》——第十九集:皮皮猫上班第一天,认识游戏开发公司各个部门
- vue---向后台校验用户名/手机号码/邮箱等唯一性的参数是否被注册
- Windows部署静态网站
- 大数据分析技术与应用 1