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

  1.   #define HCSR04_PORT GPIOB
  2.  
  3.   #define HCSR04_CLK RCC_APB2Periph_GPIOB
  4.  
  5.   #define HCSR04_TRIG GPIO_Pin_8
  6.  
  7.   #define HCSR04_ECHO GPIO_Pin_9
  8.  
  9.   #define TRIG_Send(n) do{
  10.  
  11.   if(n == 0)
  12.  
  13.   GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);
  14.  
  15.   else if(n == 1)
  16.  
  17.   GPIO_SetBits(HCSR04_PORT,HCSR04_TRIG);
  18.  
  19.   }while(0)
  20.  
  21.   #define ECHO_Reci GPIO_ReadInputDataBit(GPIOB,HCSR04_ECHO)
  22.  
  23.   void UltrasonicInit(void)
  24.  
  25.   {
  26.  
  27.   GPIO_InitTypeDef GPIO_InitStructure;
  28.  
  29.   RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);
  30.  
  31.   //IO初始化
  32.  
  33.   GPIO_InitStructure.GPIO_Pin = HCSR04_TRIG; //发送电平引脚
  34.  
  35.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  36.  
  37.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
  38.  
  39.   GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
  40.  
  41.   GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);
  42.  
  43.   GPIO_InitStructure.GPIO_Pin = HCSR04_ECHO; //返回电平引脚
  44.  
  45.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  46.  
  47.   GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
  48.  
  49.   GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);
  50.  
  51.   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //生成用于定时器设置的结构体
  52.  
  53.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //使能对应RCC时钟
  54.  
  55.   //配置定时器基础结构体
  56.  
  57.   TIM_DeInit(TIM6);
  58.  
  59.   TIM_TimeBaseStructure.TIM_Period = (1000-1); //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到1000为1ms
  60.  
  61.   TIM_TimeBaseStructure.TIM_Prescaler =(72-1); //设置用来作为TIMx时钟频率除数的预分频值 1M的计数频率 1US计数
  62.  
  63.   TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//不分频
  64.  
  65.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  66.  
  67.   TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  68.  
  69.   TIM_ClearFlag(TIM6, TIM_FLAG_Update); //清除更新中断,免得一打开中断立即产生中断
  70.  
  71.   TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); //打开定时器更新中断
  72.  
  73.   NVIC_InitTypeDef NVIC_InitStructure;
  74.  
  75.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  76.  
  77.   NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn; //选择串口1中断
  78.  
  79.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占式中断优先级设置为1
  80.  
  81.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应式中断优先级设置为1
  82.  
  83.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断
  84.  
  85.   NVIC_Init(&NVIC_InitStructure);
  86.  
  87.   TIM_Cmd(TIM6,DISABLE);
  88.  
  89.   }
  90.  
  91.   //定时器6中断服务程序
  92.  
  93.   u32 msHcCount = 0;
  94.  
  95.   void TIM6_IRQHandler(void) //TIM6中断
  96.  
  97.   {
  98.  
  99.   if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
  100.  
  101.   {
  102.  
  103.   TIM_ClearITPendingBit(TIM6, TIM_IT_Update); //清除TIMx更新中断标志
  104.  
  105.   msHcCount++;
  106.  
  107.   }
  108.  
  109.   }
  110.  
  111.   static void OpenTimerForHc() //打开定时器
  112.  
  113.   {
  114.  
  115.   TIM_SetCounter(TIM6,0); //清除计数
  116.  
  117.   msHcCount = 0;
  118.  
  119.   TIM_Cmd(TIM6, ENABLE); //使能TIMx外设
  120.  
  121.   }
  122.  
  123.   static void CloseTimerForHc() //关闭定时器
  124.  
  125.   {
  126.  
  127.   TIM_Cmd(TIM6, DISABLE); //使能TIMx外设
  128.  
  129.   }
  130.  
  131.   //获取定时器时间
  132.  
  133.   u32 GetEchoTimer(void)
  134.  
  135.   {
  136.  
  137.   u32 t = 0;
  138.  
  139.   t = msHcCount*1000; //将MS转换成US
  140.  
  141.   t += TIM_GetCounter(TIM6); //得到总的US
  142.  
  143.   TIM6->CNT = 0; //将TIM6计数寄存器的计数值清零
  144.  
  145.   return t;
  146.  
  147.   }
  148.  
  149.   //一次获取超声波测距数据 两次测距之间需要相隔一段时间,隔断回响信号
  150.  
  151.   //为了消除余震的影响,取五次数据的平均值进行加权滤波。
  152.  
  153.   float Hcsr04GetLength(void )
  154.  
  155.   {
  156.  
  157.   u32 t = 0;
  158.  
  159.   int i = 0;
  160.  
  161.   float lengthTemp = 0;
  162.  
  163.   float sum = 0;
  164.  
  165.   while(i!=5)
  166.  
  167.   {
  168.  
  169.   /*发送一个20ms的脉冲*/
  170.  
  171.   TRIG_Send(1);
  172.  
  173.   osDelay(20);
  174.  
  175.   TRIG_Send(0);
  176.  
  177.   while(ECHO_Reci == 0); //等待接收口高电平输出(超声波发出)
  178.  
  179.   OpenTimerForHc(); //打开定时器
  180.  
  181.   while(ECHO_Reci == 1); //等待超声波返回
  182.  
  183.   CloseTimerForHc(); //关闭定时器
  184.  
  185.   t = GetEchoTimer(); //获取时间,分辨率为1US
  186.  
  187.   lengthTemp = ((float)t*17/1000.0);//cm
  188.  
  189.   sum = lengthTemp + sum ;
  190.  
  191.   i = i + 1;
  192.  
  193.   }
  194.  
  195.   lengthTemp = sum/5.0;
  196.  
  197.   return lengthTemp;
  198.  
  199.   }

最后在个大家提供一些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. 常量&&变量

    一.常量:程序运行期间不变 常量使用: 二.八大基本数据类型变量: 其中,一个Byte类型数据占八个bit位,所以范围是(-2^7 ~ 2^7-1),数据最小的存储单位,是四分之一的int类型空间,所 ...

  2. 【MyBatis】几种批量插入效率的比较

    批处理数据主要有三种方式: 反复执行单条插入语句 foreach 拼接 sql 批处理 一.前期准备 基于Spring Boot + Mysql,同时为了省略get/set,使用了lombok,详见p ...

  3. oracle table()函数

    PL/SQL表---table()函数用法/* PL/SQL表---table()函数用法:利用table()函数,我们可以将PL/SQL返回的结果集代替table. oracle内存表在查询和报表的 ...

  4. Docker容器基本命令注意点

    Docker 容器基本命令注意点 前言: a. 本文主要为 Docker的视频教程 笔记. b. 本机环境为 Windows 10 专业版,使用的命令行为 PowerShell. 1. docker ...

  5. 215 day01_Object类、常用API

    day01[Object类.常用API] 主要内容 Object类 Date类 DateFormat类 Calendar类 System类 StringBuilder类 包装类 教学目标 -[ ] 能 ...

  6. shell 基本语法介绍

    一.介绍 shell 是属于弱类型语言,指的是在定义变量时不需要指定变量的类型,就如python也是弱类型语言.一般以: :.sh结尾的文件 :文件第一行固定为:#!/bin/bash,表示指定以sh ...

  7. P4258-[WC2016]挑战NPC【带花树】

    正题 题目链接:https://www.luogu.com.cn/problem/P4258 题目大意 给出\(n\)个球,\(m\)个篮筐,每个球都可以被放入一些特定的篮筐,每个球都要放,要求球的个 ...

  8. [USACO10NOV]Buying Feed G

    part 1 暴力 不难发现有一个 $\mathcal O(K^2n)$ 的基础 dp: $$f_{i,j+l}=\min(f_{i,j+l},f_{i-1,j}+(x_i-x_{i-1})jj+c_ ...

  9. 微服务Cloud整体聚合工程创建过程

    1.父工程创建及使用 使用idea开发工具,选择File-new- project ,在选项中选择Maven工程,选择jdk版本1.8,勾选maven-archetype-site,点击next,输入 ...

  10. 测试开发【提测平台】分享12-掌握日期组件&列表状态格式化最终实现提测管理多条件搜索展示功能

    微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 本章内容思维导图如下,由于需要各种状态下的菜单操作,所以需要先实现提测信息的列表基础页面,然后再推进其他需求开发 基本知识点学习 Date ...