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

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

[复制链接]
攻城狮Melo 发布时间:2023-10-23 23:36
一、超声波测距基本原理; m' W" `: g( z# p! Y+ x& |' I
超声波测距的原理非常简单,超声波发生器在某一时刻发出一个超声波信号,当这个超声波信号遇到被测物体后会反射回来,被超声波接收器接收到。这样只要计算出从发出超声波信号到接收到返回信号所用的时间,就可以计算出超声波发生器与反射物体的距离。
( O! K8 O5 O  {% e0 K2 E# i
' [2 p2 u4 {0 i7 C: z8 c( R6 e2 a  p" g距离的计算公::d=s/2=(c*t)/2
) ?" M( \% w: a( ^; F) S0 i, j  M
其中 d 为被测物与测距器的距离,s 为声波的来回路程,c 为声波,t 为声波来回所用的时间。
6 `" Y% i  Y  C/ c, o/ N$ e
% z. n+ f2 p3 {; O$ Z5 t1 Z' {" y由于超声波也是一种声波,其声速 c 与温度有关,在不同温度下的超声波声速不同。在使用时,如果温度变化不大,则可认为声速是基本不变的。如果测距精度要求很高,则应通过温度补偿的方法加以校正。声速校正后,只要测得超声波往返的时间,即可求得距离。不同外温度下的超声波声速表如下
) l" [' ^1 C2 w& v% I+ d7 f4 R. l
微信图片_20231023233556.png

& z2 y% d1 w* X
不同温度下超声波声速表

( P7 S+ |' t% m, `1 k9 R
/ j" ~! [+ E2 j2 ?! N/ |
补充说明6 S9 O  [! s: X
最近在问答区发现有小伙伴疑惑为什么在计算距离时是根据Echo输出的高电平持续时间来计算距离。这里简单解释一下,仅供参考' ?5 _, B; V' S* r0 L1 ~! N5 X
1. 实际超声波测距的原理就是上面介绍的,记录的时间是从超声波发出到回波被接收的时间,然后这个时间除以2,再乘超声波的传播速度得到距离。超声波测距模块实际也是这么做的。模块内部会记录超声波发出的时刻,在接收到回波后会立刻以高电平的形式从Echo引脚输出高电平,高电平的持续时间就是超声波从发出到被接收到的时间间隔。这么做是模块为了方便单片机处理,快速得到超声波从发出到被接收到的时间间隔。5 A1 j# o# h" y, T; e; m
* r' U8 B! B1 h# W6 Z
2. 实际大家可以自己测试一下,初始化一个定时器,从给Trig引脚10us高电平结束时刻开启定时器,到Echo引脚接收到高电平的时刻停止计时,用这个时间来计算距离,实际和用高电平持续时间来计算距离得到的结果基本是相同的。
4 g7 a1 z' ~3 N( A

! L- w+ Y  c3 ^3 p, D" |3. 给Trig引脚10us高电平并不是说只发送10us的超声波。10us的高电平是为了触发模块工作。10us高电平结束后,模块会发送一个8个40KHz的方波。# j6 l! n7 C5 a/ f% ^
* m% p( p) H4 T& k

0 }6 ~1 }) ]- g# g7 k  W二、超声波传感器简介
# m+ n3 v' O; A& q" }; f* W+ f' g总体上讲,超声波发生器可以分为两大类:一类是用电气方式产生超声波类是用机械方式产生超声波。电气方式包括压电型、磁致伸缩型和电动型等:机械方式有加尔统笛、液哨和气流旋笛等。他们所产生的超声波的频率、功率和声波特性各不相同,因而用途也各不相同。目前较为常用的是压电式超声波发生。
7 A% V' P0 E) |0 B

' A8 T  v0 V& d! S% \压电式超声波发生器实际上是利用压电晶体的谐振来工作的。它有两个压电晶片和一个共振板。当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,便产生超声波。反之,如果两极间未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收器了。这里介绍的是一个超声波测距模块——HC-SR04。6 R+ T9 ]$ z+ ?) M8 G$ Q9 O
7 M2 g# n: N% h) p+ R  d
微信图片_20231023233600.jpg

  F% `) \* o- b  ?
HC-SR04

6 j1 B$ i4 l4 W0 b9 S
7 U! }: _+ ]: P1 M- ~0 p) M9 t

0 I( D, N8 c$ O: k% w9 g9 A
三、HC-SR04测距实现思路6 E2 t' Z3 S4 w2 u1 V
这里就不再针对HC-SR04模块的原理和电路做详细介绍了,直接介绍利用该模块实现测距的思路。该模块有四个引脚。! A) D: [# d& f1 O, \0 i' R% a$ `
• VCC —— 通常是5V供电& ^+ ]" h' b9 g* Z4 u+ ^$ \
• GND —— 地. Z3 u: A3 u7 j7 E' A0 |# T) X1 r+ X
• Trig —— 给该引脚大于10us的高电平,超声波发射头会发送一个超声波信号
# L  I8 \( t! j$ g, \3 h, N• Echo —— 该引脚在接收到返回的超声波信号后会变为高电平/ v2 k; J& p* K( l; X5 H7 A2 \4 l% x
( G& f" v! q1 ^6 Y/ V: u
Echo接收到的高电平持续时间即为超声波一个来回所用的时间,利用该时间除以2再乘上光速,即可得到测量距离。
' o+ D( w( }8 f. T7 L
3 A# z. ]! }7 s7 C$ Y2 n( O& Y

% I+ Y' n' I- _( ~8 \: O$ |3 o9 D四、超声波测距程序实现6 B; b$ h  |0 M2 F. {" z/ k$ m
4.1 HC-SR04初始化程序

% x, T- I  j& x' t- sHC-SR04初始化程序主要包括两部分,一部分是初始化HC-SR04的GPIO,Trig引脚设置为推挽式输出,Echo引脚设置为浮空输入。另一部分是初始化TIM2。初始化TIM2之后,没有立即使能,而是等到Echo接收到高电平的时刻,开启TIM2。: ^/ u4 J/ r4 z
  1. /*
    / J6 ?1 F: K5 y* K7 s
  2. *==============================================================================( x& j6 k# v2 R- `1 R# P: \0 J
  3. *函数名称:Drv_Hcsr04_Init/ e6 D& j- T0 n* k
  4. *函数功能:初始化HC-SR04- u+ f; U  w1 V( E. n
  5. *输入参数:无& u, t' P2 B/ L6 Y
  6. *返回值:无3 e; O6 j7 y' z( K; r7 O' \- y( N6 |
  7. *备  注:初始化HC-SR04引脚的同时,初始化了TIM2,用来记录高电平持续时间4 [" s( Y9 q' x2 G& }
  8.           初始化完TIM2后,没有使能,当Echo收到高电平后使能% E! z, ^% _) ~% N7 F5 z
  9. *==============================================================================8 T2 H6 u# i! z
  10. */9 y! l0 P$ \% {3 A
  11. void Drv_Hcsr04_Init (void)   // Hc-sr04初始化8 C1 S& C8 s; w8 X. X1 T4 V
  12. {   
    0 q, q3 X% P( N- E' g
  13.     // 结构体定义4 V2 y$ P# w8 r  f% [
  14.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;   // 生成用于定时器设置的结构体  
    ! A% w8 P8 _2 W  Y- J
  15.     GPIO_InitTypeDef GPIO_InitStructure;   // GPIO结构体
    ) Z# g! K+ s6 Q/ O
  16.     NVIC_InitTypeDef NVIC_InitStructure;   // NVIC结构体
    . `+ g/ p- t' F& x
  17.     RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);   // 使能GPIO时钟% O: ?/ h+ p. Z" C2 ]) Z: y$ X

  18. 8 D9 ~( m8 N: x/ w& y: c* b
  19.     // GPIO初始化  % v. }$ \, S. M2 W/ U" {  L
  20.     GPIO_InitStructure.GPIO_Pin =HCSR04_TRIG;   // 发送电平引脚  4 X' G) F8 l0 v
  21.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
    # s4 r0 Q1 }* L* @4 P8 b3 r' r
  22.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   // 推挽式输出  
    2 c- C$ t$ i( d$ _# N; o
  23.     GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);  + r: q. `0 H# T3 i7 S
  24.     GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);  
    3 m# i% M/ s/ K# f
  25.          
    & B/ u+ D/ ~- i2 \8 N
  26.     GPIO_InitStructure.GPIO_Pin = HCSR04_ECHO;   // 返回电平引脚  
    9 S3 `  v" [2 @: [/ H
  27.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   // 浮空输入  
    5 A+ W' W9 z0 u, N( h- U* f+ p5 J! a
  28.     GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);   
    $ i4 _2 T' Y: u$ I
  29.     GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);      ) w/ ~" J1 y9 T$ O
  30.          
    % ]& J' U4 [7 V3 g6 M4 A- [
  31.     // 定时器初始化 使用基本定时器TIM2  3 B; {7 V! o1 r/ @9 L
  32.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);   // 使能对应RCC时钟  
    , C+ e3 C9 w/ _- L) Y
  33.     // 配置定时器基础结构体  
    % Z1 Z- z* a, `# e
  34.     TIM_DeInit(TIM2);  * x0 m# f2 ~5 m5 y5 n( w
  35.     TIM_TimeBaseStructure.TIM_Period = (1000-1);   // 设置在下一个更新事件装入活动的自动重装载寄存器周期的值(计数到1000为1ms ) 7 a' }4 Z! N/ A. Z+ u) {" P
  36.     TIM_TimeBaseStructure.TIM_Prescaler =(72-1);   // 设置用来作为TIMx时钟频率除数的预分频值  1M的计数频率 1US计数  
    - Z# ~( Y3 f, \+ j, ?) B* F6 N
  37.     TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;   // 不分频  
    $ r6 U, l# f1 [/ [6 m
  38.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   // TIM向上计数模式  
    $ ?0 {* \1 S' B  T) |" J3 t
  39.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);   // 根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位         4 b/ l( J9 H4 @. |; o
  40.                
    7 x! ^' V- i5 a' y7 _2 W
  41.     TIM_ClearFlag(TIM2, TIM_FLAG_Update);   // 清除更新中断,免得一打开中断立即产生中断  
      E) @1 ^7 [4 X
  42.     TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);   // 打开定时器更新中断  
    3 O. t, {. K4 Z

  43. ' f8 x( Q2 h1 I. L
  44.     // NVIC配置      
    : n9 C2 B% U% E7 W/ p
  45.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   // 设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
    : g1 O5 O- Q) C* C6 ^( G8 a; }
  46.         
    , H! f. j, x* o: n  @' {- j
  47.     NVIC_InitStructure.NVIC_IRQChannel =TIM2_IRQn;   // 选择定时器2中断  
    4 j( N% Q$ I, {. u: ]  E
  48.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   // 抢占式中断优先级设置为0  
    # W3 |  j, h1 a$ S% _4 o% @8 ]0 R
  49.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   // 响应式中断优先级设置为0  : v0 R5 P, |* O4 a: n* M& Q+ @8 D
  50.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   // 使能中断  1 F+ y" I2 b! _) E
  51.     NVIC_Init(&NVIC_InitStructure);  
    ! x$ b  P. S" s  @
  52.    
    / m& X8 V+ H8 t8 `3 J: ^5 Z, m$ r
  53.     TIM_Cmd(TIM2,DISABLE);      
      o- W5 p% m$ }* }, \1 _
  54. }
复制代码
4 s  c/ g2 A' m+ `- \
4.2 TIM开关程序+ K! a9 o" a: K; u
  1. /*$ X/ z$ M: T% h: G8 E. [
  2. *==============================================================================
    / K- G2 T2 F; t) |7 T3 D
  3. *函数名称:Drv_Hcsr04_OpenTimerForHc# Z/ X1 ^7 `6 q! J7 m' w& Z
  4. *函数功能:打开定时器
    2 P* q' ]# s* s! l5 U) g
  5. *输入参数:无
    # X1 I9 y5 Q6 b' {/ E
  6. *返回值:无
    " I, S/ `- m1 U$ K( X6 R2 S/ _1 U
  7. *备  注:无
    . }" m9 Z# F; f( o0 D
  8. *==============================================================================
    # e4 Q0 j) O; N- Z1 ]8 s! O0 S: \
  9. */
    - z' Z1 }+ u6 y$ q& q$ i
  10. void Drv_Hcsr04_OpenTimerForHc (void)   // 打开定时器  : q( Q" y4 \# `  n( r
  11. {  " T  l2 m" ]6 f6 _1 @' \. W
  12.     TIM_SetCounter(TIM2,0);   // 清除计数  & W4 M" z+ |5 Z$ \4 @. @% _
  13.     gMsHcCount = 0;  
    ( @4 {1 A) v7 C1 T
  14.     TIM_Cmd(TIM2, ENABLE);   // 使能TIMx外设  ( Y; h/ D! U' `) v+ i7 i
  15. }
    + M+ V, Y. H) d
  16. /*
      w0 {: h: f6 l: S
  17. *==============================================================================  f0 \- G) n8 z# o
  18. *函数名称:Drv_Hcsr04_CloseTimerForHc
    ) _! e4 @6 o! F
  19. *函数功能:关闭定时器
    0 B+ U' K. g" i
  20. *输入参数:无% w8 F3 Y; v3 i& `, H* l3 G4 x1 ]0 ]
  21. *返回值:无
    7 D& d( d" W- \5 ?- V" m) j
  22. *备  注:无
      P8 B9 Y8 w3 \2 M' @6 H8 a
  23. *==============================================================================
    " s3 }5 M7 m; F7 d+ E% C! A5 }
  24. */; c9 k1 H# a5 I1 _
  25. void Drv_Hcsr04_CloseTimerForHc (void)   // 关闭定时器  
    1 T- c4 Z" E* t0 q$ e
  26. {  " Z1 j& L0 W( s, {
  27.     TIM_Cmd(TIM2, DISABLE);   // 使能TIMx外设  
    4 G5 y5 x1 }5 {' J
  28. }  
复制代码
' Y  @; \' x& W# ]2 _! x' n
定时器中断服务函数如下% `) v6 L) O0 |8 `1 O2 o
  1. /*1 a. r/ Y  v& X/ y8 i2 |
  2. *==============================================================================- s. X0 N' ~3 a6 k) I
  3. *函数名称:TIM2_IRQHandler7 Y8 y1 F8 }" W1 l' H1 ~5 r: |# D* a
  4. *函数功能:定时器2中断服务程序 / M6 D- n8 L, C$ M$ _
  5. *输入参数:无5 J9 {  c3 D! {  K" A0 v
  6. *返回值:无
    1 @" o( Z5 O  Y5 b9 _; q
  7. *备  注:无
    7 `  K# C8 n2 {7 }
  8. *==============================================================================
    : @6 p$ \) _# K+ y0 A
  9. */
    4 D4 c& A# U  k6 E4 x: ?& p
  10. void TIM2_IRQHandler (void)   // TIM2中断  
    8 u$ S) V: H2 J* H3 ]
  11. {  - [4 l) c9 a" }2 n
  12.     if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)   // 检查TIM2更新中断发生与否  
    : b7 s6 W- X9 f+ c3 u! A* R; g- b
  13.     {  
    3 `0 S5 [) q2 ?8 `8 e) v
  14.         TIM_ClearITPendingBit(TIM2, TIM_IT_Update);  // 清除TIMx更新中断标志   
    6 R4 B4 j( T" Y
  15.         gMsHcCount++;  
    * E+ g: W0 v' [1 Z8 \
  16.     }  5 P' d. V: T& _( V, V: c
  17. }   
复制代码

" T/ ~) U) L) M3 i4 a$ {; K4.3 获取定时时间& P/ s6 Z/ j1 ]0 @9 s4 |8 e. M0 J
  1. /*( \+ Z/ }6 Y% i; h3 m- M: G
  2. *==============================================================================8 R( s9 V8 z3 U2 b% i) {
  3. *函数名称:Drv_Hcsr04_GetEchoTimer9 _, o0 }9 @, L, H2 u
  4. *函数功能:获取定时器定时时间
    8 P. f; [" F' p' Y
  5. *输入参数:无
    8 m# Q* g& h  z3 b( p# F
  6. *返回值:无% n) _& P3 w, X3 r/ v8 P( z
  7. *备  注:无7 ]% }- j& u/ o# Q6 m
  8. *==============================================================================# k4 B& Y4 N, I$ g9 B; }
  9. */2 f$ x* l% s7 H* u; I! _; H; F
  10. u32 Drv_Hcsr04_GetEchoTimer (void)  1 t2 {# C2 e- ^& i4 d( U5 P* ~
  11. {  
    # `5 g1 C) V$ M" p" D  J( ]
  12.     u32 t = 0;  * }9 x3 _$ V! Y# L
  13.     t = gMsHcCount * 1000;   // 得到MS  - g% L$ e2 P; K% P' h( G
  14.     t += TIM_GetCounter(TIM2);   // 得到US  6 H. V5 B: m9 d' D; `- q/ v6 g# _
  15.     TIM2 -> CNT = 0;   // 将TIM2计数寄存器的计数值清零  
    % x7 }& h1 u2 M, k5 y
  16.     delay_ms(50);
    0 {4 {4 }% @" |8 @' a0 Q& y5 L# o
  17.     return t;  
    9 e' w8 a' g0 \2 ?# v1 |
  18. }
复制代码
# q$ U2 \9 q. h
4.4 计算测量距离
: ]. Z) A& I! ?7 M% x9 z0 h5 n
  1. /*
    1 W9 n0 _& Z3 ~6 X  B- ^: R9 J6 t
  2. *==============================================================================& p1 U, i2 I  h
  3. *函数名称:Med_Hcsr04_GetLength
    7 T; A2 f0 Z- f5 d( M' A
  4. *函数功能:获取测量距离8 v6 N5 B& e* e+ k8 V* M9 b3 Z
  5. *输入参数:无  Z+ k6 p1 O/ K# n) u- m
  6. *返回值:无/ E4 c7 |) J+ r# p5 P
  7. *备  注:一次获取超声波测距数据 两次测距之间需要相隔一段时间,隔断回响信号
    4 K/ x5 R! h' H1 ^. u
  8.                     为了消除余震的影响,取五次数据的平均值进行加权滤波
    6 a- B  o, ?. [* i
  9. *==============================================================================7 W. [5 ^% F, i6 i, l2 T) O( Q
  10. */0 k" n: y' n3 O9 q: n
  11. float Med_Hcsr04_GetLength (void )  
    ) @5 m5 r  s& ?6 \
  12. {  
      e9 V( Q+ X" K) V
  13.     u32 t = 0;  
    ; T/ }/ o5 ~. ^
  14.     int i = 0;  
    - k. u6 k5 X3 G
  15.     float lengthTemp = 0;  
    * C- S9 ]: W9 Y( v* j
  16.     float sum = 0;  5 ?) X  |% T+ a! B; r& q% g1 t% m
  17.     while(i!=5)  % d7 i/ ]7 i. s8 T/ N
  18.     {  % F+ B3 J. S% c0 @
  19.         TRIG_Send = 1;   // 发送口高电平输出  . c2 O$ m: Y) L+ A6 o4 F: O: L
  20.         delay_us(20);
    0 P; K, a- L8 Y0 t
  21.         TRIG_Send = 0;  , H  a1 W' {9 N. q6 M5 u, u
  22.         while(ECHO_Reci == 0);   // 等待接收口高电平输出  
    - a* X1 o+ ~: \2 K& ~/ {
  23.         Drv_Hcsr04_OpenTimerForHc();   //打开定时器  ; ^- ^2 m: K  A4 k7 b- A
  24.         i = i + 1;  
    ! S8 m7 d% X: }' G5 ^- J* G& R$ H
  25.         while(ECHO_Reci == 1);  4 r1 y1 P4 r& d# d/ j
  26.         Drv_Hcsr04_CloseTimerForHc();   // 关闭定时器  
    9 x1 F$ R" B: B1 N
  27.         t = Drv_Hcsr04_GetEchoTimer();   // 获取时间,分辨率为1us& J) h6 W6 x( r; M: W% q
  28.         lengthTemp = ((float)t/58.0);   // cm  
    / `" p5 l9 P4 c2 Q
  29.         sum = lengthTemp + sum ;        
    % U6 H8 Q3 @/ m, \$ [; z1 q; c
  30.         }  
    & b2 A" ^% f" h8 ?
  31.     lengthTemp = sum/5.0;  
    - z" f  U0 W! \* d8 I7 K
  32.     return lengthTemp;  
    4 }7 z. `9 s! A7 |$ v# }/ E
  33. }
复制代码
4 v+ M5 I3 j. m& |2 W
4.5 宏定义" w) G! U: v/ F/ M' v* w4 B
  1. #define HCSR04_PORT   GPIOB   // 定义IO口
      X6 t5 j  N% }% L# E
  2. #define HCSR04_CLK    RCC_APB2Periph_GPIOB   // 开启GPIO时钟  9 R  o5 i: n0 v5 s$ z# X+ k* w% U
  3. #define HCSR04_TRIG   GPIO_Pin_8   // 定义Trig对应引脚
      |' _2 `5 ?& q3 ?( h! |
  4. #define HCSR04_ECHO   GPIO_Pin_9   // 定义Echo对应引脚7 r" Q" a2 J- M4 B
  5.   7 g7 w, x2 J# x7 X
  6. #define TRIG_Send  PBout(8)   // 将TRIG_Send映射到PB8
    $ }8 P+ Q1 |& w# i4 W8 n) ?
  7. #define ECHO_Reci  PBin(9)   // 将ECHO_Reci映射到PB9# Z0 }4 R+ N3 b7 L* Q& Z, N% |2 l

  8. 4 i+ w/ e/ j+ F- T6 X7 D( g
  9. void Drv_Hcsr04_Init(void);   // Hc-sr04初始化
    / g' J+ \2 X5 J2 B, H4 _
  10. void Drv_Hcsr04_OpenTimerForHc (void);   //打开定时器8 p, [# y  L/ v- ^& T4 e
  11. void Drv_Hcsr04_CloseTimerForHc (void);   //关闭定时器# K0 }  S( E3 H+ P! M# w
  12. u32 Drv_Hcsr04_GetEchoTimer(void);   // 获取定时器时间
复制代码

7 E( U- l- j8 Y; o7 W3 D
: k3 a* F' |% c! @; K1 w& v五、应用实例
9 u2 H; U- m+ s( j5 i6 Y/ ?$ |利用串口打印距离信息,main函数如下
7 B- ]! t0 X" m4 @6 B
  1. float gDistance = 0;   //定义获取返回距离变量# u2 K9 [  t. e) o0 @
  2. 4 i1 Q0 E# G1 c: `6 [% a
  3. int main(void)
    * S& [: y& v# ?( D0 {1 E9 o3 q. d
  4. {
    5 O: y8 Q) v$ p' [; J  [
  5.     Med_Mcu_Iint();   // 系统初始化
    ' ?. y& ^& V( C
  6.     - }8 l& |2 l! T9 h& n
  7.     while(1)
    7 @4 @  j5 T- ^% u  K  U
  8.   {
    3 x9 i1 P; D  h( W5 \! k
  9.         gDistance = Med_Hcsr04_GetLength();   //获取返回距离
    . j/ w: B* @6 L2 E' V0 q
  10.       printf ("距离为:%.3f cm\n",gDistance);   //串口打印返回距离
    ! N2 i- ^& P! f* E# ?0 k2 J8 n* {
  11.         
    - E2 V9 P$ E& d
  12.         delay_ms(500);   //延时500ms = 0.5s
    ) h1 m( f( f. L  O6 J
  13.     }6 v3 C) j! d7 [% h/ b) U
  14. }
复制代码
" g9 M3 X3 m/ h  R/ h! m- `+ {
六、拓展应用
5 r% E  }; I4 t超声波测距比较常用的,比如利用超声波测距模块实现智能车的自动避障,这个在后续实战项目系列中会有,在此就不再详细介绍了。主要思路就是根据HC-SR04测得的与障碍物的距离,来决定是否要停止或转弯,以及往哪边转弯。
% p! [6 N/ ?" K: N
, a0 `$ N$ A  _! f4 S, X转载自:二土电子5 ~7 H. h) t0 |
如有侵权请联系删除" Z$ a( J2 I3 z: B& W1 N
( ?) c4 z) d* Y& L/ F

: N/ w3 J( ]- z7 Q  b7 X
赞 收藏 评论0 发布时间:2023-10-23 23:36

举报

0个回答

所属标签

相似技术帖

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