下面是关于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. [第十二篇]——Docker Dockerfile之Spring Cloud直播商城 b2b2c电子商务技术总结

    Docker Dockerfile 什么是 Dockerfile? Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明. 使用 Dockerfile 定制 ...

  2. 删除数组中指定的元素,然后将后面的元素向前移动一位,将最后一位设置为NULL 。 String[] strs={“aaa”,”ccc”,”ddd”,”eee”,”fff”,”ggg”}; 指定删除字符串“ccc”,把后的元素依次向前移动!!!

    public static void main(String[] args) { int temp = -1; String[] strs = {"aaa", "ccc& ...

  3. Maven专题4——Maven测试

    Java世界的主流测试框架是JUnit和TestNG,Maven在构建执行到特定生命周期阶段的时候,通过插件执行JUnit和TestNG的测试用例. Maven执行测试的插件是maven-surefi ...

  4. Java Web实现登录验证码(Servlet+jsp)

    1.生成验证码图片(Servlet) import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import j ...

  5. 学习PHP中的信息格式化操作

    在国际化组件的学习过程中,我们已经接触过了 NumberFormatter 这种数字的格式化操作,它可以让我们将数字转换成标准格式.货币.本地语言等形式.今天我们来学习的是另一种专门用于信息格式化的类 ...

  6. Linux系列(22) - 用户登录查看命令

    需求 查看当前在线用户情况:历史用户登录情况 W 格式 [root@localhost ~]# w:查看所有登录用户信息 [root@localhost ~]# w [用户名]:查看指定登录用户信息 ...

  7. 你会阅读appium官网文档吗

    高效学习appium第一步,学会查看appium官方文档.如果能把appium文档都通读一遍,对学习appium大有益处. 而能做到通读appium官方文档的人,想必不是很多,刚开始学习appium的 ...

  8. python之jsonpath

    json 官方文档:http://docs.python.org/library/json.html JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使 ...

  9. 鸿蒙内核源码分析(进程概念篇) | 进程在管理哪些资源 | 百篇博客分析OpenHarmony源码 | v24.01

    百篇博客系列篇.本篇为: v24.xx 鸿蒙内核源码分析(进程概念篇) | 进程在管理哪些资源 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管理内 ...

  10. 鸿蒙内核源码分析(物理内存篇) | 怎么管理物理内存 | 百篇博客分析OpenHarmony源码 | v17.01

    百篇博客系列篇.本篇为: v17.xx 鸿蒙内核源码分析(物理内存篇) | 怎么管理物理内存 | 51.c.h .o 内存管理相关篇为: v11.xx 鸿蒙内核源码分析(内存分配篇) | 内存有哪些分 ...