你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32的超声波测距程序

[复制链接]
STMCU-管管 发布时间:2020-9-14 11:08
我所使用的测距模块是HC-SR04,C-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、通过定时器定时时间来确定距离。


20200914110443.b83b784b010232ade30d0d46b19a0350.png


上时序图表明你只需要提供一个 10uS以上脉冲触发信号,该模块内部将发出8个 40kHz周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。 由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。 公式: uS/58=厘米或者uS/148=英寸; 或是: 距离=高电平时间*声速( 340M/S) /2; 建议测量周期为 60ms以上, 以防止发射信号对。

回响信号的影响

具体程序如下:
  1. <font style="font-size: 18px">#include "cs.h"
  2. #include "stm32f10x.h"
  3. #include "delay.h"
  4. #include "usart.h"

  5. /*记录定时器溢出次数*/
  6. uint overcount=0;</font>
  7. <font style="font-size: 18px">
  8. /*设置中断优先级*/
  9. void NVIC_Config(void)
  10. {
  11. NVIC_InitTypeDef NVIC_InitStructer;

  12. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

  13. NVIC_InitStructer.NVIC_IRQChannelPreemptionPriority=0;
  14. NVIC_InitStructer.NVIC_IRQChannelSubPriority=0;
  15. NVIC_InitStructer.NVIC_IRQChannel=TIM2_IRQn;
  16. NVIC_InitStructer.NVIC_IRQChannelCmd=ENABLE;

  17. NVIC_Init(&NVIC_InitStructer);
  18. }

  19. /*初始化模块的GPIO以及初始化定时器TIM2*/
  20. void CH_SR04_Init(void)
  21. {
  22. GPIO_InitTypeDef GPIO_InitStructer;
  23. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructer;

  24. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
  25. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

  26. /*TRIG触发信号*/
  27. GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
  28. GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP;
  29. GPIO_InitStructer.GPIO_Pin=GPIO_Pin_8;
  30. GPIO_Init(GPIOB, &GPIO_InitStructer);

  31. /*ECOH回响信号*/
  32. GPIO_InitStructer.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  33. GPIO_InitStructer.GPIO_Pin=GPIO_Pin_9;
  34. GPIO_Init(GPIOB, & GPIO_InitStructer);

  35. /*定时器TIM2初始化*/
  36. TIM_DeInit(TIM2);
  37. TIM_TimeBaseInitStructer.TIM_Period=999;//定时周期为1000
  38. TIM_TimeBaseInitStructer.TIM_Prescaler=71; //分频系数72
  39. TIM_TimeBaseInitStructer.TIM_ClockDivision=TIM_CKD_DIV1;//不分频
  40. TIM_TimeBaseInitStructer.TIM_CounterMode=TIM_CounterMode_Up;
  41. TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructer);

  42. TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//开启更新中断
  43. NVIC_Config();
  44. TIM_Cmd(TIM2,DISABLE);//关闭定时器使能

  45. }

  46. float Senor_Using(void)
  47. {
  48. float length=0,sum=0;
  49. u16 tim;
  50. uint i=0;
  51. /*测5次数据计算一次平均值*/
  52. while(i!=5)
  53. {
  54. PBout(8)=1; //拉高信号,作为触发信号
  55. delay_us(20); //高电平信号超过10us
  56. PBout(8)=0;
  57. /*等待回响信号*/
  58. while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==RESET);
  59. TIM_Cmd(TIM2,ENABLE);//回响信号到来,开启定时器计数

  60. i+=1; //每收到一次回响信号+1,收到5次就计算均值
  61. while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==SET);//回响信号消失
  62. TIM_Cmd(TIM2,DISABLE);//关闭定时器

  63. tim=TIM_GetCounter(TIM2);//获取计TIM2数寄存器中的计数值,一边计算回响信号时间

  64. length=(tim+overcount*1000)/58.0;//通过回响信号计算距离

  65. sum=length+sum;
  66. TIM2->CNT=0; //将TIM2计数寄存器的计数值清零
  67. overcount=0; //中断溢出次数清零
  68. delay_ms(100);
  69. }
  70. length=sum/5;
  71. return length;//距离作为函数返回值
  72. }

  73. void TIM2_IRQHandler(void) //中断,当回响信号很长是,计数值溢出后重复计数,用中断来保存溢出次数
  74. {
  75. if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
  76.   {
  77. TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志
  78. overcount++;
  79.   }
  80. }
  81. </font>
复制代码

上面的代码是超声波测距的代码,cs.h是头文件,内容如下:
  1. #ifndef _CS_H
  2. #define _CS_H

  3. #include "sys.h"
  4. #define uint unsigned int
  5. #define TRIG_Send  PBout(8)
  6. #define ECHO_Reci  PBin(9)

  7. void CH_SR04_Init(void);
  8. float Senor_Using(void);
  9. void NVIC_Config(void);
  10. #endif
复制代码


这些代码已经能够测距了,Senor_Using()返回值就是距离。具体如何把测得数据显示,就按照各自需求来做就行了。


收藏 评论2 发布时间:2020-9-14 11:08

举报

2个回答
goyhuan 回答时间:2020-9-14 13:33:39
长知识
w014017 回答时间:2020-9-15 09:29:39
学习

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版