stm32驱动超声波模块

2023-10-27


#define HCSR04_PORT   GPIOB
#define HCSR04_CLK    RCC_APB2Periph_GPIOB
#define HCSR04_TRIG   GPIO_Pin_8
#define HCSR04_ECHO   GPIO_Pin_9
#define TRIG_Send(n)  do{                \
if(n == 0)       \
GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);\
else if(n == 1)  \
GPIO_SetBits(HCSR04_PORT,HCSR04_TRIG);  \
}while(0) 


#define ECHO_Reci     GPIO_ReadInputDataBit(GPIOB,HCSR04_ECHO)


void UltrasonicInit(void)
{


GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(HCSR04_CLK, 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_IN_FLOATING;//浮空输入
GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);  
GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);   


TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;     //生成用于定时器设置的结构体
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);   //使能对应RCC时钟

//配置定时器基础结构体
TIM_DeInit(TIM6);
TIM_TimeBaseStructure.TIM_Period = (1000-1);          //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         计数到1000为1ms
TIM_TimeBaseStructure.TIM_Prescaler =(72-1);          //设置用来作为TIMx时钟频率除数的预分频值  1M的计数频率 1US计数
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);       //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位         


TIM_ClearFlag(TIM6, TIM_FLAG_Update);                 //清除更新中断,免得一打开中断立即产生中断
TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);              //打开定时器更新中断
  

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;            //选择串口1中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //抢占式中断优先级设置为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         //响应式中断优先级设置为1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //使能中断
NVIC_Init(&NVIC_InitStructure);

TIM_Cmd(TIM6,DISABLE);
}


//定时器6中断服务程序
u32 msHcCount = 0;
void TIM6_IRQHandler(void)   //TIM6中断
{
if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
{
TIM_ClearITPendingBit(TIM6, TIM_IT_Update);       //清除TIMx更新中断标志 
msHcCount++;
}
}


static void OpenTimerForHc()    //打开定时器
{
TIM_SetCounter(TIM6,0);      //清除计数
msHcCount = 0;
TIM_Cmd(TIM6, ENABLE);       //使能TIMx外设
}
 
static void CloseTimerForHc()  //关闭定时器
{
TIM_Cmd(TIM6, DISABLE);      //使能TIMx外设
}


//获取定时器时间
u32 GetEchoTimer(void)
{
u32 t = 0;
t = msHcCount*1000;                  //将MS转换成US
t += TIM_GetCounter(TIM6);           //得到总的US
TIM6->CNT = 0;                       //将TIM6计数寄存器的计数值清零
return t;
}


//一次获取超声波测距数据 两次测距之间需要相隔一段时间,隔断回响信号
//为了消除余震的影响,取五次数据的平均值进行加权滤波。
float Hcsr04GetLength(void )
{

u32 t = 0;
int i = 0;
float lengthTemp = 0;
float sum = 0;


while(i!=5)
{
/*发送一个20ms的脉冲*/
TRIG_Send(1);             
osDelay(20);
TRIG_Send(0);

while(ECHO_Reci == 0);     //等待接收口高电平输出(超声波发出)
OpenTimerForHc();          //打开定时器
while(ECHO_Reci == 1);     //等待超声波返回
CloseTimerForHc();         //关闭定时器
t = GetEchoTimer();        //获取时间,分辨率为1US
lengthTemp = ((float)t*17/1000.0);//cm
sum = lengthTemp + sum ;
 i = i + 1;
  }

lengthTemp = sum/5.0;
return lengthTemp;


}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stm32驱动超声波模块 的相关文章

  • 如何更改闪存的起始地址?

    我正在使用 STM32F746ZG 和 FreeRTOS Flash的起始地址是0x08000000 但我想把它改成0x08040000 我通过谷歌搜索了这个问题 但没有找到解决方案 我更改了链接器脚本 如下所示 MEMORY RAM xr
  • STM32 F072上的软件如何跳转到bootloader(DFU模式)?

    STM32应用笔记2606对此进行了讨论 但没有简单的代码示例 该答案已使用 IAR EWARM 在 STM32F072 Nucleo 板上进行了测试 这个答案使用 STM32标准外设库 仅此而已 请注意 验证您是否成功进入引导加载程序模式
  • CMSIS 库是否应该包含在版本控制中? [复制]

    这个问题在这里已经有答案了 通常 我曾经在版本控制中包含芯片供应商 ST 提供的设备特定标头和源以及 CMSIS Core 标头 数量不多 也没有更新的习惯 我使用STM32微控制器 但我不使用立方体框架 or the 标准外设库 最近 我
  • 139-基于stm32单片机老人居家监护报警系统Proteus仿真+源程序

    资料编号 139 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 MQ4传感器 电位器模拟 MQ2传感器 电位器模拟 蜂鸣器 电机 制作一个基于stm32单片机老人居家监护报警系统Proteus仿真 2 通过MQ2传
  • 133-基于stm32单片机停车场车位管理系统Proteus仿真+源程序

    资料编号 133 一 功能介绍 1 采用stm32单片机 4位数码管 独立按键 制作一个基于stm32单片机停车场车位管理系统Proteus仿真 2 通过按键进行模拟车辆进出 并且通过程序计算出当前的剩余车位数量 3 将剩余的车位数量显示到
  • 136-基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真+源程序

    资料编号 136 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 蜂鸣器 制作一个基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真 2 通过DHT11传感器检测当前温湿度 并且显示到L
  • 135-基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真+源程序

    资料编号 135 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 电机 超声波传感器 制作一个基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真 2 通过DHT11传感器检测当前
  • HAL库学习

    CMSIS简介 CMSIS Cortex Microcontroller Software Interface Standard 微控制器软件接口标准 由ARM和其合作的芯片厂商 ST NXP 软件工具厂商 KEIL IAR 共同制定的标准
  • HAL 锁定和解锁函数如何使用以及为什么?

    我试图理解另一位程序员编写的代码 它使用了I C http en wikipedia org wiki I C2 B2C通信以将数据写入 STM32 微控制器的 EEPROM 一般来说 我理解他的代码是如何工作的 但我不明白他为什么使用HA
  • 擦除后无法写入闪存

    所以我不能在擦除后直接写入内部闪存 如果写操作之前没有擦除操作 那么我可以 有什么想法吗 编程函数返回 成功写入 值 但查看内存时 没有写入任何数据 这是代码 uint32 t pageAddress 0x08008000 uint16 t
  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • 库函数点亮Led

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智能的不断发展 机器学习这门
  • 特殊寄存器

    特殊寄存器 文章目录 前言 一 背景 二 2 1 2 2 总结 前言 前期疑问 STM32特殊寄存器到底是什么 特殊寄存器怎么查看和调试代码 本文目标 记录和理解特殊寄存器 一 背景 最近在看ucosIII文章是 里面提到特殊寄存器 这就进
  • systick定时器

    systick定时器 文章目录 前言 一 前期疑惑 二 解答 1 关于systick是阻塞的吗 2 非阻塞 三 软件编写 总结 前言 这边记录systick相关知识点 一 前期疑惑 在学习systick志气啊 其实对于systick还是一脸
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • 从没有中断引脚并且在测量准备好之前需要一些时间的传感器读取数据的最佳方法

    我正在尝试将压力传感器 MS5803 14BA 与我的板 NUCLEO STM32L073RZ 连接 根据 第 3 页 压力传感器需要几毫秒才能准备好读取测量值 对于我的项目 我对需要大约 10 毫秒来转换原始数据的最高分辨率感兴趣 不幸的
  • 通过JTAG恢复STM32 MCU磨掉的标记

    我有一块可能带有 STM32 MCU 的板 我想为该板制作定制固件 因为库存板有很多问题 不幸的是 电路板制造商很友善地磨掉了所有标记 有没有办法通过 jtag 获取设备 系列 ID 并将其交叉引用到型号 我能找到的一切都是关于获取芯片的唯
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • 读取STM32 MCU SPI数据寄存器的值

    有很多类似的问题 但似乎没有一个问题完全相同 我正在将 STML4 MCU 连接到 6 轴传感器 LSM6DS3 我已经成功地在 I2C 中实现了所有内容 但想要 SPI 的额外速度 和 DMA 如果我能让这些第一步工作起来的话 因此 第一

随机推荐

  • 项目打包工具使用教程(innosetup)

    夏季小学期的时候用VS2015敲了一个关于WinForm的项目 和C 类似 项目完成之后想把它发布成一个可以在win10系统里直接的程序 而且最好有和我们平时安装软件一样 一步步选择 效果图 首先下载innosetup 网址 https p
  • 转载:MATLAB R2018b 安装教程

    MATLAB R2018b 安装教程 LegendLYC 2019 03 26 22 21 50 46687 收藏 116 分类专栏 安装教程 div class div
  • Java实现:猴子吃桃问题

    Java实现 猴子吃桃问题 文章目录 Java实现 猴子吃桃问题 1 问题 2 解决方案 3 实现代码 4 执行结果 5 解决方法说明 穷举法 1 问题 猴子吃桃问题 有一只猴子第一天摘下若干个桃子 当即吃掉了一半 又多吃了一个 第二天又将
  • TypeError:__init__() got an unexpected keyword argument 'xxx'

    如上图所示 出现此类问题通常是打错了一些英文
  • 浙大PAT 2-13. 两个有序序列的中位数 (解题思路)

    2 13 两个有序序列的中位数 时间限制 40 ms 内存限制 32000 kB 代码长度限制 8000 B 判题程序 Standard 已知有两个等长的非降序序列S1 S2 设计函数求S1与S2并集的中位数 有序序列A0 A1 AN 1的
  • 关于如何自定义docker的网络网段

    在修改docker的网段前 请务必关闭所有正在运行中的容器 编辑文件 etc docker daemon json 如果没有则需要创建 cat daemon json default address pools base 172 40 0
  • Powershell - 环境设置

    PowerShell 图标可以在任务栏和开始菜单中找到 只需点击图标 它就会打开 要打开它 只需单击图标 然后将打开以下屏幕 这意味着 PowerShell 已准备好供你使用 PowerShell 版本 最新版本的 PowerShell 是
  • JDK多版本配置及切换版本不生效问题解决

    一 准备工作 首先你要有多个版本的jdk 如果没有请移至 https www oracle com java technologies downloads 下载 具体下载方法可参考 Java同学入职环境安装全讲解 二 配置环境变量 在环境变
  • es6 实现数组的操作

    1 实现数组的去重 1 1 方法一 let arr id 1 name aa id 2 name bb id 3 name cc id 4 name dd id 5 name ee id 1 name aa id 1 name aa id
  • 医疗产业数字化转型现况及方向

    报告以医疗产业的各种应用场景为切入点 分析不同场景下数字化转型程度和路径 通过对医疗产业数字化整体发展现况的解析 探讨医疗产业链中数字化场景应用所带来的机遇及相应挑战 基于已描绘的医疗产业链数字化转型图谱 挖掘在医疗数字化转型浪潮中做出突出
  • 被问 Linux 命令 su 和 sudo 的区别?当场蒙了!

    tanjuntao github io 之前一直对 su 和 sudo 这两个命令犯迷糊 最近专门搜了这方面的资料 总算是把两者的关系以及用法搞清楚了 这篇文章来系统总结一下 1 准备工作 因为本篇博客中涉及到用户切换 所以我需要提前准备好
  • idea插件生成dao类service类controller类以及mapper.xml

    idea插件生成dao类service类controller类以及mapper xml 安装插件Easycode和MybatisX 不用自己写代码 1 Files Settings Plugins 分别搜索Easycode和MybatisX
  • Redis 持久化之 RDB 与 AOF 详解

    Redis 持久化 我们知道Redis的数据是全部存储在内存中的 如果机器突然GG 那么数据就会全部丢失 因此需要有持久化机制来保证数据不会因为宕机而丢失 Redis 为我们提供了两种持久化方案 一种是基于快照 另外一种是基于 AOF 日志
  • Mysql Group Replication 简介及单主模式组复制配置

    一 Mysql Group Replication简介 Mysql Group Replication MGR 是一个全新的高可用和高扩张的MySQL集群服务 高一致性 基于原生复制及paxos协议的组复制技术 以插件方式提供一致数据安全保
  • 在使用命令行环境下Scala读取输入内容时,输入内容不显示问题(未解决)

    在使用命令行环境下Scala读取输入内容时 输入内容不显示问题 如下图 使用键盘输入任意内容但是命令行没有显示任何内容 但是内容又是可以输出的 怀疑是被默认隐藏了 输出结果是如此 我不知道这是本来就这样还是我自己的问题 希望能有大佬可以答疑
  • 前台商品列表接口

    前台商品列表接口 搜索功能 1 入参判空 2 加 通配符 3 sql语句like关键字 平铺展示该商品类别及其子类别下的所有商品 排序功能 测试 查询 排序 按照类别展示该类别和他子类别下的所有商品 查询类别3和他所有子类别的商品 cont
  • 带你搞懂 Redis 中的两个策略

    面试的时候问到候选人 Redis 相关问题时 发现一个现象 一部分候选人分不清 Redis 的 键过期策略 和 内存淘汰策略 今天就来说一说这老哥俩 简单来说 过期策略就是当 key 到了指定的过期时间后 Redis 是用什么方式将其删除的
  • Python+Vue计算机毕业设计火灾与警情统计系统24b58(源码+程序+LW+部署)

    该项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 项目运行环境配置 Python3 7 7 Django Mysql5 7 pip list HBuilderX Vscode也行 Vue Pychram社区版 项目技术 Dja
  • 10分钟教你掌握BigQuery语法

    BigQuery 以下简称BQ 的CRUD操作都可以通过SQL指令來完成 Create SQL INSERT statement Read SQL SELETE statement Update SQL UPDATE MERGE 虽然Big
  • stm32驱动超声波模块

    define HCSR04 PORT GPIOB define HCSR04 CLK RCC APB2Periph GPIOB define HCSR04 TRIG GPIO Pin 8 define HCSR04 ECHO GPIO Pi