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

【年中粉丝节】+超声波距离传感器

[复制链接]
liuxingkeji 发布时间:2021-6-10 22:29
【年中粉丝节】+超声波距离传感器
今天分享下板子上比较大的传感器,就是超声波距离传感器。使用超声波距离传感器就比较简单了。
1.png
首先看下超声波测距传感器的原理,一端发射声波,当声波被物体阻挡就会反射回来。被接收端收到,只要我们算好这中间的时间差,加上声音传播速度就能算出距离,有如下公式:
2.png
3.png
原理图是这样的比较负责了,用了一个555定时器产生38Khz的方波,接收端其实是使用了一个CX20106A的红外解码芯片,其实这样是频率对上了,之后是为了程序方便,初始化一个定时器中断,每10US中断一次,然后把接收端也放一个中断,这样,开始发射时计数清空,然后定时器中断计数,这样来算时间,之后通过IO中断,来判断接收到了。在根据上面公式就能算出距离了。
  1. void Ultrasonic_Port()
    % P6 H! v8 U3 k! }$ U

  2. # X2 E' B( h) B( x; i7 ~/ V3 ?
  3. {" f6 t, Y" Z9 L; c
  4. 2 x; |) m8 |. M. J. D
  5. ) R9 w% V: \( Y
  6. + B  [: ?+ X- c
  7.        GPIO_InitTypeDef GPIO_InitStructure;
    4 I& D, t1 w, P7 e6 D4 U# ~
  8. # @6 a: \1 L9 p. P/ x1 s
  9.         
    1 A- A* e0 Z1 S8 t: I5 n

  10. . r1 X8 l  |# X+ P
  11.        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);" G6 O; k- E2 u8 d: Y

  12. / G: m; A) s( e) l
  13.        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);9 V7 K0 \& c! s9 a2 F6 Q; B" m

  14. 8 Q; q. c$ g8 l
  15.   //改变指定管脚的映射  GPIO_Remap_SWJ_JTAGDisable  JTAG-DP 失能 + SW-DP使能$ r# N8 l, [& D, }) |6 D

  16. - x. R0 U0 a( a5 l2 j
  17.    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);' b9 _( L/ v6 R! d( l4 d

  18. + W# e, G$ m; {" h

  19. : D7 ]! A/ S, \  K/ z

  20. : A" ~" ^9 x7 _  ]8 p/ e
  21.        //PB6-SCL  PC2-ADDR
    8 i# L8 M' d1 p! G; b+ I
  22. / |# |' t' Q1 A* D
  23.        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //PA15
    ! |& d$ @, @' b1 T/ B
  24. " s) K( C: E8 k# F9 _; q3 _; ?6 ~2 w# A
  25.        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  b& }4 ?3 [4 O6 S2 P) J2 Z

  26. , N# T* _# V! _
  27.        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //复用推挽输出
    & w! X4 B; p% q( R+ D+ V7 O4 J& o

  28. % h- V" j7 J+ x7 n% q, p
  29.        GPIO_Init(GPIOA, &GPIO_InitStructure);
    ! G/ K  f; b/ j' p
  30. 5 N3 C3 q3 K" v3 |- C& U7 E
  31.       & f' E% u! m& [8 n
  32. 2 k1 B* ]4 _& ~- z9 @( |
  33.        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;7 V9 U8 `6 g0 J! ?% B( o$ N
  34. " @2 ~" y/ @! Z3 {* m
  35.        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;8 T- H. ]7 S. i8 ]

  36. " F- a9 x7 c* ?3 |% W
  37.        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    , U8 K! ~3 B4 J) {$ V9 \5 \/ j
  38. ( O" z, V: @# S: Q0 y* a0 Y
  39.        GPIO_Init(GPIOB,&GPIO_InitStructure);) y5 w2 |2 H/ s% n1 J: @- A" [

  40. ) Z+ Z4 U# H; n5 o- p
  41. }
    4 g, H7 D! ^$ r9 J) C

  42. % H, \" W# \  u/ {- ], l

  43. & j8 F1 Y. I4 K6 t5 p* P
  44. ) @$ |1 Z# ]) G1 d9 V

  45. ' r& y1 t- k8 V+ ?0 M; g! ~. e+ D
  46. 7 j6 F  E  w5 O4 @. h0 Z" v
  47. void Ultrasonic_TIM(uint16_t arr,uint16_t psc)
    ) |' {- P* t# P4 X

  48. ( S4 p3 c% x0 Q4 ?) l- N3 F
  49. {
    3 ^! g2 w( r, F0 M
  50. 8 Y$ v" o7 g  W7 @
  51.       9 p% Q. i" @2 X% q

  52. , L, ~) H  ?5 P% K. m2 _+ ?/ F8 n
  53.        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    " T5 K+ f# M! w; B, ?$ I

  54. ' ^3 D/ H2 M% R* x7 y: h
  55.        NVIC_InitTypeDef NVIC_InitStructure;% ], A2 c9 V3 n: v' Q7 L7 A
  56. 4 K8 I& T6 M+ l8 t4 F9 w) B
  57. 0 R4 _/ s% ?8 `1 i. @- q
  58. 2 c. N: c" R* j/ d3 M
  59.        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
    $ D3 `. l! p; D

  60. 3 j! g$ P/ b* N' a+ A4 u
  61.       ( s  l1 e' \1 K

  62. " e1 I# [5 C7 {
  63.        //定时器TIM3初始化
    / L6 i1 |$ s7 h6 j6 Z

  64. ) h9 C) }( g- {% r- }$ n
  65.        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值" u, k8 Y1 x# F  M( l
  66. 7 a; |9 |, Z$ J
  67.        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
    3 d, |0 E) S. i' B: }

  68. : W6 C! H8 w. H" L
  69.        //TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
    / N/ }8 G% P2 s9 L! ~

  70. ( `: b; x) X7 o1 ^
  71.        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式6 ^0 U5 q5 u" n/ `2 D
  72. ) [' f% B" u( `8 [- ]# O) M
  73.        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位# g9 @) i/ M0 ]. I
  74. ) h" ?$ n5 S1 ]& Z: }4 w, b

  75. ( R- i. U# {2 s' x3 N7 m& k5 S

  76. ( x6 L  A4 ?/ j9 S0 t0 A, x' o
  77.        //中断优先级NVIC设置
    ; Q. A. J+ N5 k4 A1 e% q' f4 R
  78. 5 D: t2 T# M; t# o% x9 s
  79.        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
    " {6 Y/ D; e) o/ v
  80. & C8 r3 N& {/ a4 T* L5 c
  81.        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级, E0 \5 o4 W8 d5 }' v
  82. 0 X$ n$ g2 L( _, x% Y
  83.        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 8;  //从优先级3级
    $ p! f) i; I& W5 b! e' H
  84.   e5 R/ ]8 p8 _6 L3 v% F. H0 w
  85.        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
    . v% A1 r- C, S* V. a7 ~1 ~& C, K
  86. ( w5 \. Y4 b- l
  87.        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器+ l& t# X0 |& P1 _/ i& _
  88. # ^/ z1 M8 [6 x5 T

  89. 1 S8 ], E8 i! T' H! S

  90. 5 |- @' }; ]( c* v% k- L
  91.        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断1 b: E7 S/ a% y6 b7 l8 D6 y. |' Y
  92. % ], a4 x4 \5 L3 Z9 N; e9 N; g6 }
  93.        TIM_Cmd(TIM3, DISABLE);  //使能TIMx         
    6 `+ k! U( ^: A
  94. 2 E" @. k0 K; U
  95. }
    . e% x+ V! _9 h* q1 E; X2 p

  96. ' n* Q. w$ a/ O+ e5 g0 f
  97. . [1 U4 k: P6 h( n
  98. % }' ]6 J! L( w6 T* w+ i
  99. void Ultrasonic_EXTI()% e* L6 c" j! I0 }: R1 B# J
  100. * f* Y' a6 j' l1 W
  101. {
    + j" g* D' C& f$ k! z6 l( O- D! ?
  102. + Y! a( u+ D8 F! a7 S! N
  103.        EXTI_InitTypeDef EXTI_InitStructure;# `5 q0 D" @, }4 T/ g5 R
  104. $ k( v! Y1 r  m) x, }" R7 L9 A
  105.       NVIC_InitTypeDef NVIC_InitStructure;7 D. ]2 i- h# ?1 }5 f
  106. ; F/ E# \7 Y' m
  107.       
    " @8 }+ Y2 b( ^) u( k

  108. 0 B  s+ m! j# t
  109.        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    * u! k( x( E% C" y" \2 y

  110. % J0 L+ Z6 x! K4 o9 o" ]
  111.       3 I6 J8 C7 U: g/ P' Z6 @
  112. 8 ]% @; A" S8 I0 F/ q" T$ r7 v! J
  113.       RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟, T' K0 _- P( Z' q6 g  A5 `, j7 B

  114. 8 h! Q! G& m# Q( t$ A! X
  115. 4 r/ u1 Q  T; u; D2 g6 q
  116. " \5 Q/ Z4 a, C) r( C- i
  117.     //GPIOE.2 中断线以及中断初始化配置   下降沿触发( M3 E" Y: m. `& u+ T

  118. + \- O4 i$ E4 w: G* B: V
  119.       GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource8);' e$ p1 N) d1 N9 E7 v
  120. ' k" M( s6 e$ D7 u+ g$ B

  121. - g. m- l  }7 g2 y* ^
  122. % G/ V  m5 K2 C! i/ K
  123.       EXTI_InitStructure.EXTI_Line=EXTI_Line8;    //KEY2
    7 d; z3 |/ e' n0 }% F9 G8 ?: ?

  124. 7 A9 q" M. e" P0 c4 n/ m) N) a
  125.       EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;   " k% D& `# Q2 I" @8 c
  126. 5 D( A+ J4 j- z+ A5 e
  127.       EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;4 t/ w( [5 o1 Y
  128. 4 w% p' o& M6 q& v2 y
  129.       EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    % D' Z, L8 x& @
  130. 8 }+ n% q5 y" D8 E, J7 C3 B5 D
  131.       EXTI_Init(&EXTI_InitStructure);           //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
    4 e! [) d: H+ Q& N' a8 N4 |" p% W

  132. # w4 B3 C% d) M+ t0 y9 ]* k8 [1 \
  133.       8 e5 o" [  I4 O" r1 u% {
  134. 1 @0 P* s) m& |% ^# p& a+ H
  135.        NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                  //使能按键KEY2所在的外部中断通道3 }8 `1 o9 \9 U+ }/ s
  136. 4 K$ e2 Z( q/ y2 p8 k# w- z4 K
  137.       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级2,* l5 p9 a1 m5 U

  138. 1 _# i8 [4 I" E/ F
  139.       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 7;                                  //子优先级2
    . P9 n4 w# N2 \! z9 r" I% i0 X

  140. * X7 v1 w: i9 z8 d  M
  141.       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                      //使能外部中断通道4 Z+ A3 m3 Z9 I% G) I( N- a
  142.   P6 R" q' V) }! u6 c
  143.       NVIC_Init(&NVIC_InitStructure);
    / e5 q" ^; Z  \  W0 w( W3 N

  144. 5 I5 i* [0 n- R
  145. + b) I: L& v4 B; [) a

  146. 3 a: A8 x: ?9 _8 p
  147. }
    + v5 {  M5 v5 x) Y, b; V

  148. 6 F1 a' F( `! ]# h5 P( r: K
  149. 8 k  ~0 h# N7 B! r( K
  150. " J3 e0 B$ p7 O$ _
  151. void Ultrasonic_Init()* D, r2 {" ?4 t; |: l0 W
  152. ; ]; R( h( o0 z8 [, @9 D% `9 E  @- Z
  153. {6 H: L! c, V, k& r8 m( K

  154. : z/ B' Q3 I$ m/ Y5 Z
  155.        Ultrasonic_Port();
    ( ?0 a; Z, Y* d4 C

  156. 3 s2 k4 _1 N; P4 A0 i2 W
  157.        Ultrasonic_TIM(9,71);//10us
    4 F1 |+ m* A  J/ x
  158.   V: b) z: y$ m; r6 o9 p
  159.        Ultrasonic_EXTI();& s/ w" Q/ ]+ [/ f% h  k3 U" w
  160. ' Q9 ^( V! F/ O1 y2 B8 [9 R
  161. }
    ( k4 V' H/ f2 b- h) Z

  162. 8 Z( }6 T1 `$ y4 k
  163. $ K7 j! Q0 ~+ w) J

  164. 9 {+ I; r0 D! \
  165. - d) X0 Z+ P% H; m1 Z

  166. 7 ^  ~$ m5 |) Z) k, p" g
  167. //超声波测距- M* t- F+ ^0 T/ ^. k. z

  168. 6 X( h8 t6 Y3 x: @/ N5 W, Y# S  R
  169. void Ultrasonic_Ranging()5 R1 i* f* D: ~9 H9 f3 P

  170. ( P" o9 m5 `- z# v! C
  171. {; V2 Y' w% `" {: M% C

  172. * T! s  o; G; a' g! s+ l
  173.     INC = 1;               //关发射         
    " P+ C1 b) i& q- [' r5 Y

  174. 5 U- T, Q3 p* ^6 I
  175.        delay_us(3);0 A. d+ A$ \/ Q/ u8 B& r

  176. 4 u  G1 `. C% t' Z, C; A
  177.     INC = 0;
    + e- T. E9 Y& u
  178. 7 O+ |1 [7 u# X2 b
  179. ! a- K7 q2 B( H& ^# e
  180. 3 s! X9 j' u9 d7 }1 k/ {
  181.        TIM_Cmd(TIM3,ENABLE);
    / J. J7 I2 t. l

  182. ' ^( G4 C! u6 _4 u, G4 I
  183.        //EXTI_ClearITPendingBit(EXTI_Line4);: t/ l5 B5 S: }! T( h  ], M

  184. ( X$ M  \. C; N5 D
  185.        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
      l7 `2 ?# s" [. M
  186. ' R' s/ T0 t2 [7 S
  187.       ( n3 E1 |8 |- Q& X* Y

  188. 7 d' G0 q8 T2 W6 O' R8 ?2 O
  189.     Ultrasonic_Num  = 0;                // 定时器清零
    $ ^, p% W# [1 P# R& k5 u: p

  190. ' H# Y  s: @6 U* o% h) [) |- m# u

  191. $ N0 K) E1 p& T  o

  192. , c, {( U4 z: E/ ^3 w+ L
  193.        delay_ms(30);               //等待一段时间,等待发送超声波控制信号) v/ C. _- V, ~9 f1 f# M

  194. # [" w  \- @. L$ G
  195.        INC = 1;8 C# l; t0 T2 l/ M

  196. 0 U. j7 r; r  M, y5 m7 |' F2 q
  197.        delay_ms(5);2 |3 |" w7 k" _1 Q! \/ D

  198. ! P. D' v6 g4 v
  199. }- W! ^; `- ], u
  200. 9 ]5 J2 i! V- ]. \! H! P  N) f

  201. ; g  \# E" v- N2 ]
  202. 5 h; Z  F) i& V/ [
  203. //定时器3中断服务程序% ~$ a5 Z) M% a$ c4 a2 i
  204. 0 T& W) o' N8 X5 n" z1 r1 `2 }
  205. void TIM3_IRQHandler(void)   //TIM3中断$ w, Q3 `- P' i3 i* v7 o
  206. . I* L- u8 d) r' z
  207. {
    $ j+ y3 U. D7 R$ T3 ^
  208. 9 f# T6 y5 m5 Q- V' c
  209.        if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)  //检查TIM3更新中断发生与否
    0 k2 p" ?! b2 K" e3 l  ]

  210. 8 m9 V$ X8 e5 O& p. d/ @
  211.        {
    : w: X: L" Y8 O, ~

  212. . O4 B- ^' T% k6 C1 ~
  213.               Ultrasonic_Num++;
    " {+ \7 w) k0 [5 o( i

  214. 7 q$ V9 r6 Q( T
  215.        }7 c+ }& o* V) p: ^+ d, g) m

  216. & \  b# Q; O& S7 q
  217.        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  //清除TIMx更新中断标志: g3 k% d+ L- T& k
  218. 5 E$ Y. X: I7 S) J  k! V
  219. }% i0 w8 T5 K( B4 n9 \+ b# M4 _
  220. $ M  s9 W/ ^/ Z- e
  221. " X0 L4 F6 q% J
  222. 9 U8 @3 \% \. _) \( v% H
  223. //外部中断2服务程序
    ; d8 D- C1 @* E" q: P7 \
  224. ! i7 v& m- K# f: R) e. f5 t
  225. void EXTI9_5_IRQHandler(void)
    & W7 N1 g1 D% n! e9 J, T3 ]

  226. + O) b9 T# ^. V8 F
  227. {
    - f* r( t7 |+ J0 o/ N# K

  228. # i- v* ]3 o% S% \
  229.        if(EXTI_GetITStatus(EXTI_Line8) == SET)
    , n/ t+ e; q/ D# x3 X

  230. 7 {+ a# F" c9 y2 k) l& T
  231.        {
    5 X5 W# ~* ~$ G$ V, ]  w6 E

  232. & A; Y: S7 n/ [% m3 G# d1 G; O
  233.               if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8) == RESET)
    5 f, u- R9 B% ^9 Z

  234. % K7 K$ t% f5 V: y! \
  235.               {     0 h0 b7 {; i( t

  236. ; }* a3 E% n+ |) a# v* n" a2 o5 F
  237.                      TIM_Cmd(TIM3,DISABLE);
    8 m4 V% ^& ^1 i/ O& N( ?

  238. , H8 z2 S% x& Q3 U# L6 j
  239.                      Ultrasonic_Value = Ultrasonic_Num;$ X# Q: Y/ X# G
  240. 8 x3 F4 @8 j' Y" _
  241.                      Ultrasonic_Value =(float)Ultrasonic_Value*1.73;       // 计算距离定时10us,S=Vt/2(减2是误差补尝)% }/ @9 X9 s9 K3 Y: w% V
  242. 3 o$ h" |) J5 k3 [% V
  243.                      dis = (uint16_t)Ultrasonic_Value;# x4 c7 l2 u: ~
  244. - G$ X5 {5 Y- S" N- X0 m" ^
  245.               }
    ! l% R6 e0 R: a: ~1 y

  246. / [& i' M' `$ J8 \) e
  247.               EXTI_ClearITPendingBit(EXTI_Line8);
    ! T) ?. h5 K# O9 [* l( b+ x# j

  248. & U5 I5 X- |- X
  249.        }              
    9 X3 s* i" N. f

  250. 8 n' v- T* F% m1 D5 \6 N4 O+ c
  251. }
复制代码
9 n+ H6 U  }) `
4.png
实际测算还是会有点误差的。

  `. w* a2 m8 A
赞 收藏 评论0 发布时间:2021-6-10 22:29

举报

0个回答

所属标签

相似技术帖

官网相关资源

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