当前位置: 首页 > news >正文

STM32系列(HAL库)——F103C8T6通过HC-SR04超声波模块实现测距

一、模块资料

(1)模块简介

超声波是振动频率高于20kHz的机械波。它具有频率高、波长短、绕射现象小、方向性好、能够成为射线而定向传播等特点。HC-SRO4是一款尺寸完全兼容老版本,增加UART和IIC功能的开放式超声波测距模块,默认条件下,软件与硬件完全兼容老版本HC-SRO4;可以通过电阻设置成UART或IIC模式。2CM盲区,4.5M典型最远测距,2.2mA作电流。采用升级解调芯片RCWL-9206,带UART与IIC功能MCU:使其外围更加简洁,工作电压更宽(3-5.5V),接口功能更多。

(2)模块参数

①专业解调测距芯片RCWL-9206 ②支持GPIO,UART与IIC三种模式接口 ③2.2mA工作电流 ④2cm最小盲区 ⑤2cm-450cm的超宽测量范围 ⑥工作温度:-10°C-70°c ⑦3V-5.5V宽电压供电

(3)工作原理

img

img

(4)实现思路

程序采用状态机编程,MCU给模块Trig引脚输出一个高电平脉冲-->模块发送脉冲信号-->定时器启动高电平输入捕获-->模块返回的高电平信号到达定时器开始计数-->返回信号变为低电平定时器停止计数-->得到定时器时间差-->根据公式计算距离

二、CubeMX配置

(1)芯片选择

(2)配置RCC、SYS、时钟树

(3)配置GPIO

(4)配置串口1

(5)配置定时器

(6)开启定时器中断

(7)设置路径,生成代码工程

三、Keil5代码

(1)勾选Use MicroLIB

(2)创建SR04.c和SR04.h文件

SR04.h文件同上

SR04.c

#include "SR04.h"float distant;      //测量距离
uint32_t measure_Buf[3] = {0};   //存放定时器计数值的数组
uint8_t  measure_Cnt = 0;    //状态标志位
uint32_t high_time;   //超声波模块返回的高电平时间//===============================================读取距离
void SR04_GetData(void)
{
switch (measure_Cnt){case 0:TRIG_H;delay_us(30);TRIG_L;measure_Cnt++;__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); //启动输入捕获       或者: __HAL_TIM_ENABLE(&htim5);                                                                                            break;case 3:high_time = measure_Buf[1]- measure_Buf[0];    //高电平时间printf("\r\n----高电平时间-%d-us----\r\n",high_time);                           distant=(high_time*0.034)/2;  //单位cmprintf("\r\n-检测距离为-%.2f-cm-\r\n",distant);          measure_Cnt = 0;  //清空标志位TIM2->CNT=0;     //清空计时器计数break;}
}//===============================================us延时函数void delay_us(uint32_t us)//主频72M
{uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);while (delay--){;}
}//===============================================中断回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//
{if(TIM2 == htim->Instance)// 判断触发的中断的定时器为TIM2{switch(measure_Cnt){case 1:measure_Buf[0] = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);//获取当前的捕获值.__HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);  //设置为下降沿捕获measure_Cnt++;                                            break;              case 2:measure_Buf[1] = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);//获取当前的捕获值.HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_1); //停止捕获   或者: __HAL_TIM_DISABLE(&htim5);measure_Cnt++;  }}}

SR04.h

#ifndef __SR04_H
#define __SR04_H
#include "main.h"
#include "tim.h"
#include "stdio.h"#define TRIG_H  HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_SET)
#define TRIG_L  HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_RESET)void delay_us(uint32_t us);
void SR04_GetData(void);#endif

(3)将SR04.c添加进工程

(4)usart.c代码添加

/* USER CODE BEGIN 0 */
#include "stdio.h"
/* USER CODE END 0 *//* USER CODE BEGIN 1 */
/*********************************************************
*
*重定义 fputc 函数
*
*********************************************************/
int fputc(int ch,FILE *f)
{HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );return ch;
}
/* USER CODE END 1 */

(5)main函数

#include "SR04.h"int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM2_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){SR04_GetData(  );HAL_Delay(1500);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */

四、编译

五、接线图及效果

相关文章:

  • Python进阶:探索Python标准库和第三方库
  • hive结合Hbase实现实时数据处理和批量分析
  • 2024 年“泰迪杯”A 题:生产线的故障自动识别与人员配置--第四题(用遗传算法解决生产线排班问题--matlab代码)
  • Spark SQL 中DataFrame DSL的使用
  • http和https分别是什么?区别是什么?
  • Redis:redis基础
  • 基于springboot实现大学生一体化服务平台系统项目【项目源码+论文说明】
  • 运维笔记.Docker镜像分层原理
  • 拓数派与浙江平数举行「政务数据服务产品合作开发」签约仪式
  • echarts配置记录,一些已经废弃的写法
  • StringBuilder的基本操作
  • 128天的创意之旅:从初心到成就,我的博客创作纪念日回顾
  • c++ (命名空间 字符串)
  • 【全开源】在线题库微信小程序系统源码(ThinkPHP+FastAdmin+UniApp)
  • 【C++】set与map
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 【知识碎片】第三方登录弹窗效果
  • docker容器内的网络抓包
  • Effective Java 笔记(一)
  • fetch 从初识到应用
  • Hexo+码云+git快速搭建免费的静态Blog
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • Linux Process Manage
  • Sequelize 中文文档 v4 - Getting started - 入门
  • webpack入门学习手记(二)
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 动态魔术使用DBMS_SQL
  • 服务器之间,相同帐号,实现免密钥登录
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 关于for循环的简单归纳
  • 规范化安全开发 KOA 手脚架
  • 判断客户端类型,Android,iOS,PC
  • 悄悄地说一个bug
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 物联网链路协议
  • 译有关态射的一切
  • 源码安装memcached和php memcache扩展
  • 在Mac OS X上安装 Ruby运行环境
  • ionic入门之数据绑定显示-1
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​业务双活的数据切换思路设计(下)
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #控制台大学课堂点名问题_课堂随机点名
  • (12)目标检测_SSD基于pytorch搭建代码
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (4)STL算法之比较
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (Ruby)Ubuntu12.04安装Rails环境
  • (三十五)大数据实战——Superset可视化平台搭建
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)