下面是关于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. shell脚本———双重循环——九九乘法表

    1.基础双重循环模板 2.break跳出单个循环 3.continue中止某次循环中的命令,但不会完全中止整个命令 4.九九乘法表

  2. Map集和

    目录 Map 特点 继承树 常用方法 entrySet 方法 HashMap 特点 HashMap 的重要常量 存储结构 jdk1.8 总结 面试题 HashMap存储自定义类型键值 LinkedHa ...

  3. CodeForce-762B USB vs. PS/2(贪心)

    USB vs. PS/2 CodeForces - 762B 题意:有三种电脑,分别有a.b.c个,第一种只有USB接口,第二种只有PS/2接口,第三种有两种接口,有m个鼠标,告诉你价钱和接口类型,问 ...

  4. 用tcping检查网站开放的端口

    麦新杰之前分享过一款小巧玲珑工具软件:tcping,即在tcp层进行端口的ping. tcping可以用来检查和确认我们的网站有哪些端口是开放的,使用很顺手.比如麦新杰这几天在研究如何关闭mysql的 ...

  5. DISCUZ论坛添加页头及页尾背景图片的几种方法

    先给大家分享页头添加背景图片的两种方法:1. 第一种效果,是给discuz的整体框架添加背景图片,见图示: 添加方法如下:找到你现在使用模板common文件下的header.html文件,在<h ...

  6. Microfacet模型采样下的brdf

    本文前言 在学习图形学(games101 from bilibili)的时候,也遇到了像这样的问题,Cook-Torrance模型无法实现粗糙度为0时,物体微表面呈现绝对镜面的效果(呈现出一面镜子), ...

  7. 实时渲染基础(4)纹理(Texture)

    目录 纹理映射(Texture Mapping) 球形贴图(Spherical Map) 立方体贴图(Cube Map) 纹理走样问题 Mipmap 各向异性过滤(Ripmap) 纹理应用技术(Tex ...

  8. 使用gitlab runner进行CI(三):使用sonarqube做c++的静态检查

    目录 1. gitlab-ci.yml的配置 1.1 几个基本概念 1.2 使用CI进行代码检查demo 2. Sonarqube安装和配置 2.1 Sonarqube安装 2.2 数据库配置 2.3 ...

  9. vue组件的生命周期详解

    1.生命周期&生命周期函数 生命周期:指一个组件从创建->运行->销毁的整个阶段,强调的是一个时间段. 生命周期函数:由vue框架提供的内置函数,会伴随着组件的生命周期,自动按序执 ...

  10. 打开属性页,分别在Debug和Release下将其配置类型改为:静态库(.lib);

    右键工程->属性 配置类型里面的下拉菜单选择静态库