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

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

[复制链接]
攻城狮Melo 发布时间:2023-10-23 23:36
一、超声波测距基本原理
4 \/ _5 R2 e1 [$ n4 K3 `% k9 z超声波测距的原理非常简单,超声波发生器在某一时刻发出一个超声波信号,当这个超声波信号遇到被测物体后会反射回来,被超声波接收器接收到。这样只要计算出从发出超声波信号到接收到返回信号所用的时间,就可以计算出超声波发生器与反射物体的距离。4 T3 D: V# p$ C! Q: n& P

7 r9 K, H- O, B3 _. Q9 }  q距离的计算公::d=s/2=(c*t)/2; H! J  G& S& O" _! ^

( l4 s' ^9 W% b5 X6 U其中 d 为被测物与测距器的距离,s 为声波的来回路程,c 为声波,t 为声波来回所用的时间。
# l4 I* [0 i7 B' y' ?, a" B: C4 v' q, Y7 e& w7 |5 o% _+ D
由于超声波也是一种声波,其声速 c 与温度有关,在不同温度下的超声波声速不同。在使用时,如果温度变化不大,则可认为声速是基本不变的。如果测距精度要求很高,则应通过温度补偿的方法加以校正。声速校正后,只要测得超声波往返的时间,即可求得距离。不同外温度下的超声波声速表如下
; z) h) {/ n9 k: |& ?& I9 M$ Q1 P9 E3 P6 ]! G
微信图片_20231023233556.png

% q( k. U5 T6 @; X3 j5 ~* m$ \, B  k
不同温度下超声波声速表

6 D& A/ d, o: ~# D0 x1 V0 `
& v7 b7 q  T& r, A4 Q/ F
补充说明
1 l! `, R! Q- r0 e* G最近在问答区发现有小伙伴疑惑为什么在计算距离时是根据Echo输出的高电平持续时间来计算距离。这里简单解释一下,仅供参考
: G( T! C$ n$ H1. 实际超声波测距的原理就是上面介绍的,记录的时间是从超声波发出到回波被接收的时间,然后这个时间除以2,再乘超声波的传播速度得到距离。超声波测距模块实际也是这么做的。模块内部会记录超声波发出的时刻,在接收到回波后会立刻以高电平的形式从Echo引脚输出高电平,高电平的持续时间就是超声波从发出到被接收到的时间间隔。这么做是模块为了方便单片机处理,快速得到超声波从发出到被接收到的时间间隔。
# B. A* d9 `8 o6 f5 e  w7 g
4 C+ T) m4 h" k  T8 o8 L2. 实际大家可以自己测试一下,初始化一个定时器,从给Trig引脚10us高电平结束时刻开启定时器,到Echo引脚接收到高电平的时刻停止计时,用这个时间来计算距离,实际和用高电平持续时间来计算距离得到的结果基本是相同的。! Y6 a8 v: P/ i6 a& M

. P) ~. g' i' T  B# D& o3 P3. 给Trig引脚10us高电平并不是说只发送10us的超声波。10us的高电平是为了触发模块工作。10us高电平结束后,模块会发送一个8个40KHz的方波。
2 `) y1 Q- t# \9 c/ d
6 |( w1 h; g4 b/ r, S( Y
! ]9 A7 k7 j+ f1 D
二、超声波传感器简介
  V0 @4 `, z% }& @5 m7 x总体上讲,超声波发生器可以分为两大类:一类是用电气方式产生超声波类是用机械方式产生超声波。电气方式包括压电型、磁致伸缩型和电动型等:机械方式有加尔统笛、液哨和气流旋笛等。他们所产生的超声波的频率、功率和声波特性各不相同,因而用途也各不相同。目前较为常用的是压电式超声波发生。6 Q4 j( T! A# l# l( ~

' I0 }' W( t2 H  _9 S压电式超声波发生器实际上是利用压电晶体的谐振来工作的。它有两个压电晶片和一个共振板。当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,便产生超声波。反之,如果两极间未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收器了。这里介绍的是一个超声波测距模块——HC-SR04。
; U9 P( M# p  \( R6 [0 ~# K) q7 D8 H; M* [
微信图片_20231023233600.jpg

; R! a8 a* a0 _0 G( O, `. k! i
HC-SR04
6 K) |6 X' Z4 {
& b- }5 K( y; ?3 ]  K7 G
: M0 C( t, V! @9 N- E2 [& L
三、HC-SR04测距实现思路
2 |  U9 y* F" R这里就不再针对HC-SR04模块的原理和电路做详细介绍了,直接介绍利用该模块实现测距的思路。该模块有四个引脚。& r! N# |/ X8 a2 I6 E
• VCC —— 通常是5V供电
3 P5 n' L5 v# x: w/ {• GND —— 地1 Z# H' v% b% U& _
• Trig —— 给该引脚大于10us的高电平,超声波发射头会发送一个超声波信号
4 c  }/ w3 X( V1 c$ [( c8 H9 s• Echo —— 该引脚在接收到返回的超声波信号后会变为高电平
4 F6 m# t# h" X; n- f" j) k9 B# U1 d. c% W  v
Echo接收到的高电平持续时间即为超声波一个来回所用的时间,利用该时间除以2再乘上光速,即可得到测量距离。
! d: V3 A. g8 u% w/ ~2 ~+ m4 f& _/ u1 E" S. M

, S1 Q. Y5 |9 O# l, O# I8 f: H* D4 P四、超声波测距程序实现
- f% h  T( G( i. p5 h4.1 HC-SR04初始化程序
# e" S) N* B) h' u  ]% F- p- J' r
HC-SR04初始化程序主要包括两部分,一部分是初始化HC-SR04的GPIO,Trig引脚设置为推挽式输出,Echo引脚设置为浮空输入。另一部分是初始化TIM2。初始化TIM2之后,没有立即使能,而是等到Echo接收到高电平的时刻,开启TIM2。! u6 Q9 t  f$ F. M. a1 U
  1. /*
    0 j  Q0 `2 ^8 P7 f( Y. I
  2. *==============================================================================
    * ?1 Y" F* j3 z  |9 a2 W. v5 {/ n* J
  3. *函数名称:Drv_Hcsr04_Init) _4 k- {! o! f- H
  4. *函数功能:初始化HC-SR04* }$ O+ s! B- o( O/ |
  5. *输入参数:无
    8 _6 `/ v; Y* E- i
  6. *返回值:无7 ?; D, C; ?2 E
  7. *备  注:初始化HC-SR04引脚的同时,初始化了TIM2,用来记录高电平持续时间
    9 M3 _; q' a4 g* M# A) a* L
  8.           初始化完TIM2后,没有使能,当Echo收到高电平后使能
    . ]9 o( x( |1 O2 W
  9. *==============================================================================. W0 L" h/ k+ L( y$ v; R" T. ]
  10. */8 u) i& U( K( x" T
  11. void Drv_Hcsr04_Init (void)   // Hc-sr04初始化
    , a( n- i2 m7 c" s5 m
  12. {    0 q' u8 k0 x/ Y# j2 w7 ]
  13.     // 结构体定义
    1 q/ V! x9 J5 j, q3 H, p# [9 v
  14.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;   // 生成用于定时器设置的结构体  9 T0 k9 M/ y# l: o+ N1 l
  15.     GPIO_InitTypeDef GPIO_InitStructure;   // GPIO结构体
      m7 b$ G8 ~& t; X2 v* [
  16.     NVIC_InitTypeDef NVIC_InitStructure;   // NVIC结构体
    % B* {+ i# k( d1 c
  17.     RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);   // 使能GPIO时钟
    + H0 i# ?/ q: h, H

  18. 7 L4 v: w3 S7 c. t% l" z
  19.     // GPIO初始化  
    & ?. d# v1 I! X& u% I1 r
  20.     GPIO_InitStructure.GPIO_Pin =HCSR04_TRIG;   // 发送电平引脚  
    0 Q3 p  F/ _- g" ~
  21.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  + h- i' [* V1 q
  22.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   // 推挽式输出  & Z7 N7 k6 y5 n4 ^
  23.     GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);  
    ; J, d# K0 k% i2 {6 ^, O" B- j8 y
  24.     GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);  ' f/ i3 e% {3 Q% P# E
  25.          
    . {% B# L8 I! t' }# E$ {
  26.     GPIO_InitStructure.GPIO_Pin = HCSR04_ECHO;   // 返回电平引脚  ; o5 m0 {) ?4 L6 w
  27.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   // 浮空输入  
    4 }* t8 }( R% [
  28.     GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);   
    4 H% s+ G! a: _3 O" S& Q# m- \
  29.     GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);      
    . C/ v4 e, n8 T
  30.          , X) U% r# ?5 B6 _
  31.     // 定时器初始化 使用基本定时器TIM2    v) ~0 e3 j) O6 o% r* ^6 f
  32.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);   // 使能对应RCC时钟  
    7 D7 x0 z2 E4 P: ^& S
  33.     // 配置定时器基础结构体  
    8 ~& H" Y- `. G9 m; Z
  34.     TIM_DeInit(TIM2);  + n# Y; N: ^5 x- n
  35.     TIM_TimeBaseStructure.TIM_Period = (1000-1);   // 设置在下一个更新事件装入活动的自动重装载寄存器周期的值(计数到1000为1ms )
    $ p1 j: R* z( z' O- d6 `+ b
  36.     TIM_TimeBaseStructure.TIM_Prescaler =(72-1);   // 设置用来作为TIMx时钟频率除数的预分频值  1M的计数频率 1US计数  
    4 ~& k3 R$ p. l2 ?9 T/ C
  37.     TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;   // 不分频  
    % D2 u' t# G' Q7 x1 n% K# k
  38.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   // TIM向上计数模式  & A. ]) t) k, u* m& O3 R7 S% Y9 X
  39.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);   // 根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位         
    0 h# x- \5 h2 O/ g! ~. v. D
  40.                
    ( B' ^' y5 T. q# I4 J2 }
  41.     TIM_ClearFlag(TIM2, TIM_FLAG_Update);   // 清除更新中断,免得一打开中断立即产生中断  ! ]& D) u1 n2 q% s8 t( L$ w7 o
  42.     TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);   // 打开定时器更新中断  
    % \' k/ G/ P" }8 I! G

  43. 8 o6 s8 ?8 L8 N) M, s, a
  44.     // NVIC配置      
    & ^5 E" H% \$ ?/ ^
  45.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   // 设置中断优先级分组为组2:2位抢占优先级,2位响应优先级 0 v* z8 P& v! e2 d; J& h  p0 A1 \
  46.         
    . U( y, T) \6 n- s
  47.     NVIC_InitStructure.NVIC_IRQChannel =TIM2_IRQn;   // 选择定时器2中断  / p& G9 R% E/ @7 @+ {
  48.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   // 抢占式中断优先级设置为0  & ?4 Y: V7 C3 _9 r: W8 I& Z) s# f
  49.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   // 响应式中断优先级设置为0  
    $ U" R* G: r# S
  50.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   // 使能中断  ; S. T) T" L$ J4 J# T/ I. T
  51.     NVIC_Init(&NVIC_InitStructure);  & b; ^' ], l" w2 O2 Y0 @
  52.    
    ' \, O! e6 |% j. s( B* P
  53.     TIM_Cmd(TIM2,DISABLE);      
    8 V) R1 w0 @8 g9 R# @9 H
  54. }
复制代码
/ f6 F+ I9 P) ~! @, Y% w! V
4.2 TIM开关程序+ U: L+ Q/ z+ P& B
  1. /*
    6 }' f6 h. G% U6 ]6 e0 K
  2. *==============================================================================
    * |( r: Y: Q2 g1 X* z
  3. *函数名称:Drv_Hcsr04_OpenTimerForHc3 y2 u2 g$ y$ J  b
  4. *函数功能:打开定时器
    ( n9 Q/ W" _& m" y  O  l; N! |, y& C
  5. *输入参数:无5 g: T) E0 d9 d0 ?8 u0 i
  6. *返回值:无
    3 m" D# e( R8 P% h; H$ q
  7. *备  注:无+ c! m: n7 T5 x5 c
  8. *==============================================================================4 ]- O3 l7 u5 I5 e$ F
  9. */# B" S$ w6 ~9 B, `1 S0 n& T
  10. void Drv_Hcsr04_OpenTimerForHc (void)   // 打开定时器  8 W  @+ X0 B+ l6 a0 O6 A
  11. {  
    * E6 W" |, e" S6 J7 e5 X' ?
  12.     TIM_SetCounter(TIM2,0);   // 清除计数  / \+ r& B; A+ O2 J3 t
  13.     gMsHcCount = 0;  
    " j  a& T9 o0 c( l- z/ S
  14.     TIM_Cmd(TIM2, ENABLE);   // 使能TIMx外设  . V3 T! U' S+ r6 ?( t3 X: c% B
  15. }- Z" V! a5 w3 |* A3 [
  16. /*  y' A3 w) w& U! f2 ~
  17. *==============================================================================" G2 Z" X8 h; ?4 P3 C
  18. *函数名称:Drv_Hcsr04_CloseTimerForHc  e0 K- A' R7 [
  19. *函数功能:关闭定时器
    2 J& E  p$ C" e& {1 M
  20. *输入参数:无+ Y: x5 h  N! w' s+ `
  21. *返回值:无
    3 U# Q+ @  i1 l- r3 y
  22. *备  注:无
    2 q/ y" r$ T1 X7 A
  23. *==============================================================================
    $ e3 g* i: n) J4 S9 G
  24. */; G% V/ B& e; b9 b1 _
  25. void Drv_Hcsr04_CloseTimerForHc (void)   // 关闭定时器  
    3 B2 n+ Z+ q6 p' e
  26. {  / E/ Q0 r4 K2 q: T
  27.     TIM_Cmd(TIM2, DISABLE);   // 使能TIMx外设  - L# j. n$ Q2 w* l) F& L
  28. }  
复制代码

$ }1 U6 w! S+ C定时器中断服务函数如下
' c6 Z, T  W8 Z/ W$ b
  1. /*+ o2 o! e$ X% m/ o' D; c+ o9 Y5 _" J
  2. *==============================================================================5 F) M5 ]* m4 b
  3. *函数名称:TIM2_IRQHandler) R. j6 ^; v) ~8 H
  4. *函数功能:定时器2中断服务程序 5 M) p+ K0 e' P% y
  5. *输入参数:无9 ~, [- n; {, J" _, @0 i1 Y, S( Q
  6. *返回值:无
    : K) O2 J6 O6 l) Q1 i
  7. *备  注:无9 U: ]) G: l6 d1 ^& Q5 O
  8. *==============================================================================
    : b: z2 s3 Z1 o
  9. */! A6 [' S0 Y$ ?: G! x6 Y
  10. void TIM2_IRQHandler (void)   // TIM2中断  1 R# n0 N) f. k! }; _$ @/ a1 m
  11. {  2 X* e4 ]- e) X( X! Y9 B
  12.     if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)   // 检查TIM2更新中断发生与否  
    0 p1 S5 x" [4 c4 l8 F" q
  13.     {  4 l3 J2 A1 I( j/ Q+ e
  14.         TIM_ClearITPendingBit(TIM2, TIM_IT_Update);  // 清除TIMx更新中断标志   $ ]5 f2 t8 R- |
  15.         gMsHcCount++;  , X8 R) k( _9 ^% w* h
  16.     }  ' O# v5 x, O1 a# O
  17. }   
复制代码
9 o* h/ ?: d6 Y) O% ?
4.3 获取定时时间
' S! ~$ y6 C5 Q5 p$ k
  1. /*' @& x, n* P2 J" E7 t, i
  2. *==============================================================================
    3 W) O/ I1 A5 c
  3. *函数名称:Drv_Hcsr04_GetEchoTimer  w" J: H3 |# }5 T
  4. *函数功能:获取定时器定时时间
    6 C! |3 W9 ^) I
  5. *输入参数:无
    ; Y" T. U- h. r4 i9 ~0 L
  6. *返回值:无
    . s! a1 Z5 w- l) ~
  7. *备  注:无2 r* ~% f& G$ _+ I' w/ f5 F3 r
  8. *==============================================================================$ O  j6 g9 a$ j- c, X% C
  9. */
    $ T% h: s% {5 Z, X  A9 Z
  10. u32 Drv_Hcsr04_GetEchoTimer (void)  
    9 m# f( F4 N3 ~" a' n: e
  11. {  
    2 `+ g# P. F/ J, U6 o; r2 \
  12.     u32 t = 0;  
    8 W6 u* G0 H2 y% R' d' k$ e9 Y; ~
  13.     t = gMsHcCount * 1000;   // 得到MS  6 d  j; s4 L0 {9 N1 {. e0 E% f6 A
  14.     t += TIM_GetCounter(TIM2);   // 得到US  / u, d& W3 q) h% w- y" M  W
  15.     TIM2 -> CNT = 0;   // 将TIM2计数寄存器的计数值清零  $ }0 V, H8 I! P8 r
  16.     delay_ms(50);
    & N, h2 F* a4 D; T$ ~3 W6 f8 r
  17.     return t;  * B6 f; b$ w. `- {3 Y
  18. }
复制代码
/ t" Y2 k' X9 t3 p+ X. a' r
4.4 计算测量距离
3 }% Z. ?7 m3 `) t* ~: N
  1. /*
    : k& a5 M# M% ~( E4 \' M, u/ u( i" S
  2. *==============================================================================( C% d, _3 S; L+ M, o
  3. *函数名称:Med_Hcsr04_GetLength* m% h  Y) q) `2 \4 n( Q% V* z+ v
  4. *函数功能:获取测量距离
    * F9 D" o$ W  ]& C- F. N. \
  5. *输入参数:无6 H8 ~( L8 y  t9 @$ }( i1 ~5 F+ y
  6. *返回值:无
    ; ^4 J4 u+ i7 p6 B+ {
  7. *备  注:一次获取超声波测距数据 两次测距之间需要相隔一段时间,隔断回响信号5 M) {7 r3 Z2 U
  8.                     为了消除余震的影响,取五次数据的平均值进行加权滤波( }  V, t4 q+ X: s
  9. *==============================================================================0 m$ q* N6 p* T( R
  10. */7 s) h* J  [2 L% U, s. F3 w
  11. float Med_Hcsr04_GetLength (void )  5 g' U' |! D" k
  12. {  
    - O, O- \& g9 d7 o" l
  13.     u32 t = 0;  
    % P- {/ R7 o" j
  14.     int i = 0;  
    % [$ o0 I5 c' h% `! S
  15.     float lengthTemp = 0;  
    % k/ K# A: h; r3 I; m
  16.     float sum = 0;  : V  z* j, T! L3 k
  17.     while(i!=5)  
    $ e( V! q, J7 c" i0 A
  18.     {  6 h! B& W) a2 O2 w  l1 Y
  19.         TRIG_Send = 1;   // 发送口高电平输出  
    # Q# a) i0 U, a3 B
  20.         delay_us(20);
    ' j  G. S% L  N0 h" b2 p9 X+ Q$ W, y
  21.         TRIG_Send = 0;  ! H# `3 h6 c* s4 h$ Q
  22.         while(ECHO_Reci == 0);   // 等待接收口高电平输出  , d/ E! R; N4 r: e
  23.         Drv_Hcsr04_OpenTimerForHc();   //打开定时器  3 S" ~5 {9 J4 b, k& z; V
  24.         i = i + 1;  
    - g0 i: k, D* G9 G+ ]- b
  25.         while(ECHO_Reci == 1);  
    1 J+ x/ y5 ~& y7 D: ?5 L: v
  26.         Drv_Hcsr04_CloseTimerForHc();   // 关闭定时器  , x# X8 a0 Q5 E3 y
  27.         t = Drv_Hcsr04_GetEchoTimer();   // 获取时间,分辨率为1us3 V) ^. d& d& K' {' D2 c
  28.         lengthTemp = ((float)t/58.0);   // cm  8 Y6 l9 k9 C4 `
  29.         sum = lengthTemp + sum ;        
    # ?& L! R- L: P9 x3 v
  30.         }  3 o- b- M' B4 P: `
  31.     lengthTemp = sum/5.0;  % E4 c1 s* K( {, p% b4 [8 u
  32.     return lengthTemp;  
    3 h" A9 S: x" A4 A
  33. }
复制代码

7 j: k" T7 @, j+ S! @6 W3 K  Y) ~6 K. M4.5 宏定义# ^4 r* e' d* U2 ]& L
  1. #define HCSR04_PORT   GPIOB   // 定义IO口
    + T! M; G4 J) ~) q9 c9 k/ D
  2. #define HCSR04_CLK    RCC_APB2Periph_GPIOB   // 开启GPIO时钟  0 P: c7 I! i0 P7 E
  3. #define HCSR04_TRIG   GPIO_Pin_8   // 定义Trig对应引脚
    ! ?9 a7 \' E7 {" F
  4. #define HCSR04_ECHO   GPIO_Pin_9   // 定义Echo对应引脚2 D) u- \2 M: z+ y: f
  5.   % A  _3 j7 `" J
  6. #define TRIG_Send  PBout(8)   // 将TRIG_Send映射到PB8
      Q- t# N( ^- l
  7. #define ECHO_Reci  PBin(9)   // 将ECHO_Reci映射到PB9
    * i2 d" a! B- q$ f8 c$ f
  8. 1 Y- q% J8 C+ n  ?' ~5 |
  9. void Drv_Hcsr04_Init(void);   // Hc-sr04初始化
    $ s5 ]0 _% }7 z  U) R3 v
  10. void Drv_Hcsr04_OpenTimerForHc (void);   //打开定时器
    % [* z1 l7 g( r) V. P
  11. void Drv_Hcsr04_CloseTimerForHc (void);   //关闭定时器
      ~5 _' f5 n, ]0 _  Z9 m
  12. u32 Drv_Hcsr04_GetEchoTimer(void);   // 获取定时器时间
复制代码
- q3 H8 H. w- ^* u8 V) K0 r

" w* [- X1 m# C" @: L五、应用实例1 A! R( y1 U- h; Q
利用串口打印距离信息,main函数如下
. N, F# ~5 S  h2 U3 i3 \
  1. float gDistance = 0;   //定义获取返回距离变量; N! N; b: ?; }0 ?! o$ j
  2. ; [( X  m4 U8 R7 J4 d. W1 t# {
  3. int main(void)
    $ o  g9 a' b  f+ [; U, @
  4. {8 x0 H6 b4 L" l/ n
  5.     Med_Mcu_Iint();   // 系统初始化: e5 r1 F( J5 ?+ V" l1 u0 w
  6.     2 A9 c, g" a8 r8 j( X& H
  7.     while(1)
    8 ^* ?" f& v! o& Q, C" l
  8.   {
    ) n. C8 f/ ]0 L- w- u  j% o" z
  9.         gDistance = Med_Hcsr04_GetLength();   //获取返回距离
    3 A9 I6 F$ H9 f8 |$ k3 q( N5 B% U
  10.       printf ("距离为:%.3f cm\n",gDistance);   //串口打印返回距离+ }0 K5 d, B" |: }
  11.         8 J/ a/ |6 Z( o1 {: _* Z
  12.         delay_ms(500);   //延时500ms = 0.5s
    8 |, }' L0 k: F2 p3 X
  13.     }5 e1 P3 {9 _7 S3 s# ~
  14. }
复制代码

2 y: B+ ~7 J+ o! [六、拓展应用% ?/ o9 R6 }! l# B  V% W2 d" e
超声波测距比较常用的,比如利用超声波测距模块实现智能车的自动避障,这个在后续实战项目系列中会有,在此就不再详细介绍了。主要思路就是根据HC-SR04测得的与障碍物的距离,来决定是否要停止或转弯,以及往哪边转弯。
! u. m; Y8 K& k5 N4 T) V# q, U" U* |
转载自:二土电子4 f) X- Q6 C  q) m- V1 u' L+ ^& P, d8 l
如有侵权请联系删除
2 }  g# O2 w: d. p

4 N& q: N7 B; g3 M7 q! [4 s  O
3 ]8 {; t3 m. V# ^: @0 I
收藏 评论0 发布时间:2023-10-23 23:36

举报

0个回答

所属标签

相似技术帖

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