stm32f103 HAL库 HC-SR04测距

目录

  • 一、实现测距
  • 二、添加TIM3控制LED根据距离以不同频率闪烁
  • 三、观察时序
  • Modebus协议
  • 12路超声波雷达设计方案
      • 1. 系统架构设计
      • 2. 硬件设计
      • 3. 软件设计
      • 4. 通信协议设计
      • 5. 用户接口
      • 6. 安全和冗余
      • 7. 测试和验证
      • 8. 电源和物理封装
      • 9. 文档和支持

一、实现测距

配置时钟
在这里插入图片描述
配置定时器
在这里插入图片描述
在这里插入图片描述

GPIO口
在这里插入图片描述

配置串口
在这里插入图片描述
在这里插入图片描述

#include "SR04.h"
 
uint32_t measure_Buf[3] = {0};   //存放定时器计数值的数组
uint8_t  measure_Cnt = 0;    //状态标志位
uint32_t high_time;   //超声波模块返回的高电平时间
float distant;      //测量距离
 
//===============================================读取距离
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++;  
                         
		}
	
	}
	
}
 

二、添加TIM3控制LED根据距离以不同频率闪烁

这里我只设置了两个速度,小于10cm时0.2间隔闪烁,大于10cm时0.5s间隔闪烁

在这里插入图片描述
主要代码实现
头文件

#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)

extern float distant;      //测量距离

void delay_us(uint32_t us);
void SR04_GetData(void);
 
#endif

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == TIM3)
	{
        // 切换LED状态
         HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
    }
 
}

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();
  MX_TIM3_Init();
  /* USER CODE BEGIN 2 */
	__HAL_TIM_CLEAR_IT(&htim3, TIM_IT_UPDATE);
	HAL_TIM_Base_Start_IT(&htim3);	
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  //printf("\r\n----高电平时间--us----\r\n");							
		  SR04_GetData();
		if (distant < 10.0f) {
			// distant小于5,设置定时器周期为0.2秒
			__HAL_TIM_SET_AUTORELOAD(&htim3, 25000 - 1);//(uint32_t)(SystemCoreClock / 2) / 1000); // 假设系统时钟为SystemCoreClock
		} else {
			// distant大于等于5,设置定时器周期为0.5秒
			__HAL_TIM_SET_AUTORELOAD(&htim3, 50000-1);
		}

		// 重新启动定时器
		HAL_TIM_Base_Start_IT(&htim3);
		HAL_Delay(1500);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

三、观察时序

在这里插入图片描述
在这里插入图片描述
延时30us左右和代码中匹配
在这里插入图片描述

Modebus协议

Modbus协议是一种串行通信协议,最初由Modicon公司(现在的施耐德电气Schneider Electric)在1979年发表,用于可编程逻辑控制器(PLC)之间的通信。它已经成为工业领域通信协议的业界标准,并且是工业电子设备之间常用的连接方式。Modbus协议的主要特点包括公开发表、无版权要求、易于部署和维护,以及对供应商来说,修改移动本地的比特或字节没有很多限制。

Modbus协议允许多个设备(大约240个)连接在同一个网络上进行通信,例如,一个测量温度和湿度的设备,并将结果发送给计算机。在数据采集与监视控制系统(SCADA)中,Modbus通常用来连接监控计算机和远程终端控制系统(RTU)。Modbus协议存在用于串口、以太网以及其他支持互联网协议的网络的版本。大多数Modbus设备通信通过串口EIA-485物理层进行。

Modbus协议有两种主要的串行通信变体:Modbus RTU和Modbus ASCII。Modbus RTU采用二进制表示数据,而Modbus ASCII则是人类可读的、冗长的表示方式。RTU格式的命令/数据带有循环冗余校验(CRC)的校验和,而ASCII格式采用纵向冗余校验的校验和。Modbus Plus是Modbus的一个扩展版本,但是它是Modicon专有的,和Modbus不同。

Modbus协议采用master/slave架构,其中一个节点是master节点,其他节点是slave节点,每个slave设备都有一个唯一的地址。在串行和Modbus Plus网络中,只有被指定为主节点的节点可以启动命令,在以太网上,任何一个设备都能发送Modbus命令,但通常也只有一个主节点设备启动指令。

Modbus命令包含了执行操作的设备的Modbus地址,所有设备都会收到命令,但只有指定地址的设备会执行及回应指令。Modbus命令还包括检查码,以确保命令在传输过程中没有被破坏。基本的ModBus命令可以指令一个RTU改变寄存器的值、控制或读取I/O端口,以及指挥设备回送其寄存器中的数据。

Modbus协议是应用层报文传输协议,定义了一个与物理层无关的协议数据单元(PDU),PDU由功能码和数据域组成,功能码为1字节,数据域长度不固定。Modbus RTU协议允许PLC和计算机之间通过串行线路交换信息,并在建筑管理系统(BMS)和工业自动化系统中得到广泛应用。Modbus TCP是设计用于通过TCP/IP堆栈传输Modbus帧的协议,通常通过以太网物理层传输。Modbus最初作为串行层传输数据的应用级协议,现在也可以通过TCP/IP和UDP实现。

12路超声波雷达设计方案

设计一款12路车载超声波雷达系统,使用STM32F103微控制器和HC-SR04超声波传感器模块,同时提供RS485和Modbus协议的接口,需要考虑以下几个关键方面:

1. 系统架构设计

  • 主控制器:选择STM32F103系列微控制器作为主控单元,因为它具有足够的GPIO、定时器和通信接口。
  • 传感器模块:每个HC-SR04模块负责一个方向的测距,共需要12个。

2. 硬件设计

  • GPIO配置:为每个HC-SR04配置一对GPIO用于TRIG和ECHO信号。
  • 定时器:使用STM32的定时器来精确测量HC-SR04的回波时间。
  • RS485通信:使用STM32的USART接口配置为RS485,以实现数据的串行通信。
  • Modbus协议栈:集成Modbus协议栈来处理Modbus RTU或TCP通信。
  • 电源管理:确保系统有稳定的电源供应,并考虑电源防反接和过压保护。
  • 物理布局:合理布局12个传感器,确保覆盖车辆周围所有必要的监测区域。

3. 软件设计

  • 驱动程序:编写HC-SR04超声波传感器的驱动程序,实现距离测量。
  • Modbus协议实现:实现Modbus RTU协议,处理功能码,响应数据读取和写入请求。
  • RS485通信:实现RS485通信接口,确保数据传输的可靠性。
  • 任务调度:设计任务调度程序,合理分配CPU时间给各个传感器的测量任务。
  • 数据融合:设计算法对12路传感器数据进行融合处理,提供更准确的车辆周围环境信息。

4. 通信协议设计

  • Modbus功能码:定义Modbus功能码,实现对每个传感器的独立控制和数据读取。
  • 数据帧格式:设计Modbus数据帧格式,包括设备地址、功能码、数据寄存器地址、数据长度和校验等。

5. 用户接口

  • 配置界面:提供一种方式(如串口命令行、图形界面等)来配置设备参数,例如传感器校准、Modbus地址等。

6. 安全和冗余

  • 故障检测:实现故障检测机制,当某个传感器失效时能够及时报警。
  • 数据校验:确保所有通信数据都有校验机制,如CRC校验。

7. 测试和验证

  • 单元测试:对每个模块进行单元测试,确保其功能正确。
  • 集成测试:进行系统集成测试,确保所有模块协同工作正常。
  • 环境测试:在实际车辆上进行测试,验证系统在不同环境下的性能。

8. 电源和物理封装

  • 电源设计:设计合适的电源方案,包括电源转换和稳压。
  • 封装设计:设计适合车载环境的封装,确保系统的稳定性和耐用性。

9. 文档和支持

  • 用户手册:提供详细的用户手册,包括安装、配置和故障排除指南。
  • 开发文档:为二次开发提供API文档和开发指南。

这个设计方案提供了一个基本的框架,具体实现时还需要根据实际需求和环境进行调整和优化。

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

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

相关文章

八、BGP

目录 一、为何需要BGP&#xff1f; 二、BGP 2.1、BGP邻居 2.2、BGP报文 2.3、BGP路由 2.4、BGP通告遵循原则 2.5、BGP实验 第一步&#xff1a;建立邻居 第二步&#xff1a;引入路由 BGP路由黑洞 路由黑洞解决方案 1、IBGP全互联 2、路由引入 3、MPLS 多协…

【Python】数据处理:Matplotlib绘图

Matplotlib是Python强大的数据可视化工具库&#xff0c;类似于MATLAB语言。Mat-lotlib提供了一整套与MATLAB相似的命令API&#xff0c;十分适合进行交互式制图&#xff0c;而且也可以方便地将它作为绘图控件&#xff0c;嵌入GUI应用程序中。 Matplotlib是神经生物学家John D.Hu…

轻松拿捏C语言——【关机代码】

&#x1f970;欢迎关注 轻松拿捏C语言系列&#xff0c;来和 小哇 一起进步&#xff01;✊ &#x1f389;创作不易&#xff0c;请多多支持&#x1f389; &#x1f308;感谢大家的阅读、点赞、收藏和关注&#x1f495; &#x1f339;如有问题&#xff0c;欢迎指正 我们可以通过写…

c++编程(16)——STL(4)deque

欢迎来到博主的专栏&#xff1a;c编程 博主ID&#xff1a;代码小豪 文章目录 dequedeque的优劣势deque的操作constructor元素访问 deque deque的全称是double ended queue&#xff0c;译为双端队列&#xff0c;如何理解这个双端呢&#xff1f;我们以vector为例&#xff0c;vec…

深入剖析人才管理的关键要素:“选、用、育、留”四大核心要素

在当今这个日新月异的商业时代&#xff0c;企业的成功不再仅仅取决于资金、技术或市场策略&#xff0c;而更多地依赖于企业所拥有的人才资源。有效的人才管理策略&#xff0c;尤其是“选、用、育、留”四大核心要素&#xff0c;已成为推动企业持续发展的关键。 一、选&#xff…

Canvas绘制老友记时钟

Canvas绘制老友记时钟 前言 一直做3D/2D可视化&#xff0c;Canvas API和三角函数&#xff0c;空间几何是基础。在官网上看了一遍Canvas API之后&#xff0c;决定绘制一个老友记时钟来巩固知识点&#xff0c;本文用实际代码讲解绘制过程。 代码 HTML <canvas id"myC…

electron模板【lectron-react-boilerplate】多窗口配置【HtmlWebpackPlugin】多页面配置

如果您正在使用electron-react-boilerplate进行快速的Electron应用程序开发,您可能会遇到想要在桌面应用程序中拥有多个原生窗口的情况。 MacOS窗口图像由OpenClipart-Vectors提供,来源Pixabay。 开始之前需要提及的事情! Electron有一个主进程和渲染进程的模式。可以有多个…

【MySQL】聊聊数据库是如何保证数据不丢的

对于一个存储系统来说&#xff0c;其中比较关键的核心组件包含&#xff0c;网络、存储模型、持久化、数据结构等。而数据如何保证不丢失&#xff0c;对于不同的存储系统来说&#xff0c;比如Redis采用AOF和RDB的方式进行混合使用&#xff0c;而MySQL采用日志进行保证。也就是re…

【C++11】第一部分(一万六千多字)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 C11简介 统一的列表初始化 &#xff5b;&#xff5d;初始化 std::initializer_list 声明 auto decltype 右值引用和移动语义 左值引用和右值引用 左值引…

车票信息的请求与显示

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 1 发送与分析车票信息的查询请求 得到了获取车票信息的网络请求地址&#xff0c;然后又分析出请求地址的必要参数以及车站名称转换的文件&#xff…

利用鱼骨图进行项目问题复盘与改进

一、引言 在项目管理中&#xff0c;问题复盘是一个至关重要的环节。它不仅能帮助我们识别项目执行过程中出现的问题&#xff0c;还能促使我们深入探究问题的根本原因&#xff0c;从而采取有效的改进措施。在这个过程中&#xff0c;鱼骨图作为一种强大的工具&#xff0c;为我们…

GiantPandaCV | 提升分类模型acc(三):优化调参

本文来源公众号“GiantPandaCV”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;提升分类模型acc(三)&#xff1a;优化调参 一、前言 这是本系列的第三篇文章&#xff0c;前两篇GiantPandaCV | 提升分类模型acc(一)&#xff1a;B…

一文讲通:前后端分离的四种开发模式,及其优缺点。

前后端分离已经成为了开发的主流模式&#xff0c;很多老铁认为前后端分离就是各干各的&#xff0c;其实不然。 前后端分离有多种模式&#xff0c;贝格前端工场为大家一一详解。 1. 前后端完全分离 在这种模式下&#xff0c;前端和后端是完全独立的两个系统。前端使用一种框架…

Python学习笔记9:入门知识(九)

缩进 什么是缩进&#xff1f; 缩进&#xff0c;简单的理解为本行的首字符相比上一行的首字符位置相对靠后。目前笔者接触的编程语言缩进一般是4字符&#xff0c;直接可以按tab键就行。 为什么突然讲缩进&#xff1f; Python这门语言&#xff0c;是依靠缩进来判断当前行与上…

十五边形有多少条对角线?(解答某位网友的困惑)

想要做出这种题目&#xff0c;必须得先列举一些多边形的例子。 三角形&#xff1a;000 四边形&#xff1a;112 五边形&#xff1a; 六边形&#xff1a; 此时即可发现规律&#xff1a; 三角形的对角线为(3-3)(3-3)0 四边形为&#xff1a;(4-3)(4-3)2 五边形为&#xff1a;…

增强的依赖性

增强的依赖性 原文参见 https://universaldependencies.org/u/overview/syntax.html 受控/提升主语 受控主语&#xff1a;表示主语由控制动词决定。提升主语&#xff1a;表示主语通过提升动词从嵌套句提升到主句。 基本树缺少受控动词与其控制者之间的主语依存关系&#xf…

民生银行信用卡中心金融科技24届春招面经

本文介绍2024届春招中&#xff0c;中国民生银行下属信用卡中心的金融科技&#xff08;系统研发方向&#xff09; 岗位2场面试的基本情况、提问问题等。 2024年04月投递了中国民生银行下属信用卡中心的金融科技&#xff08;系统研发方向&#xff09; 岗位&#xff0c;暂时不清楚…

8个宝藏APP,个个都牛逼哈拉!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 目前win7已经逐渐淡出人们的视野&#xff0c;大部分人都开始使用win10&#xff0c;在日常工作和使用中&#xff0c;创客们下载神奇的软件能大幅提…

最新下载:Folx【软件附加安装教程】

​Folx Pro是一款适合Mac的专业下载工具也是一款BT下载器&#xff0c;Folx中文版有一个支持Retina显示的现代界面&#xff0c;提供独特的系统排序、存储下载内容与预览下载文件&#xff0c;Folx中文官网提供Folx教程、激活码、下载。 Folx友好兼容浏览器&#xff1a;如果你在网…

Ubuntu 18.04下普通用户的一次提权过程

Ubuntu 18.04下普通用户的一次提权过程 一.背景介绍:二.主要调试过程:三.相关命令:1.设置BMC密码,获取BMC IP2.找一台ubuntu搭建TFTP服务,用来替换grub.cfg文件3.从调试服务器的/boot/grub/grub.cfg中提取出recovery mode的配置,简化并生成新的配置文件grub.cfg,放在tftp服务的…