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

基于STM32的CAN通信之HC-SR04(超声波)

[复制链接]
攻城狮Melo 发布时间:2023-10-23 23:36
一、超声波测距基本原理
9 O+ w' u! G" L* t6 k4 L超声波测距的原理非常简单,超声波发生器在某一时刻发出一个超声波信号,当这个超声波信号遇到被测物体后会反射回来,被超声波接收器接收到。这样只要计算出从发出超声波信号到接收到返回信号所用的时间,就可以计算出超声波发生器与反射物体的距离。; M( I; e7 |: u4 y+ |- s' F9 b
; k: J! h! A2 a  Q- h3 N
距离的计算公::d=s/2=(c*t)/2
6 [' _$ k4 `! l/ }& B/ k
0 X; s3 S6 n3 c6 i" B( a  k  Z其中 d 为被测物与测距器的距离,s 为声波的来回路程,c 为声波,t 为声波来回所用的时间。
+ F7 s, _/ R# o  @$ f1 l
6 c3 w1 K+ l( \/ F/ N由于超声波也是一种声波,其声速 c 与温度有关,在不同温度下的超声波声速不同。在使用时,如果温度变化不大,则可认为声速是基本不变的。如果测距精度要求很高,则应通过温度补偿的方法加以校正。声速校正后,只要测得超声波往返的时间,即可求得距离。不同外温度下的超声波声速表如下; ]! M4 Q" e2 D' C/ w  P

( |1 w, n( x1 ~  O; v
微信图片_20231023233556.png

: U* k6 |! T+ I9 c
不同温度下超声波声速表
4 Z( g. R& b5 d& F/ t8 R+ W8 d
. X: I  J& D" Y2 E' k% G4 I
补充说明" l7 o6 [: U0 \7 X7 _
最近在问答区发现有小伙伴疑惑为什么在计算距离时是根据Echo输出的高电平持续时间来计算距离。这里简单解释一下,仅供参考- c- y) B! q- @5 @
1. 实际超声波测距的原理就是上面介绍的,记录的时间是从超声波发出到回波被接收的时间,然后这个时间除以2,再乘超声波的传播速度得到距离。超声波测距模块实际也是这么做的。模块内部会记录超声波发出的时刻,在接收到回波后会立刻以高电平的形式从Echo引脚输出高电平,高电平的持续时间就是超声波从发出到被接收到的时间间隔。这么做是模块为了方便单片机处理,快速得到超声波从发出到被接收到的时间间隔。: [- P1 O+ d1 z5 m/ H9 @$ u
; K0 k& H. [" J' ^0 P( y# \4 ~
2. 实际大家可以自己测试一下,初始化一个定时器,从给Trig引脚10us高电平结束时刻开启定时器,到Echo引脚接收到高电平的时刻停止计时,用这个时间来计算距离,实际和用高电平持续时间来计算距离得到的结果基本是相同的。3 I  I6 ~/ {4 P/ j! u+ I! c) }# T

6 F2 E" o* E( l" w3. 给Trig引脚10us高电平并不是说只发送10us的超声波。10us的高电平是为了触发模块工作。10us高电平结束后,模块会发送一个8个40KHz的方波。# e4 v0 }9 U, ~9 V

, V, J" v6 A0 f* S- y
# ]7 ^8 k( `4 f) \1 Z; N' P
二、超声波传感器简介8 h& P8 h7 M- ^
总体上讲,超声波发生器可以分为两大类:一类是用电气方式产生超声波类是用机械方式产生超声波。电气方式包括压电型、磁致伸缩型和电动型等:机械方式有加尔统笛、液哨和气流旋笛等。他们所产生的超声波的频率、功率和声波特性各不相同,因而用途也各不相同。目前较为常用的是压电式超声波发生。& I  w5 X3 {7 t
8 T) v7 w( @4 i" }& w; G* d
压电式超声波发生器实际上是利用压电晶体的谐振来工作的。它有两个压电晶片和一个共振板。当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,便产生超声波。反之,如果两极间未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收器了。这里介绍的是一个超声波测距模块——HC-SR04。
' G" N& a) p) ^
; C* [+ L; v! W0 l) M
微信图片_20231023233600.jpg
; ~2 N  ~0 ]- A8 j/ V. p- }
HC-SR04

+ ]! j( i; F* k- r

* t: e/ H. b* X/ b1 ~5 j
8 V; l* G3 n: |2 `2 X
三、HC-SR04测距实现思路
2 N' n, o: Q% X( b- W4 `" P+ b9 w; |这里就不再针对HC-SR04模块的原理和电路做详细介绍了,直接介绍利用该模块实现测距的思路。该模块有四个引脚。4 D5 d' S% F( _+ R
• VCC —— 通常是5V供电
1 w( i5 h! [! z: C+ K: W9 r2 y• GND —— 地, }( l; |- \" s% J9 l2 v0 w
• Trig —— 给该引脚大于10us的高电平,超声波发射头会发送一个超声波信号
" O, b7 O$ v; j• Echo —— 该引脚在接收到返回的超声波信号后会变为高电平+ h- J/ C6 d/ w0 j( n1 f
5 ~3 t+ g. G1 o' |/ J, c: L
Echo接收到的高电平持续时间即为超声波一个来回所用的时间,利用该时间除以2再乘上光速,即可得到测量距离。$ y4 N: Z6 a. w0 h

. e) r% V% U) q: a
0 I* u9 K' T  S; R8 a
四、超声波测距程序实现% H! K! K& H/ {& `7 t  i
4.1 HC-SR04初始化程序
* d8 Z% k. q- l$ r3 z+ z
HC-SR04初始化程序主要包括两部分,一部分是初始化HC-SR04的GPIO,Trig引脚设置为推挽式输出,Echo引脚设置为浮空输入。另一部分是初始化TIM2。初始化TIM2之后,没有立即使能,而是等到Echo接收到高电平的时刻,开启TIM2。, _3 B. T) n1 y9 U. z: E) j
  1. /*
    : j0 p. h0 ~0 ~! e1 u( D/ [. Q
  2. *==============================================================================
    ; H4 |: U: ~# K
  3. *函数名称:Drv_Hcsr04_Init0 l% ?9 ~8 u% y, p  I
  4. *函数功能:初始化HC-SR04
    : X7 n% i( v& o  u# |. a( k& e3 A
  5. *输入参数:无
      m; y1 D6 P; O9 _
  6. *返回值:无
    - |* P5 ?8 j7 }. b2 Y4 z
  7. *备  注:初始化HC-SR04引脚的同时,初始化了TIM2,用来记录高电平持续时间
    5 r; T* S% z# Q3 u# \3 s
  8.           初始化完TIM2后,没有使能,当Echo收到高电平后使能
    $ c. _9 j. D7 z/ F5 {6 Y" H0 S; h# Q
  9. *==============================================================================
    9 i$ }$ ^4 V1 t6 U; t
  10. */2 p7 a4 i1 I3 T
  11. void Drv_Hcsr04_Init (void)   // Hc-sr04初始化8 j3 p! \  ~1 l0 }  g, {* O1 B
  12. {   
    ( e: `" a5 Z! V& }' n
  13.     // 结构体定义" r" \! T$ o: Y9 K
  14.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;   // 生成用于定时器设置的结构体  
    5 R) V8 y8 z# s7 [
  15.     GPIO_InitTypeDef GPIO_InitStructure;   // GPIO结构体
      x9 q* X+ D' p" |3 ^
  16.     NVIC_InitTypeDef NVIC_InitStructure;   // NVIC结构体
    3 p* M4 W  u3 [* z  f
  17.     RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);   // 使能GPIO时钟8 n8 d; _7 H# J6 d$ h: I" x! N
  18. ) }' Y6 J/ F6 T# X; y# ~
  19.     // GPIO初始化  
    5 ]& e0 F% U$ T6 |! M6 f
  20.     GPIO_InitStructure.GPIO_Pin =HCSR04_TRIG;   // 发送电平引脚  
    " w4 [# @& M2 {* i; x3 Z
  21.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
    ! W  Q/ u. w, l+ M2 O
  22.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   // 推挽式输出  
    : A" f- Z' d% F8 L5 L
  23.     GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);  $ G" h4 N2 z3 M+ A0 W$ I9 |
  24.     GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);  
    7 c' }2 L* U8 _9 Z+ `* j' t( P
  25.          3 _1 d, G$ [. f: v& [9 E, w; \
  26.     GPIO_InitStructure.GPIO_Pin = HCSR04_ECHO;   // 返回电平引脚  6 b; C& O7 X; N, K3 G, T1 q' X
  27.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   // 浮空输入  2 g, L" P* w+ m5 @  o0 ^, S" V( f! J
  28.     GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);    . i" b/ [- x2 a( w
  29.     GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);      
    4 y5 K3 Y" X8 l
  30.          ) n" \6 F3 l1 v: i. K
  31.     // 定时器初始化 使用基本定时器TIM2  " K+ W9 @$ a: K
  32.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);   // 使能对应RCC时钟  / S/ E; r" d; h3 H$ N2 Z, |
  33.     // 配置定时器基础结构体  
    1 H0 s2 q4 ], O0 }' N: B& k4 x
  34.     TIM_DeInit(TIM2);  
    ; M6 ^" L/ W; v. D# G
  35.     TIM_TimeBaseStructure.TIM_Period = (1000-1);   // 设置在下一个更新事件装入活动的自动重装载寄存器周期的值(计数到1000为1ms ) 8 ?7 [6 b; l$ k( s
  36.     TIM_TimeBaseStructure.TIM_Prescaler =(72-1);   // 设置用来作为TIMx时钟频率除数的预分频值  1M的计数频率 1US计数  $ W+ a% {* x7 n* U# b1 V1 a
  37.     TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;   // 不分频  
    ( [7 Z( R* O7 s
  38.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   // TIM向上计数模式  ) r* {# p2 e! w* F
  39.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);   // 根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位         
    % i- b4 ^5 r- f& N; D
  40.                 0 l" X. W# U7 |& [7 R0 s- X: c
  41.     TIM_ClearFlag(TIM2, TIM_FLAG_Update);   // 清除更新中断,免得一打开中断立即产生中断  
    * u2 l$ B2 |$ u/ L/ E
  42.     TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);   // 打开定时器更新中断  
    8 V- p4 p% }5 T' C

  43. $ |3 f# l9 K. `" z5 e9 S# P
  44.     // NVIC配置      
    . U. v+ k+ D( s, G6 i" N0 l; @
  45.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   // 设置中断优先级分组为组2:2位抢占优先级,2位响应优先级 & b" I; [2 `1 t0 T) n
  46.         / h9 S' T4 e  N5 c( p
  47.     NVIC_InitStructure.NVIC_IRQChannel =TIM2_IRQn;   // 选择定时器2中断  ! D1 ?0 N7 a  j" Q; t) z; q
  48.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   // 抢占式中断优先级设置为0  
    * A) r$ c% x+ o( @4 \* M1 Y1 M  C
  49.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   // 响应式中断优先级设置为0  
    0 Z* _6 `% h* c8 h
  50.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   // 使能中断  
    8 ?! h& Z0 J2 L& j: s
  51.     NVIC_Init(&NVIC_InitStructure);  7 _7 F9 |& ]& z  n- q, Q; @
  52.    
    . x5 \+ C) B) y$ g/ Y8 J
  53.     TIM_Cmd(TIM2,DISABLE);      
    ( R/ w% x" r4 H3 L# |0 P6 J, _
  54. }
复制代码

' D' S: Z* N0 F) ]/ I" T$ L  y4.2 TIM开关程序
; f% ^" m# J9 c- U; Q* g+ b
  1. /*
    / ]8 ^9 k6 D# ^" t! H
  2. *==============================================================================% j, k# p) c$ N
  3. *函数名称:Drv_Hcsr04_OpenTimerForHc
    : Z" @& w6 Z* M  n
  4. *函数功能:打开定时器1 ~0 L  I/ |+ r: P
  5. *输入参数:无
    9 }4 i% f* m+ D' V9 U# X
  6. *返回值:无
    0 A' J0 o; `. ]+ ?- p6 ~4 s
  7. *备  注:无
    - V7 ~3 p0 u% M; ?! J4 S0 J
  8. *==============================================================================9 Y# k( Z8 s4 P% f5 c% k7 f
  9. */: c- u+ D% d& x, A5 p& k6 r
  10. void Drv_Hcsr04_OpenTimerForHc (void)   // 打开定时器  
    % a" {8 g3 l: `/ _
  11. {  
    & z. }# Z7 G5 l! x# q( B* c! H; T
  12.     TIM_SetCounter(TIM2,0);   // 清除计数  * l- [- A* q; ]4 X
  13.     gMsHcCount = 0;    h0 a% P, b5 v( T/ x. s6 }
  14.     TIM_Cmd(TIM2, ENABLE);   // 使能TIMx外设  
    * R) l% f3 l1 o( B8 \& G
  15. }
    0 T1 v# z+ r& m: m
  16. /*
    ( }. `6 R# a% o6 S7 z
  17. *==============================================================================" c, Q: r; O' L1 O& ~" x5 m
  18. *函数名称:Drv_Hcsr04_CloseTimerForHc$ J* o4 ?: t: d7 ~9 }; N1 }0 E
  19. *函数功能:关闭定时器# j% G( p$ n9 J8 U, ]
  20. *输入参数:无' n2 ?- B: X  z" }
  21. *返回值:无
    2 t% y5 i' U- ]) ~! D# e/ Z" p) m
  22. *备  注:无- ~, e5 A$ s" q" K# p9 z
  23. *==============================================================================
    5 |  Q# M1 V- `; G
  24. */1 t+ [. S& V$ G/ C0 _9 e( V6 ?
  25. void Drv_Hcsr04_CloseTimerForHc (void)   // 关闭定时器  9 H) t- _8 R: t3 _! z
  26. {  
    . ^) o3 [' s6 T5 h) A' o
  27.     TIM_Cmd(TIM2, DISABLE);   // 使能TIMx外设  
    8 p7 K0 ]3 U. f# O, H6 v8 V
  28. }  
复制代码

& i5 Y& c; e0 D定时器中断服务函数如下4 y4 _5 T. }! a5 w, o) |9 ~
  1. /*. w/ b* |5 s" h% i9 f
  2. *==============================================================================) w4 j* \1 H3 ]. [6 P
  3. *函数名称:TIM2_IRQHandler) g0 T4 h2 k1 ~: R/ p
  4. *函数功能:定时器2中断服务程序
    % y' t+ F; F- ]! X8 ~5 U
  5. *输入参数:无
    8 F+ a, h: m; e9 K. ?+ T
  6. *返回值:无5 U, T: O6 [8 I  Y. ]
  7. *备  注:无+ Y- j+ ^( d4 u$ |. v' n$ H3 V( U
  8. *==============================================================================+ T$ c: H4 c/ v
  9. */
    1 [; {9 f& b7 j5 w. q
  10. void TIM2_IRQHandler (void)   // TIM2中断  
    * |8 Y0 }  l  d8 T, V
  11. {  8 z: {  W( R& Y: }  }
  12.     if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)   // 检查TIM2更新中断发生与否  
    6 }4 a2 j7 Q0 c7 v# ?2 \; j
  13.     {  
    2 g/ a3 b1 n* d9 z$ c
  14.         TIM_ClearITPendingBit(TIM2, TIM_IT_Update);  // 清除TIMx更新中断标志   
    $ ?# Q/ q$ V/ U* v
  15.         gMsHcCount++;  1 W# ?  J$ ]  g# p! p4 }
  16.     }  
    6 p+ m2 v7 {+ W4 F/ y+ P& S7 o. o
  17. }   
复制代码
, N# Z/ ~5 z0 H
4.3 获取定时时间. i) I( c& d4 j' `! W/ B+ U
  1. /*" y0 w9 o# o3 I" f* _9 \% F
  2. *==============================================================================* _9 C/ ?4 p/ S' X; e- g& f" w
  3. *函数名称:Drv_Hcsr04_GetEchoTimer, a+ O* j4 A6 c  u" V
  4. *函数功能:获取定时器定时时间
    ; ]8 j5 y) t7 ?/ {
  5. *输入参数:无
    * w4 f# s( W: |
  6. *返回值:无8 v% N: V5 s4 j6 S0 }! E2 N9 E
  7. *备  注:无
    % t* z& i* W/ `  o
  8. *==============================================================================
    ! c' c8 i/ |9 P$ U4 n0 f( E+ k
  9. */# A5 d( S# P$ @) u" B! @  T2 e
  10. u32 Drv_Hcsr04_GetEchoTimer (void)  0 x+ W9 Q6 ~0 c0 k6 `5 O+ @/ w
  11. {  " d* H+ O% a+ z/ I
  12.     u32 t = 0;  
    3 h- F/ `. j5 q0 `9 @
  13.     t = gMsHcCount * 1000;   // 得到MS  
    4 q2 \7 {/ v8 t* J! v6 u) _# Y
  14.     t += TIM_GetCounter(TIM2);   // 得到US  9 x& [" |; l: ~% a- T% Q) M
  15.     TIM2 -> CNT = 0;   // 将TIM2计数寄存器的计数值清零  
    / U% m* B3 e1 o2 y
  16.     delay_ms(50);4 Y4 W* V8 e% A4 ^6 X' o7 A5 U
  17.     return t;  
    ! e& Y3 {7 f) {+ j( l
  18. }
复制代码

. ^3 }2 F) f) r' @) s4.4 计算测量距离4 t" j( d9 I* h8 v, ?& l6 ~- o
  1. /*
    9 [' x3 Y3 M+ |7 T: v# R9 ]" s
  2. *==============================================================================
    2 g; Q% A! `) d- Q9 u5 M
  3. *函数名称:Med_Hcsr04_GetLength
    ! d! [9 S& c/ G! o7 I
  4. *函数功能:获取测量距离
    3 q$ _' L+ M1 E5 }$ O' x
  5. *输入参数:无! S, ^& Y1 g: w1 x; e2 A
  6. *返回值:无
    4 |! @) Z4 R5 p& o
  7. *备  注:一次获取超声波测距数据 两次测距之间需要相隔一段时间,隔断回响信号
    . ^5 W) Y5 m, H# {6 X# J6 R
  8.                     为了消除余震的影响,取五次数据的平均值进行加权滤波
    " N, T7 n0 p6 C; Q( L
  9. *==============================================================================
    ; j$ h. h' y, F$ j9 ]) U1 x
  10. */
    + `" K' ^! G$ x3 e& W( g
  11. float Med_Hcsr04_GetLength (void )  
    9 ?3 h. R% m( k. Y# H$ C) u- X
  12. {  5 k8 N  J- S  [% G9 x9 i4 ~0 r
  13.     u32 t = 0;  7 D# f2 x3 F: [! L7 y" V* I0 n
  14.     int i = 0;  
    : ^7 r% r/ R" h$ J/ G
  15.     float lengthTemp = 0;  
    7 L3 L" }! G0 k4 i% m- F
  16.     float sum = 0;  % |( [1 a3 E* m5 }
  17.     while(i!=5)  
    # m% x0 t4 l  ?8 a
  18.     {  
    + y0 s( K1 k5 j) B0 F
  19.         TRIG_Send = 1;   // 发送口高电平输出  ; s. o/ o1 Z+ Y: M: Z& D: ~
  20.         delay_us(20);) {( y! V: ]( G" ~  C9 T
  21.         TRIG_Send = 0;  0 x9 k" p# A7 A2 m
  22.         while(ECHO_Reci == 0);   // 等待接收口高电平输出  
    ! t* }/ P! B6 k* S
  23.         Drv_Hcsr04_OpenTimerForHc();   //打开定时器  
      D7 _1 W8 E& b8 C, T; s
  24.         i = i + 1;  , S3 Y# O; v: _+ c
  25.         while(ECHO_Reci == 1);  
    9 L5 Z! Z; j- R4 X6 U( A# [
  26.         Drv_Hcsr04_CloseTimerForHc();   // 关闭定时器  " o# m" c2 m: e4 d
  27.         t = Drv_Hcsr04_GetEchoTimer();   // 获取时间,分辨率为1us  z' W0 N$ `; s$ Y0 `: }
  28.         lengthTemp = ((float)t/58.0);   // cm  
    8 A' |6 H$ v" \: j- f
  29.         sum = lengthTemp + sum ;        
    6 l: ^. x6 a/ }5 g+ {4 g
  30.         }  
    0 p; S2 u. V% F# F5 c
  31.     lengthTemp = sum/5.0;  * J, `6 `. ~" k% _7 Z
  32.     return lengthTemp;  + i2 J4 h' n. m* A
  33. }
复制代码

% E" \  N: n/ g' d; K- |2 E9 ?: P4.5 宏定义
; {8 _! O+ B5 q
  1. #define HCSR04_PORT   GPIOB   // 定义IO口
      N5 U! c/ U# S/ Q% n! ]
  2. #define HCSR04_CLK    RCC_APB2Periph_GPIOB   // 开启GPIO时钟  " L; D6 a- U- s! D' N
  3. #define HCSR04_TRIG   GPIO_Pin_8   // 定义Trig对应引脚0 ^; q3 A  I7 l# z
  4. #define HCSR04_ECHO   GPIO_Pin_9   // 定义Echo对应引脚0 Z% o& `3 }/ z: M# N' _5 `; ]/ s
  5.   
    8 {6 w; v+ k7 @5 I' l/ T
  6. #define TRIG_Send  PBout(8)   // 将TRIG_Send映射到PB87 E$ d+ p8 C( Y9 [
  7. #define ECHO_Reci  PBin(9)   // 将ECHO_Reci映射到PB97 Q5 B3 }9 [9 T- b1 v0 j/ B7 F" s

  8. 8 U% i0 y% N  q3 U% r, \
  9. void Drv_Hcsr04_Init(void);   // Hc-sr04初始化
    & q/ X* Y* f) q# N/ m
  10. void Drv_Hcsr04_OpenTimerForHc (void);   //打开定时器! M6 L" ~5 [) {9 N3 W2 s+ g3 I
  11. void Drv_Hcsr04_CloseTimerForHc (void);   //关闭定时器3 J6 n) C+ g# I
  12. u32 Drv_Hcsr04_GetEchoTimer(void);   // 获取定时器时间
复制代码
  i% A; a3 }6 Z
. q9 _4 \6 R4 d  A5 |
五、应用实例
4 _2 p# ~! b8 }5 ]4 K' h利用串口打印距离信息,main函数如下6 K) H& h9 M' ~; d; z7 b
  1. float gDistance = 0;   //定义获取返回距离变量) O3 t5 Q- N. z; o( {* t2 ]
  2. $ |  `- G. [1 a/ T4 v; w& V
  3. int main(void)2 V5 i& m9 n& F( @  i# ]
  4. {
    + E5 D9 K: p. P
  5.     Med_Mcu_Iint();   // 系统初始化
    ; k2 f5 s3 v; m5 l) R
  6.     4 `: c0 W4 l* V+ `8 z' a
  7.     while(1), T  q* P0 X1 b, b1 v, }9 _
  8.   {0 W6 y' g0 D; H$ e4 o  p+ Q5 n% u2 ~
  9.         gDistance = Med_Hcsr04_GetLength();   //获取返回距离
    . `+ T7 Y  Y1 B/ o# Z: p2 B; e: A
  10.       printf ("距离为:%.3f cm\n",gDistance);   //串口打印返回距离
    1 X$ s4 V1 c  L( ^' |
  11.         
    - L9 l( _3 A( @* w' g) ?% ?
  12.         delay_ms(500);   //延时500ms = 0.5s
    $ C2 X6 m( Y3 @' `+ l, |4 W& `. _7 R
  13.     }# l( p0 q1 s9 N: N  l) x9 N5 k/ k' A
  14. }
复制代码
$ s0 Q) r1 ~% T
六、拓展应用
  g- z: x0 o9 [4 C超声波测距比较常用的,比如利用超声波测距模块实现智能车的自动避障,这个在后续实战项目系列中会有,在此就不再详细介绍了。主要思路就是根据HC-SR04测得的与障碍物的距离,来决定是否要停止或转弯,以及往哪边转弯。5 Q& K# @, ~# n6 o* F
' e, r2 B6 Q4 G/ W- m6 \8 Y% Y
转载自:二土电子) ^& X! n, m( B
如有侵权请联系删除
5 g7 o5 T9 C2 I6 ]* R- v2 C
7 x. ]0 x9 t! g+ E

  @: F5 ^" [, M$ u
收藏 评论0 发布时间:2023-10-23 23:36

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版