学习HC-SR04超声波测距模块,代码附带卡尔曼滤波
硬件引脚
VCC-供5V的电压(一定要是5v)
GND-接地
Trig-HC-SR04超声波测距模块上的触发引脚,用于向模块发送一个10微秒的高电平触发信号,触发模块开始进行距离测量
Echo-用于接收超声波回波信号的引脚
工作原理:
使用HC-SR04模块时,需要先向Trig引脚发送一个持续时间不少于10微秒的高电平信号,这会使超声波发射器发射出一个8个周期的40KHz的超声波信号。随后,当超声波遇到障碍物在返回回来时,接收器会将接收到的回波信号转换为电信号,将Echo引脚输出一个高电平信号,其持续时间与回波信号的时间间隔成正比。
发送超声波:模块通过发送一定频率的超声波(通常为40kHz)来探测周围物体。超声波在空气中传播速度约为340m/s(在常温常压下),且在遇到物体时会被反射回来。
接收回波:当发出的超声波遇到物体后,会被反射回来。模块内置的接收器会接收到反射回来的超声波信号。
计算距离:模块通过计算发送超声波和接收回波的时间间隔来计算出物体与模块之间的距离。具体步骤如下:
- 发送超声波。
- 等待接收到反射回来的超声波信号。
- 记录下发送和接收之间的时间差,通过时间差计算出测量距离。时间差需要进行一定的处理,例如除以2,因为超声波的来回路径都要计算在内。
需要注意的是,超声波的测量范围是有限的,一般为2cm至4m之间。而且由于环境因素影响,例如温度、湿度、气压等,也会对超声波的传播和反射造成一定的影响,进而影响测量精度。
代码部分
代码部分参考:HC-SR04超声波测距模块使用方法和例程(STM32)_stm32超声波测距程序讲解_zeruns的博客-CSDN博客
超声波.c文件
#include "stm32f10x.h"
#include "Delay.h"
/*卡尔曼滤波数值配置*/
float P=1;
float P_; //对应公式中的p'
float X=0;
float X_; //X'
float K=0;
float Q=0.01;//噪声
//float R=0.2; //R如果很大,更相信预测值,那么传感器反应就会迟钝,反之相反
float R=0.5;
float distance=0;
float distance1=0;
/*卡尔曼函数*/
float KLM(float Z)
{X_=X+0;P_=P+Q;K=P_/(P_+R);X=X_+K*(Z-X_);P=P_-K*P_;return X;
}
/*********************/#define Echo GPIO_Pin_6 //HC-SR04模块的Echo脚接GPIOB6
#define Trig GPIO_Pin_5 //HC-SR04模块的Trig脚接GPIOB5uint64_t time=0; //声明变量,用来计时
uint64_t time_end=0; //声明变量,存储回波信号时间void HC_SR04_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //启用GPIOB的外设时钟 GPIO_InitTypeDef GPIO_InitStructure; //定义结构体GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置GPIO口为推挽输出GPIO_InitStructure.GPIO_Pin = Trig; //设置GPIO口5GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置GPIO口速度50MhzGPIO_Init(GPIOB,&GPIO_InitStructure); //初始化GPIOBGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //设置GPIO口为下拉输入模式GPIO_InitStructure.GPIO_Pin = Echo; //设置GPIO口6GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化GPIOBGPIO_WriteBit(GPIOB,GPIO_Pin_5,Bit_RESET); //输出低电平Delay_us(15); //延时15微秒
}int16_t sonar_mm(void) //测距并返回单位为毫米的距离结果
{uint32_t Distance,Distance_mm = 0;GPIO_WriteBit(GPIOB,Trig,Bit_SET); //输出高电平Delay_us(15); //延时15微秒GPIO_WriteBit(GPIOB,Trig,Bit_RESET); //输出低电平while(GPIO_ReadInputDataBit(GPIOB,Echo)==0); //等待低电平结束time=0; //计时清零while(GPIO_ReadInputDataBit(GPIOB,Echo)==1); //等待高电平结束time_end=time; //记录结束时的时间if(time_end/100<38) //判断是否小于38毫秒,大于38毫秒的就是超时,直接调到下面返回0{Distance=(time_end*346)/2; //计算距离,25°C空气中的音速为346m/sDistance_mm=Distance/100; //因为上面的time_end的单位是10微秒,所以要得出单位为毫米的距离结果,还得除以100}Distance_mm=KLM(Distance_mm);return Distance_mm; //返回测距结果
}float sonar(void) //测距并返回单位为米的距离结果
{uint32_t Distance,Distance_mm = 0;float Distance_m=0;GPIO_WriteBit(GPIOB,Trig,Bit_SET); //输出高电平Delay_us(15);GPIO_WriteBit(GPIOB,Trig,Bit_RESET); //输出低电平while(GPIO_ReadInputDataBit(GPIOB,Echo)==0);time=0;while(GPIO_ReadInputDataBit(GPIOB,Echo)==1);time_end=time;if(time_end/100<38){Distance=(time_end*346)/2;Distance_mm=Distance/100;Distance_m=Distance_mm/1000;}
Distance_m=KLM(Distance_m);return Distance_m;
}void TIM3_IRQHandler(void) //更新中断函数,用来计时,每10微秒变量time加1
{ // https://blog.zeruns.techif (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET) //获取TIM3定时器的更新中断标志位{time++;TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除更新中断标志位}
}
超声波.H文件
#ifndef __HCSR04_H
#define __HCSR04_Hvoid HC_SR04_Init(void);
int16_t sonar_mm(void);
float sonar(void);#endif
主函数main
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"
#include "HCSR04.h"uint64_t numlen(uint64_t num)//计算数字的长度
{uint64_t len = 1; // 初始长度为1for(; num > 9; ++len) // 判断num是否大于9,否则长度+1num /= 10; // 使用除法进行运算,直到num小于1return len; // 返回长度的值
}int main(void)
{ OLED_Init(); //初始化OLED屏Timer_Init(); //初始化定时器HC_SR04_Init(); //初始化超声波测距模块OLED_ShowString(1, 1, "Distance:"); //OLED屏输出字符串while (1){int Distance_mm=sonar_mm(); //获取距离测量结果,单位毫米(mm) int Distance_m=Distance_mm/1000; //转换为米(m)为单位,将整数部分放入Distance_mint Distance_m_p=Distance_mm%1000; //转换为米(m)为单位,将小数部分放入Distance_m_pOLED_Clear_Part(2,1,16); //将OLDE屏第2行清屏OLED_ShowNum(2, 1,Distance_m,numlen(Distance_m)); //显示测量结果的整数部分OLED_ShowChar(2, 1+numlen(Distance_m), '.'); //显示小数点if(Distance_m_p<100){ //判断是否小于100毫米OLED_ShowChar(2, 1+numlen(Distance_m)+1,'0'); //因为单位是米,所以小于10cm时要加0OLED_ShowNum(2, 1+numlen(Distance_m)+2,Distance_m_p,numlen(Distance_m_p)); //显示测量结果的小数部分OLED_ShowChar(2, 1+numlen(Distance_m)+2+numlen(Distance_m_p), 'm'); //显示单位}else {OLED_ShowNum(2, 1+numlen(Distance_m)+1,Distance_m_p,numlen(Distance_m_p)); //显示测量结果的小数部分OLED_ShowChar(2, 1+numlen(Distance_m)+1+numlen(Distance_m_p), 'm'); //显示单位}OLED_Clear_Part(3,1,16); //将OLDE屏第3行清屏OLED_ShowNum(3, 1,Distance_mm,numlen(Distance_mm)); //显示单位为毫米的距离结果OLED_ShowString(3, 1 + numlen(Distance_mm), "mm");Delay_ms(100); //延时100毫秒}
}
有关超声波数值波动,加入的卡尔曼滤波之后减少其波动,如果减少延迟函数的数值也可以减少数值的波动
学习HC-SR04超声波测距模块,代码附带卡尔曼滤波相关推荐
- arduino超声波测距接线图详细_Arduino系列之超声波测距模块代码(一)
这里我将简单介绍超声波测距模块 SR04超声波传感器: 是利用超声波特性检测距离的传感器,其带有两个超声波探头,分别用作于发射和接收超声波.范围在3-450cm. 工作原理: 超声波发射器向某一方向发 ...
- Arduino系列之超声波测距模块代码(一)
这里我将简单介绍超声波测距模块 SR04超声波传感器: 是利用超声波特性检测距离的传感器,其带有两个超声波探头,分别用作于发射和接收超声波.范围在3-450cm. 工作原理: 超声波发射器向某一方向发 ...
- hc sr04流程图_超声波测距模块工作原理_HC-SR04模块详解
超声波测距模块有好多种类型,目前比较常用的有URM37超声波传感器默认是232接口,可以调为TTL接口,URM05大功率超声波传感器测试距离能到10米,算是目前来说测试距离比较远的一款了,另外还有比较 ...
- 学习并使用HC-SR04超声波测距模块+STM32
** 超声波测距原理 ** 参考博客: https://blog.csdn.net/qq_40734815/article/details/105992801 https://blog.csdn.ne ...
- HC-SR04超声波测距模块学习记录
文章目录 一.关于HC-SR04超声波测距模块 1.硬件介绍 2.工作原理 二.基于STM32的驱动代码 一.关于HC-SR04超声波测距模块 1.硬件介绍 HC-SR04 超声波测距模块可提供 2c ...
- 超声波测距模块HC_SR04(基于STM32) 工作原理/代码
文章目录 产品说明 产品特点 基本工作原理 实物图 电气参数 时序图 使用指导,代码配置 明确IO口,对高低电平进行宏 中断处理 模块功能函数 测距平衡修复 产品说明 产品特点 HC-SR04超声波测 ...
- STM32F103—有关HC-SR04超声波测距模块的代码
关于HC-SR04超声波测距模块(Trig和Echo的引脚可以自定义,我用的TRIG是PBout(11) ECHO是PBin(10)) 硬件连接: Vcc :5V输入(最好不要用3.3V输入) Tri ...
- STM32学习笔记4——HC_SR04超声波测距模块的调试记录
项目场景: STM32F103单片机和HC_SR04超声波测距模块测量距离. 其中HC_SR04模块采用5V供电. 问题描述: 代码编写完成以后,HC_SR04超声波测距模块传递模块返回来的高电平一直 ...
- STM32单片机基于HAL库开发HC-SR04 超声波测距模块(终极版)
参考: 某宝HC-SR04 超声波测距模块商品详情页 STM32L051C8T6 HAL库 输入捕获进行超声波测距 案例 STM32CubeMX学习笔记3--TIM2输入捕获(SR-04测距) cub ...
最新文章
- gitignore重要技巧
- 云炬随笔20211011
- 后端如何收取多个文件_前段文件分片后后端怎么接收
- python中字典使用_python中字典的使用
- mysql 中文字段排序( 按拼音首字母排序) 的查询语句
- 课下作业——对正在使用的搜索类软件/输入法进行评价
- 高盛的AI说,今年世界杯冠军是巴西
- Quartz2-Quartz与tomcat集成
- 转载 - LINUX下查看CPU使用率的命令
- 异步流程控制 java_Javascript异步流程控制之串行执行详解
- 线材下料优化python算法_python实现最优化算法
- 《免费下载论文的网站》
- python显示表格_python显示表格
- 抖音私聊不封号技术,教你怎么避免踩雷?
- 自定义ckeditor图片上传插件
- 杀戮空间2服务器协议,杀戮空间2 云服务器搭建
- 全面理解-Flutter(万字长文,【性能优化实战】
- tplink android管理软件,tplink手机app下载
- 上海户口申请条件类比分析
- 如何实现网站事件统计与事件分析