找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13739|回复: 12
打印 上一主题 下一主题
收起左侧

stm32的超声波测距源码+详解

  [复制链接]
跳转到指定楼层
楼主
这个是超声波测距的代码,可以添加stm32程序中,并且有测距的组件就可以使用了。
还附加有原理讲解图文word


HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm;模块包括超声波发射器、接收器与控制电路。像智能小车的测距以及转向,或是一些项目中,常常会用到。智能小车测距可以及时发现前方的障碍物,使智能小车可以及时转向,避开障碍物。
HC-SR04基本工作原理:
(1)采用IO口TRIG触发测距,给最少10us的高电平信呈。
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回, 通过IO口ECHO输出一个高电平, 高电平持续的时间就是超声波从发射到返回的时间。 测试距离=(高电平时间*声速(340M/S))/2。
程序编写思路是:1、配置好使用到的GPIO以及定时器;
2、给模块TRIG端口发送大于10us的高电平信号,当收、收到ECHO回响信号是,打开定时器开始定时;
3、当回响信号消失,关闭定时器;
4、通过定时器定时时间来确定距离。
先由触发信号启动HC-RS04测距模块,也就是说,主机要先发送至少10us的高电平,触发HC-RS04,模块内部发出信号是传感器自动回应的,我们不用去管它。输出回响信号是我们需要关注的。信号输出的高电平就是超声波发出到重新返回接收所用的时间。用定时器,可以把这段时间记录下来,算出距离,结果要除于2,因为总时间是发送和接收的时间总和。

单片机源程序如下:
  1. #include "cs.h"
  2. #include "stm32f10x.h"
  3. #include "delay.h"
  4. #include "usart.h"

  5. /*记录定时器溢出次数*/
  6. uint overcount=0;

  7. /*设置中断优先级*/
  8. void NVIC_Config(void)
  9. {
  10.     NVIC_InitTypeDef NVIC_InitStructer;
  11.    
  12.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  13.    
  14.     NVIC_InitStructer.NVIC_IRQChannelPreemptionPriority=0;
  15.     NVIC_InitStructer.NVIC_IRQChannelSubPriority=0;
  16.     NVIC_InitStructer.NVIC_IRQChannel=TIM2_IRQn;
  17.     NVIC_InitStructer.NVIC_IRQChannelCmd=ENABLE;
  18.    
  19.     NVIC_Init(&NVIC_InitStructer);
  20. }

  21. /*初始化模块的GPIO以及初始化定时器TIM2*/
  22. void CH_SR04_Init(void)
  23. {
  24.     GPIO_InitTypeDef GPIO_InitStructer;
  25.     TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructer;
  26.    
  27.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
  28.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  29.    
  30.     /*TRIG触发信号*/
  31.     GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
  32.     GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP;
  33.     GPIO_InitStructer.GPIO_Pin=GPIO_Pin_8;
  34.     GPIO_Init(GPIOB, &GPIO_InitStructer);
  35.    
  36.     /*ECOH回响信号*/
  37.     GPIO_InitStructer.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  38.     GPIO_InitStructer.GPIO_Pin=GPIO_Pin_9;
  39.     GPIO_Init(GPIOB, & GPIO_InitStructer);
  40.    
  41.     /*定时器TIM2初始化*/
  42.     TIM_DeInit(TIM2);
  43.     TIM_TimeBaseInitStructer.TIM_Period=999;//定时周期为1000
  44.     TIM_TimeBaseInitStructer.TIM_Prescaler=71; //分频系数72
  45.     TIM_TimeBaseInitStructer.TIM_ClockDivision=TIM_CKD_DIV1;//不分频
  46.     TIM_TimeBaseInitStructer.TIM_CounterMode=TIM_CounterMode_Up;
  47.     TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructer);
  48.    
  49.     TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//开启更新中断
  50.     NVIC_Config();
  51.     TIM_Cmd(TIM2,DISABLE);//关闭定时器使能
  52.    
  53. }



  54. float Senor_Using(void)
  55. {
  56.     float length=0,sum=0;
  57.     u16 tim;
  58.     uint i=0;
  59.     /*测5次数据计算一次平均值*/
  60.     while(i!=5)
  61.     {
  62.         PBout(8)=1; //拉高信号,作为触发信号
  63.         delay_us(20); //高电平信号超过10us
  64.         PBout(8)=0;
  65.         /*等待回响信号*/
  66.         while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==RESET);
  67.         TIM_Cmd(TIM2,ENABLE);//回响信号到来,开启定时器计数
  68.         
  69.         i+=1; //每收到一次回响信号+1,收到5次就计算均值
  70.         while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==SET);//回响信号消失
  71.         TIM_Cmd(TIM2,DISABLE);//关闭定时器
  72.         
  73.         tim=TIM_GetCounter(TIM2);//获取计TIM2数寄存器中的计数值,一边计算回响信号时间
  74.         
  75.         length=(tim+overcount*1000)/58.0;//通过回响信号计算距离
  76.         
  77.         sum=length+sum;
  78.         TIM2->CNT=0; //将TIM2计数寄存器的计数值清零
  79.         overcount=0; //中断溢出次数清零
  80.         delay_ms(100);
  81.     }
  82.     length=sum/5;
  83.     return length;//距离作为函数返回值
  84. }



  85. void TIM2_IRQHandler(void) //中断,当回响信号很长是,计数值溢出后重复计数,用中断来保存溢出次数
  86. {
  87.     if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
  88.     {
  89.         TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志
  90.         overcount++;
  91.         
  92.     }
  93. }
复制代码
全部资料51hei下载地址:
超声波测距.7z (676.27 KB, 下载次数: 493)



评分

参与人数 2黑币 +55 收起 理由
hzd530 + 5 共享资料的黑币奖励!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏12 分享淘帖 顶2 踩1
回复

使用道具 举报

沙发
ID:669679 发表于 2020-6-17 17:49 | 只看该作者
请问楼主包含仿真图吗?
回复

使用道具 举报

板凳
ID:107891 发表于 2020-8-17 19:30 | 只看该作者
加油啊楼主,奉献的精神,支持支持
回复

使用道具 举报

地板
ID:820019 发表于 2020-9-17 07:32 来自手机 | 只看该作者
请问可以自己做出来实物吗?
回复

使用道具 举报

5#
ID:831533 发表于 2020-11-13 20:50 | 只看该作者
=reset  这里不是等于0吗  不应该是 =set才开始打开定时器吗
回复

使用道具 举报

6#
ID:843473 发表于 2020-12-2 23:48 来自手机 | 只看该作者
哇,感谢楼主,我直呼内行!
回复

使用道具 举报

7#
ID:505106 发表于 2021-1-24 19:56 | 只看该作者
不能用
回复

使用道具 举报

8#
ID:890497 发表于 2021-3-10 22:15 | 只看该作者
为什么计算回响信号是除以58
回复

使用道具 举报

9#
ID:1046650 发表于 2022-10-12 23:03 | 只看该作者
太感谢楼主的分享了,感谢感谢
回复

使用道具 举报

10#
ID:523823 发表于 2022-12-12 15:40 | 只看该作者
流程很详细
回复

使用道具 举报

11#
ID:1078282 发表于 2023-5-18 11:27 | 只看该作者

流程很详细,学习学习
回复

使用道具 举报

12#
ID:1073073 发表于 2023-10-11 17:45 | 只看该作者
最近刚学了32,上来找一下例程玩一下。
回复

使用道具 举报

13#
ID:1096471 发表于 2023-10-18 17:16 | 只看该作者
ll0217 发表于 2021-3-10 22:15
为什么计算回响信号是除以58

我觉得可能是68,因为楼主说了测量5次,然后取平均值,我查了一下,音速是340,除以5的结果是68
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表