找回密码
 注册
关于网站域名变更的通知
查看: 481|回复: 1
打印 上一主题 下一主题

stm32驱动超声波模块源码

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-9-12 16:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
  下面是关于stm32驱动超声波模块的一段代码,有需要的朋友可以复制参考,希望对大家能够有所帮助和启发。
! w( C' o1 x7 K5 t$ [! O" h4 u, m/ G: R& K  g5 A
% ~4 @0 u7 U+ c: f4 g& h
+ @& U6 j- `9 `. v
6 c5 F( M$ u4 j! @* ^1 Z; F$ |* l
  1.   #define HCSR04_PORT GPIOB2 Z3 Z* z8 K5 p4 G% g

  2. , E% f7 \$ |% j2 O2 p
  3.   #define HCSR04_CLK RCC_APB2Periph_GPIOB8 y; y5 ?7 q  {. w

  4. 4 \) O/ y* ^/ ^) @" Y
  5.   #define HCSR04_TRIG GPIO_Pin_8$ l2 c& h% }8 K8 }( O

  6. 6 [6 T; |5 k6 m& W" W
  7.   #define HCSR04_ECHO GPIO_Pin_9
    " i! ~6 H$ q* {; e* r
  8. , l) q' u) f  E- @! Q
  9.   #define TRIG_Send(n) do{
    0 j6 M, O/ a: u8 a6 g, U

  10. * N  I* u1 A5 b
  11.   if(n == 0)
    9 Q$ ]5 T( [1 C) W! D

  12. / y5 n/ x9 V) P, l3 J/ A* D# M. G* H
  13.   GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);
    8 p$ p$ }) a- {0 F7 F3 M

  14. # f0 K  V/ |+ i8 y
  15.   else if(n == 1)
    " {% f: w! Q' e, A- o' K
  16. 3 E* \/ \, T) U4 A% n
  17.   GPIO_SetBits(HCSR04_PORT,HCSR04_TRIG);0 c- M/ u8 k  k3 v9 Y
  18. 8 A' K* S, D  f; C: D4 p- E9 L/ `8 Y" ~
  19.   }while(0)0 @! B0 [. z& `4 C- o

  20. 2 b$ p  a% }7 b/ ?
  21.   #define ECHO_Reci GPIO_ReadInputDataBit(GPIOB,HCSR04_ECHO)8 L( w/ W1 E$ Z2 D1 L7 y+ r5 ]
  22. 4 X5 T1 x. K* V* h+ L( l& F, `
  23.   void UltrasonicInit(void)
    ' @, h+ ?( k8 U$ D$ T& y
  24. 1 C. L. I- w# y  S
  25.   {
    5 X. \  \; K1 b
  26. - F! z+ W" a; s$ O8 z
  27.   GPIO_InitTypeDef GPIO_InitStructure;. Q+ o( F' W4 X6 E% ?$ D" k

  28.   F. |- V# o! c  v
  29.   RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);
    1 }1 V6 T' b) i# N3 Q

  30. - h2 \/ E6 D  u' V2 o6 L& U
  31.   //IO初始化4 Y: o- D0 t$ b8 E# Q* U# x3 p2 E

  32. % m+ C& i/ q9 x7 j3 z, |6 q% a# N
  33.   GPIO_InitStructure.GPIO_Pin = HCSR04_TRIG; //发送电平引脚
    9 ?" ]* Y' }$ S+ u8 i

  34. $ _+ H6 r% I, f8 k
  35.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;/ K  ?6 D" L  H% F0 W

  36. ' Y2 @/ h# ?3 d" x) w4 E6 O0 d- f
  37.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出1 A6 K5 y1 n( o7 P5 u$ h8 [9 a9 O

  38. ) P/ u4 q9 N% {2 e4 V+ V
  39.   GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
    : ?2 @/ ]+ s8 L
  40. # J* V. s2 _# u0 E* I$ G, u/ k
  41.   GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);
    ( X8 A+ A# `) y$ o/ [5 d

  42. $ A$ T1 e" t+ h
  43.   GPIO_InitStructure.GPIO_Pin = HCSR04_ECHO; //返回电平引脚
    , n( l: O$ Y  ?
  44. 2 x6 K' t* ?8 [7 d  l  @  d3 u
  45.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
      C; I+ r0 |: r6 i7 v- k' b9 S
  46. & _# Q& _/ E& l# X
  47.   GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
    8 _0 j6 i0 F. m) n$ V- R9 B

  48. $ n4 ~' T% x/ c% `, _9 ?
  49.   GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);
    : T( p: ^' M- i9 ]2 t

  50. / j6 p9 c4 M& f7 N1 d! h) u4 I
  51.   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //生成用于定时器设置的结构体
    3 J8 r( A, r6 o/ N4 ^+ g& U- V- ~

  52.   Y5 ?" E$ V( C# d. _
  53.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //使能对应RCC时钟( ~: N9 |1 u# X9 G2 D4 {
  54. . m% _/ i4 a* P2 y6 j- _
  55.   //配置定时器基础结构体2 g4 S  n2 a1 u* n& o3 ?

  56. 8 B4 q( B& ]' Q; m# ?0 X
  57.   TIM_DeInit(TIM6);% m7 F9 K! [' l6 p
  58. 6 f; a0 {2 \% r& I
  59.   TIM_TimeBaseStructure.TIM_Period = (1000-1); //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到1000为1ms# a4 J# z9 F' N& D' G

  60. + v+ |# m8 N( T. F+ u( ^8 ~
  61.   TIM_TimeBaseStructure.TIM_Prescaler =(72-1); //设置用来作为TIMx时钟频率除数的预分频值 1M的计数频率 1US计数* m" w: ]* |! c5 o
  62. 6 d% L9 d. H6 t. s: B0 c
  63.   TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//不分频
    8 E/ T+ L- \( ?8 d6 F

  64. 2 x. z" y9 }1 V. p5 p5 N& n8 _
  65.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
    + P% ?+ F3 r0 v9 e. E6 Y/ a; V

  66. ; A, U; `, a) X# o# {  F
  67.   TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
    1 A9 h% r( }' a2 Y' S& i6 N7 j
  68. ; T. J- m0 b% u" J) ~
  69.   TIM_CleaRFlag(TIM6, TIM_FLAG_Update); //清除更新中断,免得一打开中断立即产生中断/ V) b/ P% i* w0 ?( \0 M) E% \1 H
  70. * R0 J: [) v: w+ k" w8 F+ h& u; E
  71.   TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); //打开定时器更新中断; p. b. Q0 W9 B# T& Q6 @
  72. $ \/ f" @2 L& Y4 S* k
  73.   NVIC_InitTypeDef NVIC_InitStructure;+ V1 n/ l: S- R. q. a; _

  74. 3 D" g" `" C  q8 Q/ @" L
  75.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    2 S- \$ W% j: J

  76. 9 v0 L! |8 s: a
  77.   NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn; //选择串口1中断
    9 d- R8 P4 E2 D' u/ K8 \

  78. 4 a3 b2 |* l, Z9 T6 L4 ^9 d
  79.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占式中断优先级设置为1
    8 s  N# L* e& l

  80. ; N- k  E0 k$ [" [% ?
  81.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应式中断优先级设置为1
    5 y; Y% C$ |& I* Z$ Y

  82. ! w/ G- Y- f+ E4 u% L
  83.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断
    " k  D/ d' ~7 M/ I7 m& b6 ^/ o

  84. 3 \" @& M0 r, J! N
  85.   NVIC_Init(&NVIC_InitStructure);, d2 G2 R1 e0 m2 x9 [6 F

  86. % f! U6 X* R1 o; P2 G
  87.   TIM_Cmd(TIM6,DISABLE);+ W+ _: U' N- b" T1 Z

  88. 1 j' [  V2 Y# N2 C5 N
  89.   }2 ^; {% R) K. G5 s/ \
  90. ) s! B: c$ Y& y/ E
  91.   //定时器6中断服务程序
    6 o) A: m; h2 ~/ F4 }
  92. 9 T0 J$ h; l, a2 r' R( ]
  93.   u32 msHcCount = 0;
    + g2 n( @$ E3 G: k
  94. ( g( J) L- m; v, R
  95.   void TIM6_IRQHandler(void) //TIM6中断1 S* ~! c# X6 L6 u( {4 L
  96. # D/ m( K& s5 N. {( \
  97.   {" n+ m" W0 y# ?4 ~$ o. k' O

  98. & W& C; ?& E' L3 f* A. _0 \
  99.   if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否! `" [+ h. m' g4 }) m

  100. ; p" j3 w) c: \) b2 _
  101.   {2 [+ m# J4 G3 q2 M: |* y9 O5 q* n8 x' [

  102. 8 a/ \; E. J2 }! N
  103.   TIM_ClearITPendingBit(TIM6, TIM_IT_Update); //清除TIMx更新中断标志
    6 j: s7 A3 M( a7 y2 ]( n% }( v
  104. + o5 {' k9 Q, @
  105.   msHcCount++;" R+ Y( v" D1 ]( q3 X+ J
  106. 5 h5 R5 W4 T  h' e9 q6 O
  107.   }
    " l' ?% y7 o) `& v: I) p1 n

  108. . I6 r/ N' N( o1 w
  109.   }4 u: |6 d$ y( s+ W2 c

  110. + y. Q% i: X* N5 {$ M8 a
  111.   static void OpenTimerForHc() //打开定时器$ m* y  }0 @! {# Z
  112. - h5 W3 s+ m" l0 y
  113.   {
    3 \5 g' o' r) U* d. j
  114. 0 A- D. b3 f9 T9 @" P+ u5 X
  115.   TIM_SetCounter(TIM6,0); //清除计数8 j7 ^" w  Z6 ~

  116. & N2 |1 w7 ]% a/ C2 H- x( j/ I! E
  117.   msHcCount = 0;* b4 j8 b0 ]4 p$ i9 t
  118. & G* j  j$ C/ B2 O. {
  119.   TIM_Cmd(TIM6, ENABLE); //使能TIMx外设
    ( {7 z: k4 `! {0 M6 r1 t
  120. , t' ?) V* E+ A2 N
  121.   }( J& @, H/ z# r9 |  @( h: s

  122. 3 N# V. e2 z* R3 E" E4 A! A' v# T5 f
  123.   static void CloseTimerForHc() //关闭定时器; Y) O/ I+ q$ z7 g5 n

  124. 2 j0 p+ u: a, Y0 t" ]% P5 {5 x5 \
  125.   {
    $ d, ~) u' q# n4 D8 w& m$ ?

  126. - l4 p$ a& U2 ?8 r
  127.   TIM_Cmd(TIM6, DISABLE); //使能TIMx外设
    + e% m: C/ i9 X/ P" q
  128. / ^5 l* C- p7 P/ Y5 H9 Q% |
  129.   }
    6 L. T9 G1 t# e6 X# r
  130. . v+ q1 ~, ?/ V+ t  O4 l. D
  131.   //获取定时器时间7 c! h( a, L( U3 o
  132. 0 X8 N( Z1 ~3 k
  133.   u32 GetEchoTimer(void)6 P" v/ t* m" E: f, I- F
  134. % M( Y2 n( @2 H6 W$ K# j. b
  135.   {! _/ v6 a+ U2 {! f

  136. - D& S& z( u% K- h4 N
  137.   u32 t = 0;9 Y7 l; X# l. h' n) p/ g7 C
  138. - D% q, ~# L9 ]4 J
  139.   t = msHcCount*1000; //将MS转换成US
    6 d% ?6 {) X- M- E

  140. 3 D" K7 o/ B+ l( Y& @4 o
  141.   t += TIM_GetCounter(TIM6); //得到总的US" P2 V2 E7 S, Q" U9 {' `; d
  142. , S1 H' p, g( v) S& V4 o* O
  143.   TIM6->CNT = 0; //将TIM6计数寄存器的计数值清零
    2 o" Z# x4 O/ d

  144. # q. K2 b- B4 y% L
  145.   return t;5 l. o) a- q8 L- g
  146. 3 o% `( T6 S) P+ Q) v% m9 V( V1 H
  147.   }
    $ G2 `# J% S- u9 M( _5 q4 C

  148. ! }8 f7 o( ^1 ~' R
  149.   //一次获取超声波测距数据 两次测距之间需要相隔一段时间,隔断回响信号
    & O& \, a1 a3 K4 I' Y3 ^

  150. % i: A% b8 M7 o! k2 `8 c
  151.   //为了消除余震的影响,取五次数据的平均值进行加权滤波。
    / G# n* A+ r- L' J6 T

  152. 6 V: [$ B4 M0 n! @1 Q
  153.   float Hcsr04GetLength(void )0 B& ~( q! _3 T, q" P
  154. & L; Z% B$ F( M4 @. t/ o! w
  155.   {' U& \$ r' d/ Z% c; o* L

  156. 7 B) c/ M% O7 f$ G8 O
  157.   u32 t = 0;
    : q8 U. _: t' ?! o" H+ u" Z- e; W; `
  158. , d0 Q. _2 R5 L' u+ z
  159.   int i = 0;
    ; E) H% f5 H0 g' J, @/ n

  160. $ ]5 D( W# l8 V3 o( |- o: M
  161.   float lengthTemp = 0;
    4 T1 m8 D( @& _2 |% a8 U3 x

  162. : [! C; U: h. V  D/ y
  163.   float sum = 0;
      n2 [: q# O* \& u. d. F7 `# z! m
  164. ( {  F4 ]! u9 r* n  }) m/ h# J) F! H
  165.   while(i!=5)
    ; Y; ]: l& R' \1 p7 ?
  166. ; K; l3 U# f2 V. I# u6 R
  167.   {
    ) `* M, p3 P- h% D$ _

  168. 8 `0 c7 I7 e0 y$ v! n- O, ^
  169.   /*发送一个20ms的脉冲*/
    ; u/ `# ^4 o$ w- P
  170. * m4 Y6 h9 ?! b# o
  171.   TRIG_Send(1);
    - F, M$ x" b# J) N* _; a

  172. 6 n: f: V: `3 H
  173.   osDelay(20);
    3 [: e" J2 j# w- {2 ?' ]. M
  174. " {6 }! V6 a' V$ H
  175.   TRIG_Send(0);- ^0 D" L( ]6 h

  176. 4 l% D- b1 u% f1 D( a& z( [  L
  177.   while(ECHO_Reci == 0); //等待接收口高电平输出(超声波发出)' D; T4 c, A; j* r
  178. " ]0 L) N/ ]  H' A, e! c
  179.   OpenTimerForHc(); //打开定时器6 G) s% B' j, r- d' h* H

  180. & H# e: f5 I0 M3 z: c
  181.   while(ECHO_Reci == 1); //等待超声波返回* m. F- J. t5 L

  182. 5 A( q* B& d4 p, ^$ _7 a
  183.   CloseTimerForHc(); //关闭定时器4 e/ ~0 n2 v+ n9 N3 U

  184. 8 z, h/ B, N( x
  185.   t = GetEchoTimer(); //获取时间,分辨率为1US
    & X3 t2 b# m3 P( E* Y3 }
  186. ' @/ f  h" z" I" V/ w
  187.   lengthTemp = ((float)t*17/1000.0);//cm4 p& g4 X+ w& H. B1 o/ K# O3 `

  188. : t4 h$ w9 ^9 b& s
  189.   sum = lengthTemp + sum ;% @. ~9 J$ g/ ?# H
  190. / L. e7 h# f' z# L5 Q
  191.   i = i + 1;
    0 n4 ]5 O' [! c# G7 y

  192. ' u3 a7 g& }( d$ z( c6 V' R
  193.   }
    # Y+ i3 h; c! p
  194. ! i) M- @* o  x3 q! I
  195.   lengthTemp = sum/5.0;
    ; z. D: |* b! E. L  `7 f

  196. ! D( d( @) u% A
  197.   return lengthTemp;
    1 n- A+ H. e( r0 Q+ I% H/ J

  198.   P0 k/ i- N. a% X7 r- J3 X
  199.   }
复制代码
4 ?3 W( |! [9 ]: U; D% x- V
  C0 c6 o" I$ n5 G" S
  • TA的每日心情
    开心
    2023-5-15 15:25
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2020-4-20 10:27 | 只看该作者
    这模块很好用,指标很高
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-5 22:59 , Processed in 0.156250 second(s), 24 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表