下面是关于stm32驱动超声波模块的一段代码,有需要的朋友可以复制参考,希望对大家能够有所帮助和启发。

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

  }

最后在个大家提供一些stm32方面的参考资料

(stm32直流电机驱动)
http://www.makeru.com.cn/live/1392_1218.html?s=45051

(stm32 温湿度采集)
http://www.makeru.com.cn/live/detail/1476.html?s=45051
( ADC读取光照传感器)
http://www.makeru.com.cn/live/1392_1004.html?s=45051

(stm32串口应用)
http://www.makeru.com.cn/live/1392_1164.html?s=45051

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

  1. STM32—驱动GY85-IMU模块

    GY85是一个惯性测量模块,内部集成了三轴加速度计.三轴陀螺仪.电子罗盘.气压传感器等芯片,用于测量和报告设备速度.方向.重力,模块可以将加速度计.陀螺仪.电子罗盘等传感器的数据进行综合,在上位机可以 ...

  2. STM32—驱动RFID-RC522模块

    文章目录 一.S50(M1)卡介绍 1.S50(M1)卡基础知识 2.内部信息 3.存取控制 4.数据块的存取控制 5.控制块的存取控 6.工作原理 7.M1与读卡器的通信 二.RC522工程代码详解 ...

  3. STM32—驱动HC-SR04超声波测距模块

    文章目录 超声波测距原理 HC-SR04工作原理 STM32实现驱动 1.引脚的配置 2.时序控制 3.时间差测量 4.如何将距离测出来 超声波测距原理 利用HC-SR04超声波测距模块可以实现比较精 ...

  4. 关于HC04超声波模块测距的思考(51版)

    之前写过一篇HC04的使用文章,当时是使用stm32来实现的,原文链接. 后来又多次使用51来驱动这个模块,有时候有测距需要,使用了几次,总是感觉我上次那个程序不是很好, 所以这次对它进行了改进.虽然 ...

  5. 超声波手势识别(STM32四路超声波获取)

    超声波手势识别在市场上已经有见实现,但研究其传感器发现并不是市场上随意可见的,如果暂且考虑成本,该如何入门实现简单的手势识别呢.聊天中老师给出一个很好的提议,就是固定四个超声波,分别为上下左右,然后进 ...

  6. [TPYBoard - Micropython之会python就能做硬件 8] 学习使用超声波模块制作避障小车

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604   一.实验器材 1.TPYboard V102板  一块 2.电机驱动模块L2 ...

  7. STM32驱动ILI9341控制器控制TFTLCD显示

    STM32驱动ILI9341控制器控制TFTLCD显示 一.用STM32控制TFTLCD显示的编程方法,在编程驱动TFTLCD液晶显示器之前,我们先熟悉以下概念: 1.色彩深度,这是一个与TFTLCD ...

  8. AMS5601的ardunio和STM32驱动开发

    AMS5601的ardunio和STM32驱动开发 本文有麦粒电子撰写,并提供相应产品服务. 前言 目前ams关于磁编码芯片用的比较多的可能是ams5600,能够输出pwm信号,电压信号以及I2C通信 ...

  9. esp8266的STM32驱动

    esp8266的STM32驱动,数据发送接收由DMA完成,释放CPU. 目前只能发送返回消息为成功或失败的AT命令,并判断是否成功,详见esp8266_cmd():其它返回消息不可预知的命令(如查看A ...

随机推荐

  1. clion结合vcpkg以及GTest的使用

    目录 一.vcpkg简介.下载和使用 1. vcpkg是什么 2. vcpkg下载 3. 使用vcpkg下载第三方库 二.clion结合vcpkg 1. 方法一:使用环境变量 2. 方法二:添加cma ...

  2. (4)java Spring Cloud+Spring boot+mybatis企业快速开发架构之SpringCloud-Spring Cloud开发环境的准备和Lombok安装步骤

    ​ 开发环境的准备主要涉及三个方面:JDK.Maven.Spring Tools 4 for Eclipse. 1.JDK JDK 的版本用 1.8 即可,环境变量大家自行去配置.配置好环境变量,在命 ...

  3. C#中List是链表吗?为什么可以通过下标访问

    使用C#的同学对List应该并不陌生,我们不需要初始化它的大小,并且可以方便的使用Add和Remove方法执行添加和删除操作,但却可以使用下标来访问它的数据,它是我们常说的链表吗?     List& ...

  4. use关键字在PHP中的几种用法

    在学习了和使用了这么多年的PHP之后,您知道use这个关键字在PHP中都有哪些用法吗?今天我们就来看一下它的三种常见用法. 1. 用于命名空间的别名引用 // 命名空间 include 'namesp ...

  5. nuxt.js同路由跳转参数不同,mounted不执行时

    watch: { '$route'(to, from) { if (to.fullPath !== from.fullPath) { this.$nextTick(() => { // 不加th ...

  6. 腾讯云 CIF 工程效能峰会,10 月 19 - 20 日震撼来袭!

    近年来,依托于云计算的飞速发展,腾讯云云产品更新迅猛,云原生生态构建初具规模,越来越多的企业也开始寻求与深入数字化转型之路.但在摸索与实践中,企业往往会进入"伪上云"的误区.除了单 ...

  7. (转载https://segmentfault.com/a/1190000016313947)了解RestFul Api架构风格设计

    最近几年REST API越来越流行,特别是随着微服务的概念被广泛接受和应用,很多Web Service都使用了REST API. REST是HTTP规范主要编写者之一的Roy Fielding提出的, ...

  8. python日志loguru

    文档:https://loguru.readthedocs.io/en/stable/overview.html#installation pip install loguru 使用 基本使用 ##终 ...

  9. P4292-[WC2010]重建计划【长链剖分,线段树,0/1分数规划】

    正题 题目链接:https://www.luogu.com.cn/problem/P4292 题目大意 给出\(n\)个点的一棵树,然后求长度在\([L,U]\)之间的一条路径的平均权值最大. 解题思 ...

  10. Python+selenium自动化生成测试报告

    批量执行完用例后,生成的测试报告是文本形式的,不够直观,为了更好的展示测试报告,最好是生成HTML格式的. unittest里面是不能生成html格式报告的,需要导入一个第三方的模块:HTMLTest ...