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

STM32驱动HC-SR04超声波模块

[复制链接]
STMCU小助手 发布时间:2022-8-15 21:00
前言
# [! T# g; X: T4 ?$ IHC-SR04作为简单的外设模块,广泛应用于简单的课设项目中,十分适合入门STM32。
4 e: r, c% `7 t# D8 W3 |. S
2 W. k# y% P+ Q+ s/ g. M( D一、HC-SR04介绍
. E+ R  D8 x1 b- n  k( {HC-SR04的介绍,这里就不做累述了,大家可以上某宝上找店家要下用户手册,或者到其他博主的博客中看个大概的介绍。" x! s4 K2 y1 n: b& Z+ D2 ]4 I

$ f; T: r4 e9 K- h: D7 W二、使用步骤8 M; l4 |9 D# C3 g) p
1.接口定义
( W+ q. E' h1 R& U  d4 Z
  1. VCC      ------->      5V
    1 p& M/ T) U  H) Y: U1 Z( \* D2 z- B
  2. TRIG      ------->                PA6
    ( R, m' k* C/ F7 A& V$ s8 ?9 d/ h+ @
  3. ECHO      ------->                PA7# d- S" h; v+ s* ^, p" K+ x/ e
  4. GND      ------->                GND
复制代码

- y% {. z! `' ?# n/ N) jTRIG和ECHO两个接口也可以使用其他的IO口继续驱动,在这篇文章中,博主用的是PA6和PA7。当然也可以使用其他的IO口,只需要所使用的IO口可以输出输入高低电平即可。& V; k  v; ?8 f. C* W6 k( ?
/ v% ^$ {* A3 f
2.阅读时序图
0 }! Y0 p+ v% U5 h
8b1a092ce2d74357b014a8b8bdc2174a.png 9 a) ~. B  I, `% ^/ w8 H' ^) C
如图,驱动HC-SR04需要先向TRIG口输入一段超过10us的高电平。此时模块会自动输出脉冲信号来检测是否接收到了信号的返回。若接收到了返回信号,则会将ECHO段拉高并持续一段时间,而持续的时间便是超声波信号发出到接收到返回的超声波信号的时间。& Y/ P% p5 F5 n  S; N

) p+ E( [  V$ v! o3.原理# i# G1 i6 [' p8 N

- a. q; r6 D5 I: S0 _1 `& T4 _ 1cddb45852f64c0ba19e2d550e9b8641.png
; z- H3 m" |3 n" x  P3 w; A, X) {, P. \$ N
原理:IO口发送触发信号拉高Trig,延迟超过10us之后,再拉低Trig,作为超声波模块的启动信号,此时模块不断自动发出一段40khz的信号,当收到返回的超声波信号时,ECHO口则输出回响信号 。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离.2 O. _9 O8 I1 V+ y) K. V, Q* T) r# l- v

7 x; N! g: `2 C( ?4.代码

4 [2 C- f, k5 l1 b; j" `/ Mhscr.c下的代码:4 R$ U& h2 i2 j' W) `

( P" ]' j" B% u' I. r% C$ T
  1. #include "hcsr.h"- {  l1 I8 v4 ?4 A8 P

  2. 7 l. [* M- I) R
  3. void TIM2_Count_Configuration(void)
    : P/ r3 Q- H2 [$ d: H1 R6 n, H
  4. {
    - W" X# M$ [3 r3 H0 C; D& b7 G! }" x
  5.         TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;" j. _  C0 K! J  P2 U
  6.         
    & T9 T% t+ ~2 A1 ~
  7.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);( |) b* j- p! T. h" G- {
  8.         
    $ `! `; E1 [) m, ]
  9.         TIM_TimeBaseStructure.TIM_Period = 0xFFFF;  //999+1 =1000
    ( R$ _. i; c- _( `+ d
  10.         TIM_TimeBaseStructure.TIM_Prescaler = 71;  //71+1= 72分频4 p7 v3 N+ a% ^% T' V
  11.         //TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
    8 `4 m) G( `" G* |' R. ]: p  H
  12.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    ( R3 d3 q' J! H) r0 ?4 L# z
  13.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);" G) |+ m) X, k9 ?6 |* K4 H) ]

  14. 5 ]2 v- m( X. b. b% f
  15.         TIM_Cmd(TIM2, ENABLE);0 j% S9 G& C$ d; I1 I" X/ N
  16.         //暂时先关闭TIM2时钟,等全部初始化结束后正式使用定时器前再开启
    - t7 g6 G: N  C. j6 l
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, DISABLE);2 |- u  V+ t! G' r. y3 L) E
  18. }& p. v' k! E0 ?" [

  19. . ~% n' k/ Y; U4 N( C  U# n9 M
  20. //PB6(output):TRIG   PB7(input):ECHO
    * z4 ?/ b) T7 ?3 F
  21. void HCSR04_GPIO_Configuration(void)1 c, P* V8 N3 K# F1 F9 Q
  22. {* H  H. D9 c+ |! |9 u0 K/ S
  23.         GPIO_InitTypeDef GPIO_InitStructure;
    " E: j( h3 N. c" _8 D0 B5 {' h

  24. * G% A0 Z. {! h* M- ^: ?6 U
  25.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    2 o6 ]. b" `6 D# Z6 n
  26.         
    - ?% i+ ~  x& c4 X
  27.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;* E& I7 M  n0 x- P  g; H3 G! B
  28.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    , R. G0 l$ F# P8 u" V
  29.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    / _# U( |5 i/ X, Z
  30.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    6 Z( B7 @! `( w0 G, u3 V7 ]
  31.         
    0 B) L' _# A/ q# W- c1 O& e
  32.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
    9 S9 D9 h. c" e, {- {
  33.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    ' C% m5 H3 ^* N4 \9 z
  34.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;2 f3 c0 O  H) x5 |5 J
  35.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    ! H9 c$ e2 q# x4 Z1 f
  36. }5 G. C2 Q. j0 C' I
复制代码

8 u5 _7 I' r- k" U  u3 c代码分析:该段代码初始化HC-SR04所使用到的IO口和时钟。并没有什么难度。# G# ~( H5 B) y  ]4 g7 `5 S
% `7 D1 D+ {' _7 \' v5 W
main. c的代码如下:+ g4 V% p: p+ C- u! U/ E5 w; T2 r
* x3 ^: N! k( ]- H5 f) b/ L
  1.           while(1) : m5 n, O8 m+ F& ]0 j
  2.         {        
    ! l6 f/ ^6 U, R* Y( V

  3. 4 |! G9 ?9 j- F- w! L0 i8 Y
  4.                 TIM_Cmd(TIM2, ENABLE);% V" T9 d& G2 w: E' F/ d
  5.                 TRIG_H;
      ?0 b/ `# }5 g8 H/ j) T
  6.                 delay_us(15);
    4 k$ w8 [. {8 i* U. C
  7.                 TRIG_L;
    & Q/ C9 k7 g: A2 r3 o5 q" c( d
  8.                 //printf("HERE");
    / Q7 K9 Y% V+ V. u
  9.                 while(ECHO == 0);- ?* o2 O& F. L# _8 H4 }3 h1 N
  10.                 TIM_SetCounter(TIM2, 0);: H* n0 P: Z. G4 P/ z- D$ J
  11.                 : @, m7 C0 A: L& L! i. b. L1 Q
  12.                 while(ECHO == 1);
    8 t% o! l! J9 |& d* d
  13.                 TIM_Cmd(TIM2, DISABLE);
    5 c& ^- q5 ^5 s1 W/ e8 G
  14.                 time = TIM_GetCounter(TIM2);
    : _6 h2 h) A0 o. W5 G7 p7 }
  15.                 //printf("time = ",time);: V. Z5 ~% C; o7 Q1 p( K$ X( B
  16.                 distance = time * 0.017;$ W( V5 t0 M# }# W) s& Y
  17.                 printf("Distance = %.2fcm\n", distance);
    4 W9 x( U0 X: c4 _( f* ]
  18.         }% V1 w& L1 y( d! _: b* Z
复制代码

1 v% _( Y7 h! S4 M代码分析:此段代码的重点在于两个while循环,两个while循环都是为了检查ECHO的输出以及查询其高电平持续的时间,通过持续时间算出测量距离。' }! n$ o5 [  ]0 l* J' [
! ^. [3 k! U+ z0 h: |

2 L& e# A9 V+ v9 `0 T. W
/ g# q  ~  R0 N  f
赞 收藏 评论0 发布时间:2022-8-15 21:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版