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;  //单位cm
        printf("\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 */

四、编译

五、接线图及效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/650517.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android Gradle plugin 版本和Gradle 版本

1.当看到这两个版本时,确实有点迷糊。但是他们是独立的,没有太大关联。 就是说在Android studio中看到的两个版本信息,并无太大关联,是相互独立的。Gradle插件版本决定了你的项目是如何构建的,而Gradle版本是执行构建…

知识融合概述

文章目录 知识融合知识融合过程研究现状技术发展趋势 知识融合 知识融合的概念最早出现在1983年发表的文献中,并在20世纪九十年代得到研究者的广泛关注。而另一种知识融合的定义是指对来自多源的不同概念、上下文和不同表达等信息进行融合的过程认为知识融合的目标是…

新闻稿推广策略有哪些?建议收藏

新闻稿推广是一种有效的公关工具,它可以帮助企业或组织传递信息、提升品牌知名度、建立权威形象,并最终促进销售。新闻稿推广策略有哪些?接下来伯乐网络传媒就来给大家分享一下。 确定目标受众:在撰写新闻稿之前,明确你…

对比表征学习(二)Setence Embedding

参考翁莉莲的Blog,本章主要阐述句子嵌入(sentence embedding) 文本扩增 绝大部分视觉应用中的对比方法依赖于创造每个图像的增强版本,但是在句子扩增中会变得非常有挑战性。因为不同于图片,在扩增句子的同时非常容易改…

TPD-3W 系列——3W 1.5KVDC 隔离 宽范围输入,双隔离双输出 DC/DC 电源模块

TPD-3W系列产品是专门针对线路板上分布式电源系统中需要产生一组与输入电源隔离的双隔离双电源的应用场合而设计。该产品适用于:1)输入电源的电压变化范围≤2:1 ;2)输入输出之间要求隔离≤1500VDC;3&#x…

从零开始搭建一个SpringBoot项目

目录 Spring BootSpring Boot 项目开发环境1、快速创建SpringBoot项目2、pom.xml 添加 Meavn 依赖3、配置application.yml4、验证数据库是否连接成功5、配置 Druid 数据源 Spring Boot 整合 MyBatis1、准备依赖2、application-dev.yml 配置3、启动类添加Mapper接口扫描器4、设置…

【C++】:vector容器的基本使用

目录 🍒1,vector的介绍🍒2,vector的使用🐯2.1 vector的构造🦁2.2 vector iterator 的使用🌽2.3 vector 空间增长问题🍓2.4 vector 增删查改🐯2.5 vector 访问及遍历&…

2024新数据库入门教程

1.官网下载MySQL 下载Mysql链接: 点击下载mysql 下载完成后解压到某一个文件夹(记住这个路径,一会要用到) 2.配置初始化文件my.ini 在根目录下创建一个txt文件,名字叫my,文件后缀为ini 以下代码除安装目录和数…

[STM32-HAL库]ADC采集-DMA中断采集-平均值滤波-STM32CUBEMX开发-HAL库开发系列-主控STM32F103C8T6

目录 一、前言 二、实现步骤 1.STM32CUBEMX配置 2.Keil工程程序设计 三、结语 一、前言 本文通过STM32CUBEMX实现对ADC的数据采集和滤波操作,帮助各位开发者完成与模拟量输入的采集工作。 二、实现步骤 1.STM32CUBEMX配置 以STM32F103C8T6为例,打开S…

选项卡式小部件QTabWidget

文章目录 1. 详细介绍2. 常用属性3. 信号4. 常用函数5. 官方示例Tab Dialog QTabWidget提供一堆选项卡式小部件。 1. 详细介绍 选项卡式部件提供一个选项卡栏和一个用于显示与每个选项卡相关的页面的页面区域。 默认情况下,选项卡栏显示在页面区域上方,…

duckdb 插件机制研究

本文研究 duckdb 内置的 extensions 工作机制。 插件架构 在 duckdb 源码内,内置了一组原生插件,位于顶层 extension 目录下: 除此之外,还支持 Out-of-Tree Extension,简单说就是独立的插件,不是集成在源…

2024年5月20日 (周二) 叶子游戏新闻

《边境之塔》登陆Steam 复古风恐怖生存冒险DascuMaru制作并发行,一款低像素3D复古风恐怖生存冒险新游《边境之塔(The Tower on the Borderland)》登陆Steam正式推出,限时九折优惠,本作暂不支持中文。 勇魅出击&#xf…

nuxt2:自定义指令 / v-xxx / directives / 理解 / 使用方法 / DEMO

一、理解自定义指令 在 vue 中提供了一些对于页面和数据更为方便的输出&#xff0c;这些操作就叫做指令&#xff0c;以 v-xxx 表示&#xff0c;比如 html 页面中的属性 <div v-xxx ></div>。自定义指令很大程度提高了开发效率&#xff0c;提高了工程化水平&#x…

亚马逊云主管马特·加尔曼面临压力,致力于在人工智能领域赶超竞争对手

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Java项目:基于SSM框架实现的企业人事管理系统单位人事管理系统【ssm+B/S架构+源码+数据库+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的企业人事管理系统单位人事管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观…

pytorch文本分类(四)模型框架(模型训练与验证)

关卡四 模型训练与验证 本文是在原本闯关训练的基础上总结得来&#xff0c;加入了自己的理解以及疑问解答&#xff08;by GPT4&#xff09; 原任务链接 目录 关卡四 模型训练与验证1. 训练1.1 构建模型结构1.2 模型编译1.3 模型训练1.4模型超参数调试 2. 推理2.1 模型准确性…

大模型时代的具身智能系列专题(三)

清华高阳团队 高阳为清华叉院助理教授&#xff0c;本科毕业于清华大学计算机系&#xff0c;博士毕业于UC Berkeley。博士导师是Vision领域的大牛Trevor Darrell&#xff0c;读博期间和Sergey Levine合作开始强化学习方面的探索&#xff0c;博后跟随Pieter Abbeel做强化学习&am…

aws emr启动standalone的flink集群

关键组件 Client&#xff0c;代码由客户端获取并做转换&#xff0c;之后提交给JobMangerJobManager&#xff0c;对作业进行中央调度管理&#xff0c;获取到要执行的作业后&#xff0c;会进一步处理转换&#xff0c;然后分发任务给众多的TaskManager。TaskManager&#xff0c;数…

ResNet残差网络的学习【概念+翻译】

基于何明凯前辈论文的学习 1.主要内容&#xff08;背景&#xff09; 1、首先提了一个base&#xff1a;神经网络的深度越深&#xff0c;越难以训练。 2、原因&#xff1a;因为随着神经网络层数的增加&#xff0c;通常会遇到梯度消失或梯度爆炸等问题&#xff0c;这会导致训练变…

二十八、openlayers官网示例Data Tiles解析——自定义绘制DataTile源数据

官网demo地址&#xff1a; https://openlayers.org/en/latest/examples/data-tiles.html 这篇示例讲解的是自定义加载DataTile源格式的数据。 先来看一下什么是DataTile&#xff0c;这个源是一个数组&#xff0c;与我们之前XYZ切片源有所不同。DataTile主要适用于需要动态生成…