本文介绍制作过程中用到的 HC-SR04 模块

实物图片

电气参数

工作原理

  1. 采用 IO 触发测距,给至少 10us 的高电平信号;
  2. 模块自动发送 8 个 40KHz 的方波,自动检测是否有信号返回;
  3. 有信号返回,通过 I0 输出一高电平,高电平持续的时间就是
  4. 超声波从发射到返回的时间,测试距离 = ( 高电平时间*声速 ) / 2;

与单片机连接

Vcc -> 5V
Trig -> PB8
Echo -> PB8
Gnd -> G

程序部分

HC-SR04.h

#ifndef __HCSR04_H
#define __HCSR04_H#include <stm32f10x.h>
#include <delay.h>// 硬件连接不同可在此处修改
#define HCSR04_PORT        GPIOB
#define HCSR04_CLK     RCC_APB2Periph_GPIOB
#define HCSR04_TRIG        GPIO_Pin_8
#define HCSR04_ECHO        GPIO_Pin_7#define uint unsigned int
void HC_SR04_Init(void);
float Count_Dist(void);#endif /*__HCSR04_H*/

HC-SR04.c

#include <HC-SR04.h>//1.采用 IO 触发测距,给至少 10us 的高电平信号;
//2.模块自动发送 8 个 40KHz 的方波,自动检测是否有信号返回;
//3.有信号返回,通过 I0 输出一高电平,高电平持续的时间就是
//4.超声波从发射到返回的时间,测试距离 = ( 高电平时间*声速 ) / 2;//记录定时器溢出次数
uint count = 0;//设置中断优先级
void NVIC_Config(void){NVIC_InitTypeDef NVIC_InitStructer;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructer.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructer.NVIC_IRQChannelSubPriority = 0;   NVIC_InitStructer.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructer.NVIC_IRQChannel = TIM2_IRQn;NVIC_Init(&NVIC_InitStructer);}/*初始化HC-SR04的GPIO以及定时器TIM2*/
void HC_SR04_Init(void){GPIO_InitTypeDef GPIO_InitStructer;TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructer;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);/*TRIG 触发信号 PB8*/GPIO_InitStructer.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructer.GPIO_Mode = GPIO_Mode_Out_PP;  //设置为推挽输出GPIO_InitStructer.GPIO_Pin = HCSR04_TRIG;GPIO_Init(HCSR04_PORT, &GPIO_InitStructer);/*ECOH 回响信号 PB7*/GPIO_InitStructer.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //设置为浮空输入GPIO_InitStructer.GPIO_Pin = HCSR04_ECHO;GPIO_Init(HCSR04_PORT, &GPIO_InitStructer);/*定时器 TIM2 初始化*/TIM_DeInit(TIM2);TIM_TimeBaseInitStructer.TIM_Period = 999;  //定时周期为1000TIM_TimeBaseInitStructer.TIM_Prescaler = 71;  //分频系数72TIM_TimeBaseInitStructer.TIM_ClockDivision = TIM_CKD_DIV1;  //不分频TIM_TimeBaseInitStructer.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructer);TIM_ClearFlag(TIM2, TIM_FLAG_Update);  // Clears the TIMx's pending flags.TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);  // Enables or disables the specified TIM interrupts.NVIC_Config();TIM_Cmd(TIM2, DISABLE);  //关闭定时器使能}float Count_Dist(void){float distance = 0, sum = 0;uint16_t time;uint i = 0;delay_init();  //在 delay.h 中while(i < 5){GPIO_SetBits(HCSR04_PORT, HCSR04_TRIG);delay_us(20);GPIO_ResetBits(HCSR04_PORT, HCSR04_TRIG);while(GPIO_ReadInputDataBit(HCSR04_PORT, HCSR04_ECHO) == 0);TIM_Cmd(TIM2, ENABLE);  //打开定时器i += 1;while(GPIO_ReadInputDataBit(HCSR04_PORT, HCSR04_ECHO) == 1);  //回响信号消失TIM_Cmd(TIM2,DISABLE);  //关闭定时器time = TIM_GetCounter(TIM2);  //获取 TIM2 计数值distance = (time + count*1000)/58.0;  //通过回响信号计算距离sum = distance + sum;  //将五次结果相加TIM2->CNT = 0;  //将TIM2计数寄存器的计数值清零count = 0;  //中断溢出次数清零delay_ms(10);}       distance = sum/5;  //取5次的平均值return distance;
}void TIM2_IRQHandler(void) {  //中断函数if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET) {TIM_ClearITPendingBit(TIM2, TIM_IT_Update);  //清除中断标志count++;}
}

代码讲解

关于distance = (time + count*1000)/58.0;

这个我最开始也没有搞懂,后来认真想了下明白了:声音在空气中的传播速度约为 343m/s,也就是 34300cm/s. 又因为 1s = 1000000us,可以得到声音的传播速度是 0.0343cm/us. 所以我们可以得到声音传播 1cm 所需要的时间约为 29.154us. 我们设接收到的时间为 n(us),是两倍的时间,那单程的时间就是 n/2(us). 就可以得到单程距离是 n/(2*29.154) = n/58.3 也就是我们用来计算的公式。

文章相关

上一篇:STM32 避障小车 —— L298N
下一篇:STM32 避障小车 —— SG90

STM32 避障小车 —— HC-SR04相关推荐

  1. stm32捕获占空比_基于STM32超声波避障小车

    不管是对于初学者还是对于一个玩过单片机的电子爱好者来说,或多或少都接触到过小车项目,今天给大家介绍的的一个项目基于STM32超声波避障小车.这也是我曾经的一个课设,在此开源分享给大家,全文5000多字 ...

  2. STM32蓝牙控制循迹避障小车——2.循迹模块

    STM32蓝牙控制循迹避障小车源代码--2.循迹模块 注意-所需模块: 接线:四个循迹模块(从左到右分别为1,2,3,4) B4–第1个循迹模块的D0 B5–第2个循迹模块的D0 B6–第3个循迹模块 ...

  3. STM32蓝牙控制循迹避障小车源代码——4.蓝牙控制

    STM32蓝牙控制循迹避障小车源代码--4.蓝牙控制 注意-所需模块: 蓝牙模块 接线: 串口通信 A2–RX A3–TX 所有的代码都是直接从工程里面复制的,实测是没有问题的. 蓝牙控制原理: 设计 ...

  4. STM32蓝牙控制循迹避障小车源代码——3.舵机、超声波测距模块

    STM32蓝牙控制循迹避障小车源代码--3.舵机.超声波测距模块 注意-所需模块: US-015超声波模块 SG90舵机云台 接线:舵机超声波: A1–P2.7 B8–Trig B9–Echo 代码 ...

  5. 基于STM32三路超声波避障小车

    基于STM32的避障小车 最近几天的学习了STM32输入捕获输入捕获的相关知识,为了巩固自己学习的知识特意制作一辆有三个超声波组成的4轮避障小车来加深对输入捕获的理解. 1.输入捕获简介 输入捕获模式 ...

  6. STM32循迹避障小车制作代码详解(简单实现版)

    感谢几年来大家的支持,看到大家对工程的呼声很高,所以来把工程上传了,大家自行下载即可哈,谢谢大家支持 这个代码是进阶版的,就是可以跑的很快的,和上面博客的主要区别就是这个代码的避障机制并不是做在主ma ...

  7. 基于STM32的智能循迹避障小车实验(小车运动部分)

    写在前面 这个实验是关于智能小车的实验,现在的想法就是先做出一个循迹和避障功能,后续可能会再添加一些其他的模块. 我在做这个实验之前基本了解了F1系列开发板的大部分模块,如果没有学习之前的模块,建议先 ...

  8. STM32蓝牙控制循迹避障小车源代码——5.最终程序

    STM32蓝牙控制循迹避障小车源代码--5.最终程序 将前面4讲的内容整合一起.主函数里用switch函数或者if语句来判断接收到的数据,改变小车的运动. 注意要将控制循迹和避障的参数单独定义一个.否 ...

  9. 基于STM32红外避障小车的设计(有代码)

    什么是避障小车 用红外光电传感器,探测到物体即输出脉冲,输入到单片机中处 理一下,再对电机驱动模块进行控制,实现壁障的功能,这样的避障小车又称为简单的避障机器人. 各种避障方法: 1.红外线避障 2. ...

  10. 利用52单片机制作的超声波避障小车(包含所有源码)

    做这个超声波避障小车的原因是因为单片机课程设计 一.硬件部分 1.电机驱动 电机驱动四个输入端IN1.IN2.IN3和IN4,四个输出端OUT1.OUT2.OUT3和OUT4,一个接地端GND,单片机 ...

最新文章

  1. thymeleaf rs 查询结果_第十一章 JDBC与MySQL数据库(10)——通用查询
  2. mysql数据库latin1转utf8_三种转换Mysql数据库数据编码的窍门-latin1转utf8
  3. amp 调用链_调用链选型之Zipkin,Pinpoint,SkyWalking,CAT
  4. python函数格式化_Python通过format函数格式化显示值
  5. 【Oracle】ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
  6. python手机版-python做app
  7. 安装天文软件karma和设置环境变量---conda安装和环境变量设置
  8. 2018暑假第二周总结(7.16-7.22)
  9. c语言课程设计学生成绩管理系统作业,C语言学生成绩管理系统课程设计word版
  10. jacob word另存为
  11. Linux中常见的ping不通百度问题
  12. 计算机上机考试可以粘贴复制吗,急!高会无纸化考试打字慢 该如何复制粘贴?...
  13. 从战略到执行:业务领先模型 BLM 的第一把钥匙「差距分析」
  14. R-squared 和 Adjusted R-squared联系与区别
  15. GooglePlay内购接入错误Google Play In-app Billing API version is less than 3
  16. 基于java的驾校驾照在线考试系统-计算机毕业设计
  17. 十大最赚钱增值业务排行榜
  18. Echarts + Web实现大屏展示效果
  19. 实习周记(第三周):忙碌
  20. C++11多线程:thread头文件

热门文章

  1. 经典c语言笔试题及答案,C语言经典笔试题
  2. 偏向锁理论太抽象,实战了解下偏向锁如何发生以及如何升级【实战篇】
  3. python 执行dos命令_对python中执行DOS命令的3种方法总结
  4. 如何制作离线tts?
  5. kettle-连接mysql数据库
  6. 加密狗破解教程-数据抓取工具
  7. 《社会调查数据管理——基于Stata 14管理CGSS数据》一3.5 中国综合社会调查
  8. 管道读写报错121:信号灯超时时间已到
  9. oracle密码过期处理方法
  10. Android系统编译原理