STM32 避障小车 —— HC-SR04
本文介绍制作过程中用到的 HC-SR04 模块
实物图片
电气参数
工作原理
- 采用 IO 触发测距,给至少 10us 的高电平信号;
- 模块自动发送 8 个 40KHz 的方波,自动检测是否有信号返回;
- 有信号返回,通过 I0 输出一高电平,高电平持续的时间就是
- 超声波从发射到返回的时间,测试距离 = ( 高电平时间*声速 ) / 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相关推荐
- stm32捕获占空比_基于STM32超声波避障小车
不管是对于初学者还是对于一个玩过单片机的电子爱好者来说,或多或少都接触到过小车项目,今天给大家介绍的的一个项目基于STM32超声波避障小车.这也是我曾经的一个课设,在此开源分享给大家,全文5000多字 ...
- STM32蓝牙控制循迹避障小车——2.循迹模块
STM32蓝牙控制循迹避障小车源代码--2.循迹模块 注意-所需模块: 接线:四个循迹模块(从左到右分别为1,2,3,4) B4–第1个循迹模块的D0 B5–第2个循迹模块的D0 B6–第3个循迹模块 ...
- STM32蓝牙控制循迹避障小车源代码——4.蓝牙控制
STM32蓝牙控制循迹避障小车源代码--4.蓝牙控制 注意-所需模块: 蓝牙模块 接线: 串口通信 A2–RX A3–TX 所有的代码都是直接从工程里面复制的,实测是没有问题的. 蓝牙控制原理: 设计 ...
- STM32蓝牙控制循迹避障小车源代码——3.舵机、超声波测距模块
STM32蓝牙控制循迹避障小车源代码--3.舵机.超声波测距模块 注意-所需模块: US-015超声波模块 SG90舵机云台 接线:舵机超声波: A1–P2.7 B8–Trig B9–Echo 代码 ...
- 基于STM32三路超声波避障小车
基于STM32的避障小车 最近几天的学习了STM32输入捕获输入捕获的相关知识,为了巩固自己学习的知识特意制作一辆有三个超声波组成的4轮避障小车来加深对输入捕获的理解. 1.输入捕获简介 输入捕获模式 ...
- STM32循迹避障小车制作代码详解(简单实现版)
感谢几年来大家的支持,看到大家对工程的呼声很高,所以来把工程上传了,大家自行下载即可哈,谢谢大家支持 这个代码是进阶版的,就是可以跑的很快的,和上面博客的主要区别就是这个代码的避障机制并不是做在主ma ...
- 基于STM32的智能循迹避障小车实验(小车运动部分)
写在前面 这个实验是关于智能小车的实验,现在的想法就是先做出一个循迹和避障功能,后续可能会再添加一些其他的模块. 我在做这个实验之前基本了解了F1系列开发板的大部分模块,如果没有学习之前的模块,建议先 ...
- STM32蓝牙控制循迹避障小车源代码——5.最终程序
STM32蓝牙控制循迹避障小车源代码--5.最终程序 将前面4讲的内容整合一起.主函数里用switch函数或者if语句来判断接收到的数据,改变小车的运动. 注意要将控制循迹和避障的参数单独定义一个.否 ...
- 基于STM32红外避障小车的设计(有代码)
什么是避障小车 用红外光电传感器,探测到物体即输出脉冲,输入到单片机中处 理一下,再对电机驱动模块进行控制,实现壁障的功能,这样的避障小车又称为简单的避障机器人. 各种避障方法: 1.红外线避障 2. ...
- 利用52单片机制作的超声波避障小车(包含所有源码)
做这个超声波避障小车的原因是因为单片机课程设计 一.硬件部分 1.电机驱动 电机驱动四个输入端IN1.IN2.IN3和IN4,四个输出端OUT1.OUT2.OUT3和OUT4,一个接地端GND,单片机 ...
最新文章
- thymeleaf rs 查询结果_第十一章 JDBC与MySQL数据库(10)——通用查询
- mysql数据库latin1转utf8_三种转换Mysql数据库数据编码的窍门-latin1转utf8
- amp 调用链_调用链选型之Zipkin,Pinpoint,SkyWalking,CAT
- python函数格式化_Python通过format函数格式化显示值
- 【Oracle】ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
- python手机版-python做app
- 安装天文软件karma和设置环境变量---conda安装和环境变量设置
- 2018暑假第二周总结(7.16-7.22)
- c语言课程设计学生成绩管理系统作业,C语言学生成绩管理系统课程设计word版
- jacob word另存为
- Linux中常见的ping不通百度问题
- 计算机上机考试可以粘贴复制吗,急!高会无纸化考试打字慢 该如何复制粘贴?...
- 从战略到执行:业务领先模型 BLM 的第一把钥匙「差距分析」
- R-squared 和 Adjusted R-squared联系与区别
- GooglePlay内购接入错误Google Play In-app Billing API version is less than 3
- 基于java的驾校驾照在线考试系统-计算机毕业设计
- 十大最赚钱增值业务排行榜
- Echarts + Web实现大屏展示效果
- 实习周记(第三周):忙碌
- C++11多线程:thread头文件