当前位置:   article > 正文

【STM32】超声波传感器HC-SR04知识_hc-sr04超声波传感器

hc-sr04超声波传感器

一、超声波HC_SR04简介

        超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接收。

        电路板上有四个引脚:VCC、GND、Trig(触发)、Echo(回应)。

        工作电压与电流:5V,15mA

        感应距离:2~400cm

        感测角度:不小于15度

        被测物体的面积不要小于50平方厘米并且尽量平整

        具备温度补偿电路

二、超声波原理

        距离公式:

        高电平持续时间*声速(340m/s)/2

三、超声波测距步骤

  1. 配置GPIO引脚结构体(Trig,Echo)
  2. 配置定时器4结构体
  3. 配置定时器4中断结构体
  4. 开启时钟(定时器、GPIO)
  5. Trig引脚输出高电平(10us以上),然后关闭
  6. 等待Echo引脚输出高电平开始,定时器打开->开启计数器计数
  7. 等待Echo引脚输出高电平结束,定时器关闭->停止计数器计数

四、硬件接线

  1. GND——GND
  2. VCC——5V
  3. Trig——PB11
  4. Echo——PB10

五、模块化程序

  1. #ifndef __SYS_H
  2. #define __SYS_H
  3. #include "stm32f10x.h"
  4. #define SYSTEM_SUPPORT_UCOS 0
  5. #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
  6. #define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
  7. #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
  8. #define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C
  9. #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C
  10. #define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C
  11. #define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C
  12. #define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C
  13. #define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C
  14. #define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C
  15. #define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808
  16. #define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08
  17. #define GPIOC_IDR_Addr (GPIOC_BASE+8) //0x40011008
  18. #define GPIOD_IDR_Addr (GPIOD_BASE+8) //0x40011408
  19. #define GPIOE_IDR_Addr (GPIOE_BASE+8) //0x40011808
  20. #define GPIOF_IDR_Addr (GPIOF_BASE+8) //0x40011A08
  21. #define GPIOG_IDR_Addr (GPIOG_BASE+8) //0x40011E08
  22. #define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //Êä³ö
  23. #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //ÊäÈë
  24. #define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //Êä³ö
  25. #define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //ÊäÈë
  26. #define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //Êä³ö
  27. #define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //ÊäÈë
  28. #define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //Êä³ö
  29. #define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //ÊäÈë
  30. #define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //Êä³ö
  31. #define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //ÊäÈë
  32. #define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //Êä³ö
  33. #define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //ÊäÈë
  34. #define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //Êä³ö
  35. #define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //ÊäÈë
  36. void NVIC_Configuration(void);
  37. #endif
  1. #include "sys.h"
  2. #include "stm32f10x.h"
  3. void NVIC_Configuration(void)
  4. {
  5. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  6. }
  1. #include "hc.h"
  2. #include "Delay.h"
  3. #define HCSR04_PORT GPIOB
  4. #define HCSR04_CLK RCC_APB2Periph_GPIOB
  5. #define HCSR04_TRIG GPIO_Pin_11
  6. #define HCSR04_ECHO GPIO_Pin_10
  7. u16 msHcCount = 0;
  8. void HC_Init(void)
  9. {
  10. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  11. GPIO_InitTypeDef GPIO_InitStructure;
  12. RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);
  13. GPIO_InitStructure.GPIO_Pin =HCSR04_TRIG;
  14. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  15. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  16. GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
  17. GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);
  18. GPIO_InitStructure.GPIO_Pin = HCSR04_ECHO;
  19. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  20. GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
  21. GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);
  22. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  23. TIM_DeInit(TIM2);
  24. TIM_TimeBaseStructure.TIM_Period = (1000-1);
  25. TIM_TimeBaseStructure.TIM_Prescaler =(72-1);
  26. TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  27. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  28. TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
  29. TIM_ClearFlag(TIM4, TIM_FLAG_Update);
  30. TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
  31. NVIC_InitTypeDef NVIC_InitStructure;
  32. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  33. NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
  34. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  35. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  36. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  37. NVIC_Init(&NVIC_InitStructure);
  38. TIM_Cmd(TIM4,DISABLE);
  39. }
  40. static void OpenTimerForHc()
  41. {
  42. TIM_SetCounter(TIM4,0);
  43. msHcCount = 0;
  44. TIM_Cmd(TIM4, ENABLE);
  45. }
  46. static void CloseTimerForHc()
  47. {
  48. TIM_Cmd(TIM4, DISABLE);
  49. }
  50. void TIM4_IRQHandler(void)
  51. {
  52. if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
  53. {
  54. TIM_ClearITPendingBit(TIM4, TIM_IT_Update );
  55. msHcCount++;
  56. }
  57. }
  58. u32 GetEchoTimer(void)
  59. {
  60. u32 t = 0;
  61. t = msHcCount*1000;
  62. t += TIM_GetCounter(TIM4);
  63. TIM4->CNT = 0;
  64. Delay_ms(50);
  65. return t;
  66. }
  67. float HC_Get(void )
  68. {
  69. int t = 0;
  70. int i = 0;
  71. float lengthTemp = 0;
  72. float sum = 0;
  73. while(i!=5)
  74. {
  75. TRIG_Send = 1;
  76. Delay_us(20);
  77. TRIG_Send = 0;
  78. while(ECHO_Reci == 0);
  79. OpenTimerForHc();
  80. i = i + 1;
  81. while(ECHO_Reci == 1);
  82. CloseTimerForHc();
  83. t = GetEchoTimer();
  84. lengthTemp = ((float)t/58.0);//cm
  85. sum = lengthTemp + sum ;
  86. }
  87. lengthTemp = sum/5.0;
  88. return lengthTemp;
  89. }
  1. #ifndef __HC_H
  2. #define __HC_H
  3. #include "sys.h"
  4. void HC_Init(void);
  5. static void OpenTimerForHc(void);
  6. static void CloseTimerForHc(void);
  7. void TIM4_IRQHandler(void);
  8. u32 GetEchoTimer(void);
  9. float HC_Get(void );
  10. #define TRIG_Send PBout(11)
  11. #define ECHO_Reci PBin(10)
  12. #endif
  1. #include "stm32f10x.h" // Device header
  2. #include "Delay.h"
  3. #include "OLED.h"
  4. #include "HC.h"
  5. uint32_t Length;
  6. float length;
  7. int main(void)
  8. {
  9. OLED_Init();
  10. OLED_ShowString(1,1,"Length:");
  11. OLED_ShowString(2,10,"cm");
  12. HC_Init();
  13. while(1)
  14. {
  15. length =HC_Get();
  16. Length = length*100; //eg:54.25->5425
  17. OLED_ShowNum(2,4,Length/1000,1); // 千
  18. OLED_ShowNum(2,5,Length%1000/100,1); //百
  19. OLED_ShowString(2,6,".");
  20. OLED_ShowNum(2,7,Length%100/10,1); //十
  21. OLED_ShowNum(2,8,Length%10/1,1); //个
  22. }
  23. }

https://www.wpsshop.cn/w/小蓝xlanll/article/detail/382697

推荐阅读
相关标签
  

闽ICP备14008679号