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

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

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

  2. ! u9 z6 m& e8 k  j5 q" e
  3. {' [. w- o0 [3 @  @* f3 o

  4. 6 {) I( i' O2 Q- t  R/ `3 @3 K
  5. ) Q6 Y) z( u* D0 k, y" j

  6.   J8 V2 S4 X! Y: e
  7.        GPIO_InitTypeDef GPIO_InitStructure;6 j0 ?# M8 Q, P" q

  8. ' V' U* r3 U0 j  G  o; H$ G
  9.         
    : y$ A$ i" @- M

  10. $ ^! q$ j& |+ R7 z2 P( G
  11.        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);- X- p8 F7 D9 z0 T7 ?& ^$ A
  12. ) V3 t! u: \8 x+ n$ E
  13.        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
    * s+ l/ A2 Y+ f9 E, }1 W
  14. $ [, v$ ^1 n4 S8 W% h
  15.   //改变指定管脚的映射  GPIO_Remap_SWJ_JTAGDisable  JTAG-DP 失能 + SW-DP使能  K9 y  Y9 h1 l, m& o3 g
  16. , v# }. {6 j+ f" p, A
  17.    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
    8 h6 G$ }# {9 N) |' L5 ?5 u$ T
  18. ! S6 O+ S) k* S2 b! t1 A7 u1 A4 \5 @: Z
  19.   X" n- W. Y" O4 ]; O( _# D( f
  20. ; T) W. ]8 L+ p$ m( p$ D
  21.        //PB6-SCL  PC2-ADDR
    6 S& p% B+ y4 l' u

  22. * v0 t9 K+ B& H1 ]6 Y
  23.        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //PA15
    ; j- ^& _9 |4 c" j$ {$ K" S, Z
  24. 0 A' J, P+ V1 D! ]' D2 K9 g
  25.        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;& D/ }" s, b9 s: }* _
  26. % m( d/ y% e* G$ K, d
  27.        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //复用推挽输出
    " O* a8 n1 i* A5 ?' A3 m

  28. 6 S& i/ E7 U  q5 M* t# G; t( u0 V* c
  29.        GPIO_Init(GPIOA, &GPIO_InitStructure);2 P8 Z; a) k' n* R

  30. ) M" T6 S* l8 t- C6 k
  31.       
    # p# ^; V# e6 m7 _; q9 l2 R

  32. ) d( r( ?' w7 L  y+ @0 p7 ?6 ?
  33.        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;. G- l$ Z) r/ [( o" ]  V
  34. $ d7 y2 E- T) \8 T
  35.        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    ! p" B- q" d* o  {1 s
  36. 3 k! A. A) f, U- w2 I( o" J
  37.        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    $ a7 ]! [3 \7 {( S) a) e

  38. 8 t( R7 l; c& p% f" J7 n
  39.        GPIO_Init(GPIOB,&GPIO_InitStructure);
    % B/ _2 m1 S% K: m
  40. 4 T9 L; N& R* a: ?* u
  41. }6 A3 ]! m2 Z% L- I' m
  42. ; ?/ d( H% r; B- r( _; F

  43. 4 |( V* }8 n* ?" }

  44. ; z3 N8 l$ b7 J' ], O" G9 Z5 u

  45. # ^8 P! ?0 E4 f7 K
  46. ; t/ _6 o8 J' \" o" v. K
  47. void Ultrasonic_TIM(uint16_t arr,uint16_t psc)
    ! w  S* l  n  s6 D& j

  48. ) ?& _$ i' ?* [+ U5 R
  49. {
    ( i$ n$ a" Y/ [. L, q  J2 P) N; ?

  50. / R( C# p/ a) f
  51.       
    * i7 f, j$ _' E+ g1 |; p

  52. 4 ]. A  ~! E% f7 g
  53.        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    : t0 M9 _( a. ~& S: \& z

  54. 2 ~- {; c' n( G5 @2 x
  55.        NVIC_InitTypeDef NVIC_InitStructure;9 \7 x  {5 ~: O$ }7 |
  56. 7 C0 w/ S& C* p1 t, b) B, M

  57. 2 D% O0 Z* L  J& p

  58. / p. g! _1 B/ A. u
  59.        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能) t4 `& B+ m6 n& q# j

  60. # d0 Q* M+ V7 V
  61.       
      X/ m" F1 [7 |% ?, Q) R
  62. 5 C# [/ C" E$ Z, z1 D4 t
  63.        //定时器TIM3初始化
    ! H/ J/ a7 J6 J5 a
  64. , |- L0 ~: M2 i- [
  65.        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值- M0 C9 g# ?; K5 A2 m0 v- N3 f3 h% j

  66. ! O0 T2 B" U" U. l) T5 j) e
  67.        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
    - _9 S2 W, f1 l% v$ f: T
  68. + S  [5 i. l4 ?+ d/ T) W, `  V
  69.        //TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
    2 i8 \) s0 r+ j; ~% l- A7 V8 X

  70. / J# R+ ~/ G: i6 A
  71.        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式+ ?# }( N5 K/ c, w/ s7 ]7 ~+ D
  72. ! o9 g% C$ G8 y% k$ r6 |8 R  J
  73.        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
    4 V8 O; e% [% p+ d/ L
  74. " r; Y0 u$ T* V5 `* l

  75. # R( a# e6 _' Y- @9 T$ P8 n

  76. ) O, I3 x" A3 q( t
  77.        //中断优先级NVIC设置8 Q/ I, U, h* }/ O+ E

  78. , f* P  ^  m  g9 m7 i0 {
  79.        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
    ( w- B! g# q+ f( r5 y

  80. 1 L0 f- r7 T% _7 U8 Z
  81.        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
    2 a* T/ u) q, j2 t* S! H( l
  82. . q: A" I+ I% l% p6 z
  83.        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 8;  //从优先级3级- w6 m8 g, Y* `. ^2 A& Q

  84. 1 u/ ]) R$ X! V# A& S0 E: P
  85.        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
    3 H$ \, B3 n9 s2 \. Z& X

  86. 6 j4 G6 p5 {; f$ f
  87.        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器: f0 ~0 E: s+ n) a& y( c

  88. & ?1 A. @/ D- c$ d6 ?( d0 f
  89. 8 h9 M+ E: n/ O' [

  90. 9 a* V! M$ @& w
  91.        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断& }; [2 `  m- D  O
  92. ; o2 B$ Z: [; u- |
  93.        TIM_Cmd(TIM3, DISABLE);  //使能TIMx         
    8 ~# Y3 E. [0 j0 M$ I

  94. : J) W/ U5 v# E( {2 `; b$ K9 w1 `
  95. }& P" G, \# S' a' n/ I

  96. " Z6 W5 Q6 s0 _% v7 z

  97. 8 ]9 G$ [" r- q: u0 g) A& q. X5 s
  98. $ `9 {& d  ]' L8 F& {
  99. void Ultrasonic_EXTI()
    ) n. [: x' @3 h! F) T! L2 C; _' A
  100. : F+ n. y. E0 B5 ]# U3 C
  101. {
    , u! L( g; A% {$ F" G' i( }3 Q% ?
  102. 3 Z! p9 B) G2 d3 o
  103.        EXTI_InitTypeDef EXTI_InitStructure;
    $ x. T/ |$ \( d+ }. m

  104. 6 N+ M% t# w  m4 a: N
  105.       NVIC_InitTypeDef NVIC_InitStructure;' z, W5 X6 \) ~7 P: m7 L
  106. : a; m. X8 I0 f  a1 m- [
  107.       : b' I3 t. L' z/ ~9 u: `
  108. * M8 G$ u# n, p- [$ z* _& F- ~
  109.        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    ) x8 j% P: z+ c0 g! r1 r

  110. $ A, I# Z, X7 h) Q/ I4 w
  111.       
    ; `* u. r- T0 i- m1 M

  112. 8 V8 R( r: J% O7 b8 d5 B
  113.       RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟
    - W  t2 I9 r$ E" b& c- `/ L

  114. + d6 _1 u) P0 i! w7 A

  115. ) V& N% A& o) F5 s) v" t/ D
  116. 9 A: _  O; m. [2 g1 d+ w
  117.     //GPIOE.2 中断线以及中断初始化配置   下降沿触发
    6 x7 h* Z2 A- M1 t1 i/ B

  118. % |5 |" A" h+ k( F' E- L2 X9 ~/ z
  119.       GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource8);$ b* V) _3 T9 |2 @7 l
  120. 1 s$ t# _* I; {. i
  121. + e: w# P( g: S0 m, ]
  122. 6 l9 e' g; u9 m' N' U* Z
  123.       EXTI_InitStructure.EXTI_Line=EXTI_Line8;    //KEY2( o4 d  E/ O- X6 \' t$ e
  124. 3 n& J& h2 t  w0 Q
  125.       EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;   7 x- G5 O- v, N$ `$ ~

  126.   D- O& ~6 O/ D/ D1 M( Y1 k
  127.       EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    7 k, T- I& v, T: b% F: {; h3 |
  128. * A  K* `5 t- x$ Y
  129.       EXTI_InitStructure.EXTI_LineCmd = ENABLE;5 B* }) v  Q) O3 `+ ~# z  |3 ^
  130. ! V  d9 ?5 f* R$ ]+ M  U8 y
  131.       EXTI_Init(&EXTI_InitStructure);           //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
      L2 |. N7 y  C8 p- F
  132. ' O/ O' |# l& h+ A; \
  133.       ( z3 ?* y# z, J- }  M$ Q
  134. 2 A0 B3 o8 ^2 L
  135.        NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                  //使能按键KEY2所在的外部中断通道% G6 G7 \& l7 C$ ~/ \; |
  136. 4 {# u- X! c$ V9 E, v
  137.       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级2,
    2 I7 }5 K. }* n, i1 i' K

  138. . z. ^6 ?# c7 ^+ k8 E& d3 r
  139.       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 7;                                  //子优先级2/ \, k* O' f; Z0 U1 m

  140. 5 x: D) k. V! U9 M$ c
  141.       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                      //使能外部中断通道
    ) n  k# E3 i' _+ D" |% @7 I" M7 I( }* X

  142. ( \* b# W, }# u8 a: j# }8 v
  143.       NVIC_Init(&NVIC_InitStructure);7 y0 _* L* O; F' t3 g- I

  144. " T7 ]  s( n. Z4 M

  145. % U  L6 @( I  p% j2 m0 L) l5 w4 e; x

  146. 5 O8 @+ ~& L4 {& X0 N
  147. }. w3 [; g2 G. T3 O* G7 ~. {. O% o

  148. ' p3 M! e  g& k9 R2 H: j" @
  149. # c; Z2 @1 ?, L" x# X/ L

  150. / X8 I1 ]  x' {- i) j; I
  151. void Ultrasonic_Init(): h3 p' f# P1 h$ m
  152. 7 B4 N8 w) \4 b6 F8 I; |) I
  153. {
      C4 @8 w" E' b. o

  154. ' `! {, }/ G4 @. y5 F' @
  155.        Ultrasonic_Port();
    . u& Q) }; ~0 h" I! y+ {. h
  156. ! |! g# U0 h4 J% V) V
  157.        Ultrasonic_TIM(9,71);//10us0 @  y# Z0 z2 a% u% _
  158. 8 r- _' R( b- Q9 X9 C# A7 Z4 |
  159.        Ultrasonic_EXTI();  u# u$ `3 A9 a6 V- \1 j0 Q9 e
  160. 3 F0 ~- g3 m  A- y0 R& D( g5 V
  161. }
    + t; I/ @# `. b& g1 G) H4 n
  162. & h6 N0 Q5 p* f5 s

  163. & f: w, {% M) X& A# u' |" [
  164. # l7 ?% ^" S8 P" N0 j
  165. - `+ }. a$ o, t$ s: ]6 C( ~+ r
  166. 3 _3 p) [: ?* C4 z
  167. //超声波测距! f" a0 N7 s) l: ^* T
  168. 8 ^6 @5 `0 Y  c' Y. I  S& m  n
  169. void Ultrasonic_Ranging()
    0 b) ]" [2 r' D
  170. # K& N6 n# X: d  V0 `
  171. {' x5 f; N9 x/ _

  172. ' E# |1 ~. R' G1 l
  173.     INC = 1;               //关发射          8 _4 O1 g7 I6 b9 X( F: n
  174. 7 H1 ^6 ]# d- V8 q
  175.        delay_us(3);
    8 [! A6 p; B6 Z+ Q  O" q' O% ]

  176. 1 k. e" B! z8 D$ f$ x$ w
  177.     INC = 0;
    1 o$ X; E- ^2 a5 X* [5 E0 y, M* {
  178. ! s' S- a2 J  q4 T  e( B

  179. : ^: b) J. K/ `3 Y8 o) d7 y
  180. & W4 l2 t$ U2 {) p
  181.        TIM_Cmd(TIM3,ENABLE);
    * H' ^, G4 |5 A. w

  182. ! T: a/ g! s5 S; W- C$ ?1 u/ @
  183.        //EXTI_ClearITPendingBit(EXTI_Line4);
    0 ^2 ~, X; |. Y8 ]

  184. ! T% o5 @5 Z. n3 _
  185.        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);8 j4 P) M$ p8 @. ^
  186. : L2 l" U6 Z. ?3 {7 R. o+ D( i- m
  187.       ; J* g( c6 W# w9 ^& |
  188. ' e) m8 G! M$ H! _
  189.     Ultrasonic_Num  = 0;                // 定时器清零
    * z0 B) |3 p! g# w: j

  190. 7 o" Q( y5 V; H/ x6 e: ?

  191. - F/ S- _3 l3 h7 M/ N. `$ Z; }

  192. 3 Q# z" K3 L. I% D8 U3 o' j) f& R
  193.        delay_ms(30);               //等待一段时间,等待发送超声波控制信号
    , ~+ h5 o) `/ O
  194. 9 T& y* U6 Z# z- y
  195.        INC = 1;. Z; |( b% U6 \  i: g

  196. 1 |# k6 O7 U7 R# L3 c
  197.        delay_ms(5);' i% _1 J; Q; m' z: Z9 Y$ n

  198. ! \2 T3 ]9 g8 e0 Z! ~7 X
  199. }4 y( [  o7 ]) P4 J" X" ?

  200.   A" w3 Z! Y4 _( n

  201. & I! U2 V+ [* m3 {

  202. % h% r0 l# d7 Y
  203. //定时器3中断服务程序
      b9 m  y) F- o$ J+ ^
  204. 2 y3 i% e3 ]9 e( Z& y% s
  205. void TIM3_IRQHandler(void)   //TIM3中断( Q  u3 P9 R8 e/ d
  206. 7 ~' u) R+ t; |5 {: W$ x; @6 G6 d# p  B
  207. {+ V* K; o7 z5 e3 U9 l! Q1 G: ], B

  208. , C& Z5 ~9 {; l! o5 N  C1 `
  209.        if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)  //检查TIM3更新中断发生与否' W$ O' h7 w9 v, m, H  i& j. J$ |

  210. / X4 `& V3 t3 T  x
  211.        {
    4 n5 j! z/ O  b- p/ e+ T! F
  212. % ^% `. O. d' n! H& t
  213.               Ultrasonic_Num++;$ @  c6 F9 C7 k% G

  214. ( f6 t9 N( b1 W+ ^! P
  215.        }
    ( \6 s% n1 Y" U; v) e
  216. / T9 Z+ [8 p& g; z; ~) T
  217.        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  //清除TIMx更新中断标志6 g6 \6 j; ]* s  j

  218. 5 T) T  G- h, f  ?
  219. }
    ( a" Y$ g8 {& b- ]% p

  220. ) e1 E8 `6 z. o6 v/ M. E
  221. - L( W$ {+ n. U  M0 A
  222. 5 C! w4 d0 d8 V& I. Y5 T) c! Y
  223. //外部中断2服务程序
    ! R( p3 U6 s- J5 P4 d/ K
  224. / P4 R* Z% P5 L$ k, ]/ I2 \5 g
  225. void EXTI9_5_IRQHandler(void)
    * V! E% C6 X# ]2 V
  226. , S( M1 x5 d5 R0 \
  227. {0 X% _+ r1 Y. I7 M5 F8 X" E# f

  228. 7 Y* d: R2 o: g4 U# |) C
  229.        if(EXTI_GetITStatus(EXTI_Line8) == SET)
    , q! b# K4 z2 o/ ~

  230. 1 N6 A' f' z  ~1 l8 L# {4 q+ P
  231.        {1 S: m! q: v- p8 i* H( C
  232. ! F- a1 @6 }: z0 H6 v$ c
  233.               if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8) == RESET)9 `% |6 ]5 y) n+ ^
  234. 6 ]4 R# N5 R; H  e+ N4 V
  235.               {     & x$ D6 k( t1 ]  l! R
  236. 6 U- J# d7 x* n/ M' M" T
  237.                      TIM_Cmd(TIM3,DISABLE);
    / ?; ^" ~7 N4 G

  238. ) m7 l* N3 H+ Y8 g$ ^, o
  239.                      Ultrasonic_Value = Ultrasonic_Num;
    + G- {* u$ O3 [7 S/ t
  240. 4 [& ^9 M7 q" l4 i  ~9 z; A
  241.                      Ultrasonic_Value =(float)Ultrasonic_Value*1.73;       // 计算距离定时10us,S=Vt/2(减2是误差补尝)! {! T0 H( v* ^1 a+ c/ f3 Z/ a. y

  242. $ X. G; ]+ F9 q% s& m* ]5 J5 A
  243.                      dis = (uint16_t)Ultrasonic_Value;, I5 X# U  J. ~5 P9 s2 u+ b2 ?
  244. 6 {& i6 H, Y- U6 C' S7 W
  245.               }0 s+ a: V) R  Z* o$ x4 |2 p
  246. ) d' V# R9 h! ?# B
  247.               EXTI_ClearITPendingBit(EXTI_Line8);
    6 K( O6 i0 f7 R9 s2 q

  248. ) ^: X  @0 j# s4 _! u. `1 R1 B. n
  249.        }              5 j3 `( D0 l! B2 D1 K

  250. ; U6 ^& W1 Y, c' s2 M+ i
  251. }
复制代码

7 [! c7 D! b! C
4.png
实际测算还是会有点误差的。
+ Q. @- |3 v% U2 S! t. K( O
赞 收藏 评论0 发布时间:2021-6-10 22:29

举报

0个回答

所属标签

相似技术帖

官网相关资源

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