HC_SR04超声波模块的应用
发布日期:2021-06-28 22:04:53
浏览次数:3
分类:技术文章
本文共 3894 字,大约阅读时间需要 12 分钟。
1 简介
HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能,测 距精度可达高到 3mm ;模块包括超声波发射器、接收器与控制电路。电气参数 | HC-SR04 超声波模块 |
---|---|
工作电压 | DC 5 V |
工作电流 | 15mA |
工作频率 | 40kHz |
最远射程 | 4m |
最近射程 | 2cm |
测量角度 | 15 度 |
输入触发信号 | 10uS 的 TTL 脉冲 |
输出回响信号 | 输出 TTL 电平信号,与射程成比例 |
规格尺寸 | 45X20X15mm |
2 时序图
简单来说:- 提供一个 10uS 以上脉冲触发信号,该模块内部将发出 8 个 40kHz 周期电平并检测回波。
- 一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。
- 由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。
测算公式:距离=高电平时间*声速(340M/S)/2。
声速与温度有关,如果环境温度变化显著,必须考虑温度补偿问题。空气中声速与温度的关系可以表示为
几点注意事项:
- 建议测量周期为 60ms 以上,以防止发射信号对回响信号的影响。
- 此模块不宜带电连接,若要带电连接, 则先让模块的 GND 端先连接,否则会影响模块的正常工作。
- 测距时,被测物体的面积不少于 0.5 平方米且平面尽量要求平整,否则影响测量的结果。
3 程序设计(stm32)
思路:测量的距离与高电平的时间有关,而且高电平时间不超过60ms,那我们可以利用定时器来获取高电平的时间。将定时器设置为720分频,自动重装载值为 7000,则每70ms进入一次中断(如果进入了中断说明距离超出最大测量范围), 记一次数是10us。
3.1 测量函数
u8 sr04_over_flag; //当高电平时间大于70ms,说明超出最大测量范围/* * 函数功能:发送触发信号 */void SendTrigSign(void){ Trig=1; delay_us(15); Trig=0;}/* * 函数功能:计算距离 * 返 回 值:Distance 距离 */float distance_Count(void) { u8 time = 0; float Speed; float Distance; time = TIM_GetCounter(TIM4); TIM_SetCounter(TIM4,0);//计数器值清零 Speed = 331.4 + 0.607 * Temp;//计算声速,Temp是当前温度值 Distance = (time*Speed)/2; //距离测算 return Distance;}/* * 函数功能:控制定时器,测量高电平时间 * 返 回 值: f 距离 */float Ultrasound_Measure(void){ float f = 0.0 ; sr04_over_flag = 0 ; SendTrigSign() ; while(!Echo); //当回响信号为零时等待 TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);//使能或者失能指定的TIM中断 TIM_Cmd(TIM4,ENABLE);//使能TIM4外设 while(Echo); TIM_ITConfig(TIM4,TIM_IT_Update,DISABLE);//使能或者失能指定的TIM中断 TIM_Cmd(TIM4,DISABLE);//失能TIM4外设 if(sr04_over_flag==1) { f = 400 ;//最大距离,高电平时间持续大于70ms了 } else { f = distance_Count(); } return f ;}
3.2 初始化函数
/* * 函数功能:初始化超声波模块的两个管脚 * Trig 触发信号控制输入-----PC9配置成推挽输出 * Echo 回响信号输出---------PC8配置成上拉输入 */void Ultrasonic_IO_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能PC端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //Trig-->PC.9 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; ; //上拉输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化GPIOC.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //Echo-->PC.8 端口配置, 推挽输出 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOC, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz GPIO_ResetBits(GPIOC,GPIO_Pin_9); //PC.9 输出低}/* * 函数功能:通用定时器4初始化 * 形 参:arr:自动重装值 * psc:时钟预分频数 */void TIM4_time_init(u16 arr,u16 psc ){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //TIM4中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设}
3.3 定时器中断服务函数
void TIM4_IRQHandler(void) //TIM4中断{ if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 { TIM_ClearITPendingBit(TIM4, TIM_IT_Update); //清除TIMx的中断待处理位:TIM 中断源 sr04_over_flag = 1; }}
3.4 main.c
int main(void){ float dis; delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(9600); Ultrasonic_IO_Init(); TIM4_time_init(6999,719);//定时器70ms中断一次T = ((719+1)*(6999+1)) /72000 000 =70ms while(1) { dis = Ultrasound_Measure(); printf("距离为%f\r\n",dis);//单位cm }
转载地址:https://blog.csdn.net/ye_longjie/article/details/117398370 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月22日 07时01分11秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
SDUT 3364-数据结构实验之图论八:欧拉回路(并查集)
2019-04-28
图的基础(C++)
2019-04-28
SAP用户增强总结-采购订单建立增加客户数据增强示例
2019-04-28
journal of neuroscience:面孔的神经表征与眼动模式相协调
2019-04-28
The Neuroscientist:运动性脑震荡的长期影响
2019-04-28
机器学习实战学习笔记一
2019-04-28
【vn.py】 策略实盘自动交易
2019-04-28
仿牛客社区项目2.5登录模块———登录退出功能
2019-04-28
LeetCode 190. 颠倒二进制位
2019-04-29
LeetCode 268. 丢失的数字
2019-04-29
LeetCode 231. 2 的幂
2019-04-29
LeetCode 476. 数字的补数
2019-04-29
JDK 1.7 Integer.parseInt 源码解析
2019-04-29
[经典排序算法][集锦]
2019-04-29
无处不在的二分查找
2019-04-29
Java集合框架List,Map,Set等全面介绍
2019-04-29
Java 泛型(二) 泛型之中的通配符(Wildcards)使用
2019-04-29
7-36 复数四则运算 (15 分)
2019-04-29
基于powershell的渗透测试工具nishang
2019-04-29