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

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

[复制链接]
攻城狮Melo 发布时间:2023-10-23 23:36
一、超声波测距基本原理
, a6 ^9 L3 D/ [  u% z超声波测距的原理非常简单,超声波发生器在某一时刻发出一个超声波信号,当这个超声波信号遇到被测物体后会反射回来,被超声波接收器接收到。这样只要计算出从发出超声波信号到接收到返回信号所用的时间,就可以计算出超声波发生器与反射物体的距离。2 P; {. m: T$ ~4 o  g9 u. Y

: O% U5 o7 k2 V+ z6 R5 Y, ]# P# W距离的计算公::d=s/2=(c*t)/28 i/ T9 o. {5 {- u) c5 ?7 k! z4 l
3 N0 b/ O, R0 k4 Q1 q
其中 d 为被测物与测距器的距离,s 为声波的来回路程,c 为声波,t 为声波来回所用的时间。1 D+ V% {  [$ n7 J6 U
0 b, ^" P1 z+ G3 V" ~
由于超声波也是一种声波,其声速 c 与温度有关,在不同温度下的超声波声速不同。在使用时,如果温度变化不大,则可认为声速是基本不变的。如果测距精度要求很高,则应通过温度补偿的方法加以校正。声速校正后,只要测得超声波往返的时间,即可求得距离。不同外温度下的超声波声速表如下% r; J6 @& X& |% \. ~3 ?. n! o, q

2 b9 \% N( c' K, }* f
微信图片_20231023233556.png

: y, Y9 F! C) @( s3 _
不同温度下超声波声速表
* X/ a( t2 S8 X
& M0 f: g( n- r  k% L" O
补充说明3 J4 c2 j9 V- n5 |# X& o
最近在问答区发现有小伙伴疑惑为什么在计算距离时是根据Echo输出的高电平持续时间来计算距离。这里简单解释一下,仅供参考
& S, t& m5 }/ S! A* n! Y1. 实际超声波测距的原理就是上面介绍的,记录的时间是从超声波发出到回波被接收的时间,然后这个时间除以2,再乘超声波的传播速度得到距离。超声波测距模块实际也是这么做的。模块内部会记录超声波发出的时刻,在接收到回波后会立刻以高电平的形式从Echo引脚输出高电平,高电平的持续时间就是超声波从发出到被接收到的时间间隔。这么做是模块为了方便单片机处理,快速得到超声波从发出到被接收到的时间间隔。; {4 X! v* W4 b9 k7 E
+ {% l$ P* q: Q# D3 I* p' ], g! h
2. 实际大家可以自己测试一下,初始化一个定时器,从给Trig引脚10us高电平结束时刻开启定时器,到Echo引脚接收到高电平的时刻停止计时,用这个时间来计算距离,实际和用高电平持续时间来计算距离得到的结果基本是相同的。
3 q% G# |# k6 Q1 w, V% x  r
5 x$ Y( t& D: T9 I& i
3. 给Trig引脚10us高电平并不是说只发送10us的超声波。10us的高电平是为了触发模块工作。10us高电平结束后,模块会发送一个8个40KHz的方波。
2 r' g3 ~2 R0 z0 f' [/ Y8 \7 i$ M% g
# v; u) G! M  C' f2 q) I
二、超声波传感器简介, f* r. a" E' @$ ]
总体上讲,超声波发生器可以分为两大类:一类是用电气方式产生超声波类是用机械方式产生超声波。电气方式包括压电型、磁致伸缩型和电动型等:机械方式有加尔统笛、液哨和气流旋笛等。他们所产生的超声波的频率、功率和声波特性各不相同,因而用途也各不相同。目前较为常用的是压电式超声波发生。
% W7 g5 N) ^  a: r' p

. y; x" m, [/ i' G4 J1 Q压电式超声波发生器实际上是利用压电晶体的谐振来工作的。它有两个压电晶片和一个共振板。当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,便产生超声波。反之,如果两极间未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收器了。这里介绍的是一个超声波测距模块——HC-SR04。7 a) A! V+ F; o9 a5 d
/ R/ V$ Q  I. m
微信图片_20231023233600.jpg

2 l# e9 }" y* H; D0 I
HC-SR04
  v0 \2 }% ^. |9 e* S9 W% @; ~
" A3 a8 _: |$ y( o
0 V6 {0 c( K. i
三、HC-SR04测距实现思路( U& x1 V1 ^! Q0 o2 y# P, \
这里就不再针对HC-SR04模块的原理和电路做详细介绍了,直接介绍利用该模块实现测距的思路。该模块有四个引脚。
; N" B- x' }2 E$ T• VCC —— 通常是5V供电. J$ C0 D  g$ j5 o# X$ Z
• GND —— 地) a3 ?5 I" D1 S# O  C4 E/ O
• Trig —— 给该引脚大于10us的高电平,超声波发射头会发送一个超声波信号: |$ Q. e0 s; b2 d
• Echo —— 该引脚在接收到返回的超声波信号后会变为高电平3 o# [6 v$ y+ k$ u, m  I' B; {
5 a- `% N; X% K3 r- u! x
Echo接收到的高电平持续时间即为超声波一个来回所用的时间,利用该时间除以2再乘上光速,即可得到测量距离。
. l; f8 Q' O2 V; |: \
' ~" h, n" e+ z3 ~! \

  T, ]' [, M2 S- F( u四、超声波测距程序实现0 n, I) D! y0 X
4.1 HC-SR04初始化程序
# t/ W  [) u' y2 J% d9 L! w
HC-SR04初始化程序主要包括两部分,一部分是初始化HC-SR04的GPIO,Trig引脚设置为推挽式输出,Echo引脚设置为浮空输入。另一部分是初始化TIM2。初始化TIM2之后,没有立即使能,而是等到Echo接收到高电平的时刻,开启TIM2。, R* O  u7 S& Q, J% D& G0 T$ n
  1. /*. @  K4 f' O1 h8 ^
  2. *==============================================================================
    8 y( l" M; }& ~4 v5 w
  3. *函数名称:Drv_Hcsr04_Init
    ) @/ s) @; {8 u, Q' ~  c/ j
  4. *函数功能:初始化HC-SR04
    ) a2 j8 v. l! z. D
  5. *输入参数:无
    ( W1 P* A8 K: [% q
  6. *返回值:无5 D7 V* w7 M5 D: A
  7. *备  注:初始化HC-SR04引脚的同时,初始化了TIM2,用来记录高电平持续时间% D# A7 `5 n3 C* _. i0 d
  8.           初始化完TIM2后,没有使能,当Echo收到高电平后使能! k( n- U$ d3 u4 h, A5 }& W8 o- H' |
  9. *==============================================================================
    6 ]& z  {1 t* V( J9 O
  10. */9 m$ J. _( O4 q# x+ ?, d
  11. void Drv_Hcsr04_Init (void)   // Hc-sr04初始化
    ) j4 t3 z7 L) |/ `! c
  12. {    9 `  F# S5 p, a5 p0 ?  H4 l
  13.     // 结构体定义
    9 p+ p; ~$ x/ l- W
  14.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;   // 生成用于定时器设置的结构体  
    0 O5 u( f) _, @2 R8 y! `
  15.     GPIO_InitTypeDef GPIO_InitStructure;   // GPIO结构体
    9 k. D% v0 w. {- K; q( r' t
  16.     NVIC_InitTypeDef NVIC_InitStructure;   // NVIC结构体3 _* g9 @! F8 B8 l; I0 U
  17.     RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);   // 使能GPIO时钟
    ! I1 P4 V% Q# h4 H2 c& V7 {7 O- s
  18. : j  N, k! H/ v' R7 S' J- g5 c
  19.     // GPIO初始化  
      s$ l3 p' I8 m$ R$ F  R
  20.     GPIO_InitStructure.GPIO_Pin =HCSR04_TRIG;   // 发送电平引脚  ; |' t! M) t5 [; e2 |2 `. D
  21.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  9 t  \- I# g4 [0 j  g, K3 ?9 B5 g
  22.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   // 推挽式输出  , c$ L% [. K8 j% Y. g$ W
  23.     GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);  - D% }$ }- \. l4 F! L
  24.     GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);  
    6 T4 F7 S' U& }; K& _8 P
  25.          $ S$ ]( s/ s$ }& ]8 u2 y. T/ R
  26.     GPIO_InitStructure.GPIO_Pin = HCSR04_ECHO;   // 返回电平引脚  
    : R2 Z# g8 _) Y* u/ F
  27.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   // 浮空输入  
    & b' _  ^0 n6 ^9 ^( ]4 f
  28.     GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);   
    3 D& f# b1 D, }( p0 h  K( v
  29.     GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);      + [: c- C1 r& T$ r
  30.          & O$ g) Y( s/ [: P. R
  31.     // 定时器初始化 使用基本定时器TIM2  
    5 n) @4 ?/ p' J: R' O* I
  32.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);   // 使能对应RCC时钟  
    5 ^! E. G, k. p. z3 h
  33.     // 配置定时器基础结构体  
    5 a. ^8 ]1 S4 G3 ?
  34.     TIM_DeInit(TIM2);  ( G% ]4 w9 l8 Y
  35.     TIM_TimeBaseStructure.TIM_Period = (1000-1);   // 设置在下一个更新事件装入活动的自动重装载寄存器周期的值(计数到1000为1ms )
    , n5 c* W: H6 _: W, ~' `
  36.     TIM_TimeBaseStructure.TIM_Prescaler =(72-1);   // 设置用来作为TIMx时钟频率除数的预分频值  1M的计数频率 1US计数  
    0 X8 |; m4 e. G) }) p2 _$ ^
  37.     TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;   // 不分频  
    # H; L8 J' P/ ~
  38.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   // TIM向上计数模式  
      r! B3 \, N, T( e2 d# n
  39.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);   // 根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位         
    $ ]0 y5 f" n/ }. _8 R
  40.                 $ |; }! m, x6 f) d/ X
  41.     TIM_ClearFlag(TIM2, TIM_FLAG_Update);   // 清除更新中断,免得一打开中断立即产生中断  4 \: Y9 H) c/ C3 y% }. Z
  42.     TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);   // 打开定时器更新中断  
    0 |1 q! ]( O( V+ [7 v

  43. 8 X+ ~2 j% U3 o' P
  44.     // NVIC配置      3 j, |- y3 m. z
  45.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   // 设置中断优先级分组为组2:2位抢占优先级,2位响应优先级 / J' ^: H3 [6 w. N( r
  46.         $ D5 u5 |3 V5 N& \6 G, j
  47.     NVIC_InitStructure.NVIC_IRQChannel =TIM2_IRQn;   // 选择定时器2中断  / L5 B  g5 y1 Y0 j/ C' f
  48.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   // 抢占式中断优先级设置为0  
    % h& w: u9 ^0 i3 ?1 z! w6 ], J
  49.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   // 响应式中断优先级设置为0  
    : i3 S/ X7 P  f! ~3 d: n
  50.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   // 使能中断  
    5 Y3 f) ~* e5 f1 G
  51.     NVIC_Init(&NVIC_InitStructure);  
    7 g2 o8 x" R$ m, A- K8 u: {5 s
  52.     9 U2 L, i) u  |- _5 U1 `3 R
  53.     TIM_Cmd(TIM2,DISABLE);       6 x1 l+ k) E) w
  54. }
复制代码

( a0 p# {, |3 \' h, S' G' Z4.2 TIM开关程序/ L  R7 c! G/ w: G8 m( K
  1. /*5 C8 F9 C* M9 P# [
  2. *==============================================================================
    3 u. h2 h5 G- i) p2 A# Y+ a
  3. *函数名称:Drv_Hcsr04_OpenTimerForHc
    5 J+ E1 {* W- d/ a- N" g1 f9 D
  4. *函数功能:打开定时器
    * v5 Z( J' |+ O5 E5 F. u' j3 e1 y
  5. *输入参数:无; L" {2 }; T9 ^% N# W2 c+ X
  6. *返回值:无
    2 T$ y3 J0 l. v: p' y1 V) B$ E1 u& a5 r) `
  7. *备  注:无. t* K+ z: e( }4 a
  8. *==============================================================================; S2 t, ?+ b. W/ X
  9. */
    3 I! U# E4 }" a" t/ Q
  10. void Drv_Hcsr04_OpenTimerForHc (void)   // 打开定时器  
    ; l  p! O' u1 x  F+ g' s
  11. {  
    . ^, V% d5 k( j$ F# C0 `
  12.     TIM_SetCounter(TIM2,0);   // 清除计数  # D1 J; k8 i  N* A$ _! i
  13.     gMsHcCount = 0;  
    # ?/ a9 G' V5 V; Z" ]: g
  14.     TIM_Cmd(TIM2, ENABLE);   // 使能TIMx外设  
    6 L% u' [3 t+ Q' [' B! Y( E
  15. }
    . D8 v8 B% p0 f  i- _
  16. /*- X4 \# m1 P/ i7 D' c
  17. *==============================================================================
    * _! A5 j( v; y
  18. *函数名称:Drv_Hcsr04_CloseTimerForHc
    ( _; |( I' I3 \. q+ z3 s8 N. C
  19. *函数功能:关闭定时器
    . L( o" W  ]( N4 B" b
  20. *输入参数:无4 ]( ]3 P( J5 a3 u- p
  21. *返回值:无
    * n) R8 Q* J; [9 B6 Q" Z/ `3 ?
  22. *备  注:无
    , R5 Q% e& A( m+ R: O, d$ k
  23. *==============================================================================
    $ H* t- f0 i# R5 S3 z+ B
  24. */; b/ B/ m! J: h$ R, A' `
  25. void Drv_Hcsr04_CloseTimerForHc (void)   // 关闭定时器  7 }$ O3 u8 @6 e% h, }; W' _
  26. {  
    2 f4 G, Y6 y2 ]: H. }
  27.     TIM_Cmd(TIM2, DISABLE);   // 使能TIMx外设  , j4 @& |8 ^* y' k" W6 `4 }
  28. }  
复制代码

& G& f, V; C9 E) v' R定时器中断服务函数如下! R3 f' y- q1 r! N5 A- `: p
  1. /*: g. k) g4 O- O3 R( Z
  2. *==============================================================================* u  ?4 l3 O7 V% S: z0 ]6 |
  3. *函数名称:TIM2_IRQHandler
    + Q+ s( g, i- c( i+ E& @
  4. *函数功能:定时器2中断服务程序
    , K+ Q, D8 ~: A" h
  5. *输入参数:无
    2 d* ^" y: H6 ~' J' a& q( \  ^
  6. *返回值:无- G" A  w3 _# N3 |6 Q& x& L* Q
  7. *备  注:无( F% l/ d8 b- e% H- j, L3 R
  8. *==============================================================================( L% S( }0 r. p3 E1 y5 r
  9. */
    7 C9 |% |0 D, M
  10. void TIM2_IRQHandler (void)   // TIM2中断  
    1 y  Q! Z7 n- C8 m4 q
  11. {  
    * _* z7 B  R5 }+ L; _
  12.     if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)   // 检查TIM2更新中断发生与否  
    & ^$ e; O. p4 O3 b0 J; j) t" ]- o
  13.     {  8 {7 P/ b5 B4 A6 ]- s
  14.         TIM_ClearITPendingBit(TIM2, TIM_IT_Update);  // 清除TIMx更新中断标志   
    8 k& }8 w; O% X6 z3 F
  15.         gMsHcCount++;  ; Z- E& p! `* Z0 H1 S8 }/ n
  16.     }  0 j* [: T/ [1 i/ b' l
  17. }   
复制代码
2 c9 |4 y0 }# |3 K0 i# [
4.3 获取定时时间
. Y% R  Z, D/ K5 B) J& T9 \& {0 W
  1. /*" T6 L5 m# _& M3 t. x
  2. *==============================================================================  {" a5 N; o, N# R/ j! J
  3. *函数名称:Drv_Hcsr04_GetEchoTimer
    - |5 L9 [0 O" u9 X! ]' X6 Y$ w
  4. *函数功能:获取定时器定时时间 7 _% b2 T0 l* o3 k9 G- Z( K
  5. *输入参数:无
    # H/ a: Z6 _- J7 D) Z. K  y' n
  6. *返回值:无, T2 F( C, |: ~' P7 e0 q
  7. *备  注:无" J1 ^3 i" U3 p' l3 z
  8. *==============================================================================
    ( W7 D2 Z) |1 Q8 }0 Q  m
  9. */
      K9 q' y  D- S8 w3 w2 R4 [4 m* B$ Q
  10. u32 Drv_Hcsr04_GetEchoTimer (void)  $ D4 `5 l. Q2 I
  11. {  ! G3 i6 D2 p/ k: _) m
  12.     u32 t = 0;  
    # G* ?' `3 O, X- Z
  13.     t = gMsHcCount * 1000;   // 得到MS  
    / B; @- M( @9 l' r
  14.     t += TIM_GetCounter(TIM2);   // 得到US  
    7 ~! k2 v- o. b; `9 K0 ^
  15.     TIM2 -> CNT = 0;   // 将TIM2计数寄存器的计数值清零  - B. F% \# F& X3 n' Q
  16.     delay_ms(50);
    - |. h; {2 P3 A, c( V4 O9 G& A
  17.     return t;  5 ]- m% \! j2 ?8 P' W
  18. }
复制代码

* l, E$ R* z7 Y, i/ z  u% w4.4 计算测量距离* h" {4 T5 \9 ?6 [# Q( N
  1. /*
    ' ~3 t7 q. ^$ b* t- B$ ~" q5 x! _1 m
  2. *==============================================================================1 d  m' r. w( u6 Q; {7 Q$ C
  3. *函数名称:Med_Hcsr04_GetLength
    " X9 T% m2 ^7 [' Z/ }9 J3 d$ v; t+ B
  4. *函数功能:获取测量距离& x: f. B% W& P, n; [/ p+ V) \
  5. *输入参数:无; Z, z( e/ `; z5 d6 d
  6. *返回值:无
    7 {- d3 l3 g+ W% Z3 A
  7. *备  注:一次获取超声波测距数据 两次测距之间需要相隔一段时间,隔断回响信号+ Z+ h  |3 @/ U$ M+ K; k
  8.                     为了消除余震的影响,取五次数据的平均值进行加权滤波- m, O6 W0 |: s: D! X
  9. *==============================================================================! M$ ]# b9 `! v
  10. */! d  X1 O! ^$ O& `$ y
  11. float Med_Hcsr04_GetLength (void )  
    8 Z4 `2 k, }4 ]" R) [
  12. {  
    " o) ]1 P& T/ Y' P
  13.     u32 t = 0;  
    8 t* @: ~* a2 ]- }% A# n/ `
  14.     int i = 0;  % t8 @# |1 D- ?; F
  15.     float lengthTemp = 0;  . n, k2 m& E- n6 s5 K7 Z4 u
  16.     float sum = 0;  
    " D: V& p2 s' @( I( Z/ H
  17.     while(i!=5)  / N  O' n+ n& _. m/ ~
  18.     {  
    9 c  b1 y+ w% O% d# T; d6 F) r9 y
  19.         TRIG_Send = 1;   // 发送口高电平输出  , }, z  f8 [  Z+ u8 d' j# S
  20.         delay_us(20);
      m) {! a, c( V
  21.         TRIG_Send = 0;  , w/ s9 a1 m& F
  22.         while(ECHO_Reci == 0);   // 等待接收口高电平输出  
    % _' n! G( S  D2 I" c7 K
  23.         Drv_Hcsr04_OpenTimerForHc();   //打开定时器  
    + ~* \6 `4 B9 y3 T/ U. m. g
  24.         i = i + 1;  
    0 M+ d4 R! f& P# X5 S
  25.         while(ECHO_Reci == 1);  
    / f8 |& u& }1 ~9 @+ T
  26.         Drv_Hcsr04_CloseTimerForHc();   // 关闭定时器  
    ; s5 l7 g/ q3 Y' {2 {8 t7 _  l
  27.         t = Drv_Hcsr04_GetEchoTimer();   // 获取时间,分辨率为1us+ H8 P4 E* m* a0 r4 z/ f/ n" Q5 z
  28.         lengthTemp = ((float)t/58.0);   // cm  
    3 ]. S$ Q1 [7 |2 {1 w% |2 F) |
  29.         sum = lengthTemp + sum ;        ; P0 N0 u! D, Z/ I- }/ I, b
  30.         }  
    , E% K/ I  `$ s: |! }& Y5 G
  31.     lengthTemp = sum/5.0;  
    % O* W- f! z4 P) f0 s$ x
  32.     return lengthTemp;  
    + k* b0 x, T8 s9 m
  33. }
复制代码

$ w; x8 Q6 y1 X4.5 宏定义, x7 V* Q% A! F2 ^6 J
  1. #define HCSR04_PORT   GPIOB   // 定义IO口; M+ n+ |: F: j/ w1 F5 p
  2. #define HCSR04_CLK    RCC_APB2Periph_GPIOB   // 开启GPIO时钟  / b$ Y7 U$ @) S& X' j3 ^
  3. #define HCSR04_TRIG   GPIO_Pin_8   // 定义Trig对应引脚
    6 I( L: p8 \* B8 `; w
  4. #define HCSR04_ECHO   GPIO_Pin_9   // 定义Echo对应引脚
    . T9 y2 L7 Q1 z2 _/ I- y
  5.   
    * I0 m- s8 ~. w
  6. #define TRIG_Send  PBout(8)   // 将TRIG_Send映射到PB85 U& E9 L* t2 j& l, V7 N. `
  7. #define ECHO_Reci  PBin(9)   // 将ECHO_Reci映射到PB97 N1 e  X% ~& M- u" e4 q8 g
  8. * ]$ [% T9 o) m% V2 Q; R
  9. void Drv_Hcsr04_Init(void);   // Hc-sr04初始化7 y- I4 b5 B* x+ [- N  [& I9 `3 e
  10. void Drv_Hcsr04_OpenTimerForHc (void);   //打开定时器# i4 @1 |, }4 ?& j/ }3 @0 q2 z5 f9 r5 ]
  11. void Drv_Hcsr04_CloseTimerForHc (void);   //关闭定时器8 u( n# I1 A2 q* q
  12. u32 Drv_Hcsr04_GetEchoTimer(void);   // 获取定时器时间
复制代码

7 \- E9 {4 }# q, S4 x7 D1 Q9 B  k0 s0 J2 y6 e; a
五、应用实例3 _6 c8 O9 L: O1 z: V: s
利用串口打印距离信息,main函数如下
2 B8 T* I: Q  `2 A
  1. float gDistance = 0;   //定义获取返回距离变量
    9 G+ f8 `" K4 W

  2. $ u* ^3 }! b  |* K4 F
  3. int main(void)8 D# r* ^$ ^8 l  Q/ b- h  ?
  4. {
    7 n+ |: x; V# B  l
  5.     Med_Mcu_Iint();   // 系统初始化! n2 W2 x2 K2 N% d# H
  6.     + w' I. O  p0 S( b3 r' ~) V( G
  7.     while(1)) E' h: M* X* l6 }) M( q5 i& p! G
  8.   {2 ^5 l7 \# N3 Z" e" p
  9.         gDistance = Med_Hcsr04_GetLength();   //获取返回距离4 _( ^5 D7 j0 a
  10.       printf ("距离为:%.3f cm\n",gDistance);   //串口打印返回距离
    9 U( m1 K/ Z7 r" R, [
  11.         , f0 y$ J* o" T% @( T
  12.         delay_ms(500);   //延时500ms = 0.5s
      K5 Q9 |+ r9 }3 S2 ?1 I, _
  13.     }
    ; D4 v' L  ~, ?* \
  14. }
复制代码

% ^* U9 A2 n3 ^六、拓展应用* i2 i/ ?& M) A/ A  b
超声波测距比较常用的,比如利用超声波测距模块实现智能车的自动避障,这个在后续实战项目系列中会有,在此就不再详细介绍了。主要思路就是根据HC-SR04测得的与障碍物的距离,来决定是否要停止或转弯,以及往哪边转弯。$ K4 B1 Z! ^8 }" t" ]
3 S% r) i$ e: v$ f- Z( u& H6 B, U
转载自:二土电子) d; V4 e0 ?9 G5 p, k# v
如有侵权请联系删除; H: m8 b! Y: n; w# _- H
5 z/ Q. M$ F( e1 N5 k) |1 M
) T6 @' I. y# O+ D, C) U
收藏 评论0 发布时间:2023-10-23 23:36

举报

0个回答

所属标签

相似技术帖

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