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; //单位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++; }}}
二、添加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文档和开发指南。
这个设计方案提供了一个基本的框架,具体实现时还需要根据实际需求和环境进行调整和优化。
相关文章:
stm32f103 HAL库 HC-SR04测距
目录 一、实现测距二、添加TIM3控制LED根据距离以不同频率闪烁三、观察时序Modebus协议12路超声波雷达设计方案1. 系统架构设计2. 硬件设计3. 软件设计4. 通信协议设计5. 用户接口6. 安全和冗余7. 测试和验证8. 电源和物理封装9. 文档和支持 一、实现测距 配置时钟 配置定时器…...
vue中通过自定义指令实现一个可拖拽,缩放的弹窗
效果 功能描述 按住头部可拖拽鼠标放到边框,可缩放多层重叠丰富的插槽,易于扩展 示例 指令代码 export const dragDialog {inserted: function (el, { value, minWidth 400, minHeight 200 }) {// 让弹窗居中let dialogHeight el.clientHeight ?…...
FreeRtos-09事件组的使用
1. 事件组的理论讲解 事件组:就是通过一个整数的bit位来代表一个事件,几个事件的or和and的结果是输出 #define configUSE_16_BIT_TICKS 0 //configUSE_16_BIT_TICKS用1表示16位,用0表示32位 1.1 事件组适用于哪些场景 某个事件若干个事件中的某个事件若干个事件中的所有事…...
多路h265监控录放开发-(1)建立head窗口并实现鼠标拖动整个窗口
头文件: //鼠标事件 用于拖动窗口//一下三个函数都是QWidget的可重载成员函数void mouseMoveEvent(QMouseEvent* ev) override;void mousePressEvent(QMouseEvent* ev) override;void mouseReleaseEvent(QMouseEvent* ev) override; 源文件: / /// 鼠标…...
ICMR 2024在普吉岛闭幕,学者与泰国舞者共舞,燃爆全场
惊艳!ICMR 2024在普吉岛闭幕,学者与泰国舞者共舞,燃爆全场! 会议之眼 快讯 ICMR(International Conference on Multimedia Retrieval)即国际多媒体检索会议,是一个专注于多媒体检索领域的顶级…...
大模型精调:实现高效迁移学习的艺术
在人工智能领域,大型预训练模型(以下简称“大模型”)已经取得了令人瞩目的成果。这些模型通过在海量数据上进行预训练,能够捕捉到丰富的特征信息,为各种下游任务提供强大的支持。然而,如何将这些大模型应用…...
epoll服务端和客户端示例代码
epoll 服务端demo #include <stdio.h> #include <sys/epoll.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <arpa/inet.h> #include <fcntl.h> #include <unistd.h> #include <ne…...
最大乘积和-第13届蓝桥杯省赛Python真题精选
[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第85讲。 最大乘积和&#…...
探索C嘎嘎的奇妙世界:第四关---引用与内联函数
1 引用: 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。 #include<iostream> using namespace std;int main() {int a 0;// 引用:…...
DLS平台:惠誉全球经济展望——今年调增至2.6%,明年调减!
摘要 尽管全球货币政策逐渐转向宽松,惠誉国际评级(Fitch Ratings)在最新的《全球经济展望》中对2024年全球经济增长进行了上调。然而,由于美国经济增速放缓和其他因素的影响,2025年的全球经济增长预期则被下调。这篇文…...
数据结构习题
第一章 绪论 与数据元素本身的形式、内容、相对位置、个数无关的是数据的 逻辑结构。 第二章 线性表 在一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动的元素个数为 63.5。 n/2 单链表的存储密度 小于1。 创建一个包括n个结点的有序单链…...
交通银行软件开发工程师校招面试经历
本文介绍2024届春招中,交通银行总行的软件开发工程师岗位1场面试的基本情况、提问问题等。 2024年04月投递了交通银行总行的软件开发工程师岗位,暂时不清楚所在部门。目前完成了一面,并进入体检阶段;在这里记录一下面试的相关经历…...
bashrc和profile区别
作用与目的: .bashrc:这个文件主要用于配置和自定义用户的终端环境和行为。每次启动新的终端时,.bashrc文件都会被执行,加载用户设置的环境变量、别名、函数等。这使得用户能够根据自己的喜好和需求来定制终端的行为和外观。profi…...
BC153 [NOIP2010]数字统计
数字统计 一.题目描述二.输入描述:三.输出描述:四.数字范围五.题目思路六.代码实现 一.题目描述 请统计某个给定范围[L, R]的所有整数中,数字2出现的次数。 比如给定范围[2, 22],数字2在数2中出现了1次,在数12中出现1次…...
浅谈LavelDB
简介 LevelDB 是一个开源的轻量级键值存储库,由 Google 开发,用于提供快速的键值存储和支持读写大量数据。LevelDB 具有高性能、快速的读取和写入速度以及支持原子操作的特点,适合用于需要高效存储和检索键值数据的场景。 LevelDB 主要特点…...
Google Earth Engine(GEE)——NDVI的时间序列分析和在线出图
函数: ui.Chart.array.values(array, axis, xLabels) Generates a Chart from an array. Plots separate series for each 1-D vector along the given axis. - X-axis = Array index along axis, optionally labeled by xLabels. - Y-axis = Value. - Series = Vector, d…...
谈吐的艺术(三)
不是要逼人屈服,而只是想请人遵守规定。 0可能遇到的问题 在快餐店买到的汉堡和薯条都是凉的,跟店员理论的时候对方却说味道没有不对。怎么说才能维护自己的权利呢? 更好的说法:“我想问一下,按照你们的规定,食品退换…...
pop链详细分析、构造(以[NISACTF 2022]babyserialize为例)
目录 [NISACTF 2022]babyserialize (一)理清pop链(链尾 链头),标注步骤 1. 先找eval、flag这些危险函数和关键字样(这是链尾) 2.往eval()上面看 3.往$bb()上面看 4.往strtolower()上面看 …...
使用超声波麦克风阵列预测数控机床刀具磨损
预测性维护是使用传感器数据来推断机器状态,并从这些传感器数据中检测出在故障发生之前存在的缺陷或故障的过程。预测性维护在所有工业领域都是一种日益增长的趋势,包括轴承故障检测、齿轮磨损检测或往复式机器中的活塞磨损等许多其他例子。在预测性维护…...
怎么控制多个存储设备的访问权限?数据安全存储方案来了
数据安全存储是指将数据以安全的方式存储在存储系统中,以确保数据的机密性、完整性和可用性。要控制数据安全存储的权限以保障安全,可以采取以下措施: 访问控制列表(ACLs):使用ACLs来定义对存储数据的访问权…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...
