请选择 进入手机版 | 继续访问电脑版

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

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

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

  2. & e; ?0 U) B( W9 X3 V& P
  3. {6 G) w% W( w) S: h5 U) n4 [5 u) u
  4. # ^5 ~: d- p9 Z4 O% ^7 Y

  5. 3 W  R* ?% M7 n3 Y9 n7 V8 }1 C3 I
  6. 6 f2 L  Y) i' B' ]+ A
  7.        GPIO_InitTypeDef GPIO_InitStructure;+ B- l( ^- W6 w, i, L1 O, c

  8. & M9 `# s  x% H6 L
  9.         
    ' K* q! Q6 M# z' U! N# L

  10. 0 S& I" w# ~# Y7 v0 _
  11.        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
    ' ^2 m, G& d6 d9 C
  12. 8 A/ ~0 W, e$ ?  _
  13.        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);" A8 c( C% I* Z7 Y7 p' f6 B
  14. . f9 N, h( ?1 q' @( J
  15.   //改变指定管脚的映射  GPIO_Remap_SWJ_JTAGDisable  JTAG-DP 失能 + SW-DP使能
    - c! \/ _; t& j9 K4 F7 g: `

  16. : V* N7 f! {( A7 A) `8 E
  17.    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
    ) p* {2 Z' w3 h0 T6 Q  Y

  18. : t6 c1 k. K& I/ ~6 S
  19. + m  ~! V1 i* H; B, x! W

  20. / @4 F0 u. o1 s' f4 @
  21.        //PB6-SCL  PC2-ADDR
    ; K1 q- ]9 x6 b8 M  D6 l

  22. " \8 m( t9 H+ q5 O+ q( l3 ?, O
  23.        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //PA15
    + a: t' p7 j. w) ~! t0 }( A
  24. & ?) x; O" Z* ~' x6 F
  25.        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;/ w# K# r; b* P- Q

  26. + Q' i: L2 h. l% J; m
  27.        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //复用推挽输出$ {$ L# @8 g- c% N6 G
  28. " {, ]0 e. r8 [, k3 @
  29.        GPIO_Init(GPIOA, &GPIO_InitStructure);8 {! w; l2 j- |* m: L& b

  30. & S# l, I( P7 w/ v0 S
  31.       
    0 ^" z8 f! ~, i( J; t

  32. 6 a, i+ f' X3 B! p+ ~1 r  o
  33.        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    $ S& a8 _. ?! T: h1 r2 m0 c: j; F0 `

  34. ( q, a! Z  V4 n1 k1 F6 I; O0 f( y
  35.        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    " q; ?3 W6 d7 m7 k) T2 n' p5 W# |
  36. ' R. T& U4 P3 O3 {, R; h) p: D- @
  37.        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    . H7 {; ~0 s( E# @7 c$ ?) B7 V
  38. 5 w9 Y% B' I! X6 c/ ^
  39.        GPIO_Init(GPIOB,&GPIO_InitStructure);
    " p+ Q2 q' u, o: o$ Z0 g; Z

  40. ; T6 j  h+ p3 ?( R1 w7 U1 _
  41. }* {. g) ?4 R; r- r

  42. ! h6 A1 W# j7 A) k: q6 V

  43. " O0 @9 E  Y& p( B. n: b% K5 O# H6 i
  44. 1 P: F' P( `, q
  45. : o% S1 ~) G, j, T. D3 I2 |
  46. . l8 F5 k: x  P, F
  47. void Ultrasonic_TIM(uint16_t arr,uint16_t psc)) m, B  ]& k; _" v5 b! _! B) i
  48. $ X7 D6 \: m! p- O3 C
  49. {" _1 ^# K( e, l2 @! ]+ ]

  50. . S& v) G% c% t& m3 [4 ]- b
  51.       % i$ x8 Q' q9 n

  52. & }7 I+ ^0 M4 w& a1 d  @' ^
  53.        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;$ ]: C" ~) f! V& f  e
  54. 1 Q6 w2 p3 N$ k+ `; ^# k
  55.        NVIC_InitTypeDef NVIC_InitStructure;
    : i  D$ _$ ?8 |8 n/ ]3 e2 r$ _

  56. ; c6 _( B. n* s
  57. , h4 p! t% e: q
  58. - Q! n% M* H/ V# w; E. y% C
  59.        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
    % Z% ?: O# {5 C) Z* V2 R

  60. 6 q  ]. G: j( ]- y% f+ Q
  61.       
    7 `+ l; b9 _5 R1 k
  62. % l- x+ h9 y+ }" N5 \/ H7 l
  63.        //定时器TIM3初始化
    " p! F) t/ ]! K" k; b7 p

  64. + l- U& Y; l* E8 ^2 z* g1 L
  65.        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    $ l2 k% p$ S- a5 h7 y0 @! E2 o
  66. # d4 s- f' }5 D
  67.        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
    6 T! R& s% B  }/ M. {3 L! a
  68. , [+ u/ o  e& x) F5 C8 N
  69.        //TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
    # V* A1 ]+ z" O8 L( a! O
  70. & o* W: g& R* z& G4 X0 O/ W" r
  71.        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    3 t$ f6 H% H% `; u# H# k% w

  72. 0 g- y9 i8 |0 m
  73.        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
    ' a- K# ~8 R$ X1 G- j* g  I
  74. , Q& G( g3 R: C3 V0 K* g$ I
  75. 3 s; b3 z+ i2 O+ j% b
  76. : e/ t1 D; l( B; }$ I+ E& V1 u
  77.        //中断优先级NVIC设置' A# |; i: m% q3 d

  78. ; ^8 j! o* G1 x
  79.        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断- _- S# @* H. a( N1 F: _

  80. ( d) b3 k0 e. k6 F* k/ j
  81.        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级1 v# j7 D: B8 y+ d9 N
  82. 8 o- e$ w  W+ ?+ l% k& V
  83.        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 8;  //从优先级3级
    $ D9 K4 e9 G( ]# }7 Z
  84. ' T: I: h% ]) ^- @! c% e+ ~
  85.        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
    % }$ [3 P! N6 w; g; K
  86. 7 Y# i' ~: G5 ?7 O8 X
  87.        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器1 A  _  b, ?2 F% V- f% e3 c7 r7 Y% u
  88. * s' X. I: L0 l
  89. " `1 e( G! L& P7 E2 _

  90. 3 i, o/ d) ~* n$ _: k( a! s
  91.        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
    7 F- c& c+ S! B! U7 L

  92. 1 S3 _  h1 \+ V: v  I
  93.        TIM_Cmd(TIM3, DISABLE);  //使能TIMx         
    ' L+ s# d2 o) X: L4 V$ m
  94. 0 _; l( V! k# R1 w
  95. }7 y9 G# q) U& F( T  t

  96. " M* }4 d2 d# U" |: g' @; h3 @

  97. 6 H# p/ }0 `- w8 e5 g

  98. " v6 |3 u7 f" S/ v* q- B" {
  99. void Ultrasonic_EXTI()
    . O7 ]( |8 k2 d8 r
  100. % P+ z8 X: c  p# M/ p
  101. {& v8 Y, p( L5 o/ g& I
  102. 0 [4 H$ Q3 D8 V" k  M5 G0 O
  103.        EXTI_InitTypeDef EXTI_InitStructure;# }! ~8 \0 U: ]6 l
  104. 8 z0 v! B* W' d0 }: v: C" H, w
  105.       NVIC_InitTypeDef NVIC_InitStructure;$ G' g3 l1 h1 e9 `

  106. ) p9 f$ K% Z' k$ {+ A0 [6 g! j2 V
  107.       9 u) f# X! `) q2 z. g0 X5 \
  108. 5 K' F6 L; A  x
  109.        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    0 N; B: o! \8 K% ~1 ]0 {4 f
  110. ' E9 S  a5 k1 A* w# m% q. _
  111.       # Q' f" W- t8 D. Q, X8 P
  112. ' b- ^  P" @) {% j( f& Y* d3 c+ j/ E
  113.       RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟
    ; y' k, u9 i; G0 b
  114. ; M1 Q8 ~6 B* b1 g5 y
  115. " g% {  Z9 s  V- {, d

  116. : \3 h8 {4 @( s
  117.     //GPIOE.2 中断线以及中断初始化配置   下降沿触发. t& [" g# _  r. T1 L
  118. % Z9 y- x& j# H. y9 ]
  119.       GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource8);: f+ X& |' |1 W" p, r
  120. : n- Y/ ^3 a7 E' D
  121. 0 M  |# E7 a9 c0 @

  122. 7 ]$ e; F( k# d4 ]! |
  123.       EXTI_InitStructure.EXTI_Line=EXTI_Line8;    //KEY2! g8 J# T, y7 Q

  124. + W* f" f# C+ O, ~# l
  125.       EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;   
    # f! t& f3 _9 Y9 t$ B9 r5 f) _) U5 ]/ z
  126. 6 G0 h4 ^9 @4 `; r2 k5 A1 W, O% W- u/ P* o
  127.       EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;# S3 c3 N& k5 _5 w
  128. 1 ^4 N. k/ T9 u7 N& l' d& I" Q
  129.       EXTI_InitStructure.EXTI_LineCmd = ENABLE;, t" a4 ?' b0 G$ R/ `1 A
  130. % J( d; j9 }3 V2 L8 l4 y) p
  131.       EXTI_Init(&EXTI_InitStructure);           //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
    9 a7 R5 x* P, Y* Q. j

  132. % g- G# }# s2 {4 t! m
  133.       
    4 [0 Z+ [5 ~, n0 b5 \4 P* P: @
  134. 0 y- z1 u" E! D) b# r/ B* j
  135.        NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                  //使能按键KEY2所在的外部中断通道
    - d0 I, Q: y( J0 @. T( R  d3 F* Z* H
  136. ( [' l0 ]7 I9 t" F  l
  137.       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级2,9 Y4 v) O& t5 P" C1 i7 l
  138. 1 W: v) Z# E0 g
  139.       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 7;                                  //子优先级2+ M, D9 ~  X! w. h* y

  140. 0 D; L& l/ d* w, V5 v
  141.       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                      //使能外部中断通道  g1 a2 n  n5 U: D; F7 b6 t% N: x

  142. , k: F3 N* J6 l
  143.       NVIC_Init(&NVIC_InitStructure);/ }: ^% j7 O( w  J  D: g8 K
  144. 6 h+ q9 R" W1 m6 R. \5 @& l3 `

  145. * R: @  W* q- W+ j

  146. & N. a5 A" j( B  r6 v& \, O
  147. }
    7 X1 |! _5 C4 ?+ ]" z( h
  148. + d8 E* w; w4 ~- u* S
  149. & ^1 M) U" |9 F; r
  150.   V9 ], L2 t0 P
  151. void Ultrasonic_Init()
    . k- l! I+ b- M5 S1 V- G2 Z- r' t$ ?! }
  152. 3 x. Z% g4 G# Z' R6 B3 \; N
  153. {. @5 m, k" n' j, v8 j; e
  154. : u# z0 H4 n! {$ W& W) v' b6 M3 x
  155.        Ultrasonic_Port();, i: ?; K, c9 S2 Z( W3 c

  156. ! i% t, b: o# W
  157.        Ultrasonic_TIM(9,71);//10us6 g( n4 M# r& a, N$ i

  158. 5 E  F5 J: [6 F, g. V. A
  159.        Ultrasonic_EXTI();
    $ \  l6 H8 d3 b$ A8 K+ X( y

  160. 7 B+ y) Z( Y6 t; H6 r  m
  161. }
    , d. C( W0 y9 L

  162. / E4 J) r7 s  \& g

  163. # s( t+ ]$ l7 P+ K
  164. ' R3 o5 K( X8 A9 ^' Q2 j
  165. / B  ?1 V/ D! ~

  166. , t% S" L& ]# }' J
  167. //超声波测距& f! ^  Y% H+ n) z2 U
  168. * [' E6 M( J8 A
  169. void Ultrasonic_Ranging()# D0 B4 ~" j7 I! e4 |

  170. ' {. O# C# x/ }9 O; N/ z! `
  171. {1 J5 ], j2 k( F: Q/ w7 y
  172. $ `/ O" h) G: Z2 ^4 k
  173.     INC = 1;               //关发射          , u- G) O* V# K0 e
  174. . c6 {5 l0 F4 I0 e! X6 I
  175.        delay_us(3);9 X( P+ b7 E1 \0 g
  176. 6 `- ~0 H  B; m
  177.     INC = 0;. H# C4 F" R- f
  178. % ^( e, {8 |0 Z7 @6 m

  179. # L4 }5 A* R8 c) N
  180. & @1 T2 \; w7 h- f! U
  181.        TIM_Cmd(TIM3,ENABLE);6 r1 s% t1 C. e
  182. # j% Z# F+ z$ ^$ g1 ]
  183.        //EXTI_ClearITPendingBit(EXTI_Line4);
    & W9 z% b. u! ~! r' C9 ?3 W& H
  184. . F( m" k$ r- a* X1 V" U( n, x
  185.        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
    ! l& o" A0 G5 e+ R* Z" ~+ O5 e
  186. # x) ]+ ?/ j$ y5 ^# e5 v6 f
  187.       * @% `+ P! x& H& ?4 \

  188. + t  W0 a% p0 d' T: `
  189.     Ultrasonic_Num  = 0;                // 定时器清零0 |% V$ k: P1 m3 m6 b6 h  f$ `8 I

  190. . N, V  X6 E! J7 j3 a6 @) ~

  191. 7 I1 W. E* `2 q! W! u" D( O
  192. 8 r& O' g0 r$ B, Q) W
  193.        delay_ms(30);               //等待一段时间,等待发送超声波控制信号, ~* K1 u; F0 @0 C( ^& N+ w& J- C

  194. 3 {; w* }. P; f* U# C
  195.        INC = 1;
    ) U4 Z9 B- [# k% `$ c4 `$ P8 ]
  196. 9 c! h% F: ~+ }
  197.        delay_ms(5);$ F. p7 @# p3 C# F8 e! t7 g
  198. 0 M+ n% M/ s' M& W" p* q- E
  199. }0 B- U. M' g/ H( A0 L
  200. 4 w: d% Q3 L& z& F
  201. 9 U7 `0 M4 J7 m4 s$ `
  202. ) _1 s% J) z4 @& h" W' y, V
  203. //定时器3中断服务程序" F' ]  \  K0 L; C+ L. H9 Q

  204. % C0 [3 Z% b% y$ U
  205. void TIM3_IRQHandler(void)   //TIM3中断7 \5 h  R- d% V) T( j! z) s" C

  206. ; W+ k2 H2 |, ~' C$ y" D
  207. {+ j) q2 C1 j  R) b
  208. ( v* k; _! {  a3 e
  209.        if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)  //检查TIM3更新中断发生与否
    8 R6 c; Z  p' J+ ?1 c
  210. & O7 o) c* _3 Q$ L) m3 s7 l( C* q
  211.        {
      }" l( N, g: z4 w9 _% n2 C6 _
  212. * V' w3 W+ ]# f2 |7 @* _) X
  213.               Ultrasonic_Num++;
    ' Q8 y, v) \7 ^# p5 {9 w# v6 b
  214. ' c* W. Q$ w3 D7 M/ s
  215.        }5 o6 l, Q, B2 p+ n

  216. % u9 _7 [! y' O6 b6 d: J
  217.        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  //清除TIMx更新中断标志
    / S3 {; M4 t% N% x0 A, d2 T

  218. + X. U5 v; R# P3 T4 E/ m) S; @
  219. }
    : f7 m% T4 x5 K4 Y" e; A# U
  220. 9 M# L& L; |+ I: ]% D- @1 u* y
  221. : w  t2 P0 ~1 ?- X
  222. " D* s: @) B0 Z* o3 f4 J
  223. //外部中断2服务程序7 z) W3 P4 [: E0 C9 _
  224. " h( L6 d# e' h/ U5 H  m
  225. void EXTI9_5_IRQHandler(void)6 _; w: L' m, F
  226. ' P5 h. m9 t2 H/ c) |! m. d5 n% y4 Q
  227. {
    * P' b: |+ i5 }
  228. . f( W8 X- |2 L
  229.        if(EXTI_GetITStatus(EXTI_Line8) == SET): d& P, g' I, b: f9 i/ c
  230. , W0 d, L3 F2 M8 o" q
  231.        {
    " c  S# F3 _7 D% ^4 U2 O- ?

  232. 4 f/ o$ A, S' [. U
  233.               if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8) == RESET)
    : V# z7 C) d5 u8 n# c

  234. " K/ l8 Z4 [/ W+ {: E( \6 ]! l! k
  235.               {     
    0 A: o9 s$ w+ `
  236. 1 e* ?) e, r2 ]  m4 i' E( R# g
  237.                      TIM_Cmd(TIM3,DISABLE);1 h% ]1 a" j" g  `* u! F& S. H3 e
  238. " ~- `; W$ v% g! M' H: h4 u2 m
  239.                      Ultrasonic_Value = Ultrasonic_Num;& T0 |$ O( O. T5 Y$ O; _) U& y

  240. : q/ @5 j0 _: `9 z  G# ?5 N! J
  241.                      Ultrasonic_Value =(float)Ultrasonic_Value*1.73;       // 计算距离定时10us,S=Vt/2(减2是误差补尝)
    0 z8 W) m" t+ `% O; v* `

  242. 7 r% N6 I! {: Y9 ]% K
  243.                      dis = (uint16_t)Ultrasonic_Value;
    0 D* e$ ?% [2 S" k" _

  244. 8 @# t9 k- e3 P- z
  245.               }
    $ Y2 O% S+ m+ U7 y) f5 _+ Y) D

  246. 0 c+ ~9 h+ _/ C. Z* l* e- e
  247.               EXTI_ClearITPendingBit(EXTI_Line8);# C2 I9 j4 `- z6 P# b: y4 T: i4 t

  248. 7 w# Y4 X* Y& }* o- x% b3 b% r
  249.        }              # y* j6 X- N9 ]5 Z) K( R/ f8 o

  250. : k8 A) h) \9 v  Y. Q0 c
  251. }
复制代码

/ X1 s+ {( `/ \( k3 A% H, \
4.png
实际测算还是会有点误差的。

1 V7 y& \  w! u' t. a
收藏 评论0 发布时间:2021-6-10 22:29

举报

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