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

stm32驱动超声波模块源码

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
  下面是关于stm32驱动超声波模块的一段代码,有需要的朋友可以复制参考,希望对大家能够有所帮助和启发。- l8 ]5 A: P! ~
3 i5 ?9 }1 a3 o8 I$ g+ ?5 ~8 L

0 V3 D+ q5 G7 r- p7 Z
7 \/ T+ M# V/ U" ^' @9 J7 N. J$ S4 d
! S" v9 W" w$ e9 \% p# Q% X
  1.   #define HCSR04_PORT GPIOB: |) v; \+ [6 ^
  2. 2 \  s4 e6 q8 D2 B# g1 p& h
  3.   #define HCSR04_CLK RCC_APB2Periph_GPIOB' o( T0 ]5 R: K  ^

  4. ' t$ S+ F# b$ U0 ^# I5 ?
  5.   #define HCSR04_TRIG GPIO_Pin_81 i* x% Z" j5 S+ {6 C

  6. . M7 k+ |7 X0 z$ y
  7.   #define HCSR04_ECHO GPIO_Pin_95 }9 D. Q5 s- R* s( x+ M
  8. ' R0 B# i4 G, ?
  9.   #define TRIG_Send(n) do{
    1 e% x" P6 h9 l( P% l4 k% f

  10. 8 h4 a* x/ A9 s' q2 k- h, @
  11.   if(n == 0)8 Y/ ]2 r! {& A
  12. " S5 v8 L. |7 h) K
  13.   GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);; {1 i. ?' W! e' |% F) J* k
  14. ( V  h( H# R$ g8 O2 u; Z' C; q- c
  15.   else if(n == 1)
    " l( F; p9 U. O- d. b+ W9 Q2 H
  16. + z0 i3 t5 o5 D
  17.   GPIO_SetBits(HCSR04_PORT,HCSR04_TRIG);2 Z2 H- Z' U$ T0 o9 \8 W, H

  18. * S8 A) c0 o/ q! V5 R/ ^9 ]
  19.   }while(0)
    7 s# o* x9 |# q4 K$ ^

  20. : r3 `9 J$ \# J8 j0 @% d
  21.   #define ECHO_Reci GPIO_ReadInputDataBit(GPIOB,HCSR04_ECHO)
    8 }1 I) V1 Z* ~. W$ l  J# _

  22. - Y8 y* Y% D" V0 c  D5 y7 g" F' H  H
  23.   void UltrasonicInit(void)
    3 P# ^- m3 L4 P5 s# }& h* h
  24. ! }2 i0 L$ a' E8 B( a! V3 d
  25.   {! D* H1 R! ^0 }& k

  26. ! a1 h. _. b; F/ }; y! ]
  27.   GPIO_InitTypeDef GPIO_InitStructure;" O7 U# P# O6 [2 b$ I8 X

  28. 0 K  ]" x3 [. e
  29.   RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);
    6 I! i  E: R5 r! }1 S9 K. M
  30.   b/ y! @) c: V! W! l
  31.   //IO初始化( f! p7 c/ r5 Z1 g
  32. 7 L% X, f& B/ e" _, T: y: n
  33.   GPIO_InitStructure.GPIO_Pin = HCSR04_TRIG; //发送电平引脚6 Z# M2 z+ ~& Q; P

  34. 4 i6 u) i, [7 [! D
  35.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    7 Z- @4 ^) I# U% k5 b: E9 T4 N

  36. 2 U8 w  ?/ m" l* n
  37.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出" O4 Z! g+ f. Q8 y& e) f

  38. 4 Y/ d# E6 W1 P& i# P( [- w
  39.   GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
    . h% N/ }/ ?" M) W

  40. ' W, |) C7 k' J, a( |
  41.   GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);
    . q; R- O4 f) P& g! F
  42. $ N/ c9 u! p1 C; \3 h
  43.   GPIO_InitStructure.GPIO_Pin = HCSR04_ECHO; //返回电平引脚' y/ V" G' {8 f( T1 Q. u  W

  44. 7 {: D4 Z; G4 A6 `# f" p
  45.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    ; c; r' k8 B9 p" z, d

  46. : U0 G; Y3 L/ I( @
  47.   GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);5 U( W" ~& |$ {7 n7 q0 ]9 l/ A

  48. ( H# A4 q3 H. l5 `+ x# I1 [
  49.   GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);
      e1 p/ C  G: x2 p7 ~9 l2 O  d6 N
  50. . K' L/ {: j" q% X
  51.   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //生成用于定时器设置的结构体
    ' A7 q: t/ D& m$ Y/ G3 C$ f

  52. 6 t5 @! d! y# T4 W# |4 N
  53.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //使能对应RCC时钟
    1 I! V% q* {8 V  v. C& ~4 V( L

  54. 0 z7 ]- Q' Z6 I" p: J8 i
  55.   //配置定时器基础结构体
    8 Y% n% R9 U6 p

  56. - z) ~; W& y' [
  57.   TIM_DeInit(TIM6);* ~. j- [5 V8 a% u6 c- `

  58. . g" w" E% k7 {" Z/ T) S9 }9 M2 @
  59.   TIM_TimeBaseStructure.TIM_Period = (1000-1); //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到1000为1ms
    ; R2 f8 |* g, q" K  L0 a

  60. 0 V( Q% N. ~. c* R
  61.   TIM_TimeBaseStructure.TIM_Prescaler =(72-1); //设置用来作为TIMx时钟频率除数的预分频值 1M的计数频率 1US计数
    $ i1 V7 L  y" Q6 {7 l/ k9 L
  62.   ?' `! v+ q: ?$ ]
  63.   TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//不分频4 x# k: h" O: u, w3 C' l/ f

  64. ; a3 z! y: q- N
  65.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式8 q' z; o, ^9 k

  66. 1 D1 G0 ~. P# _. I. e( x: u+ ^
  67.   TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位) e. Z  B7 C4 l  S: S2 T/ |
  68. & b  }; _8 |+ N8 h. g' G
  69.   TIM_CleaRFlag(TIM6, TIM_FLAG_Update); //清除更新中断,免得一打开中断立即产生中断5 |% W* m) g/ X2 t' t; S
  70. & u+ M& g5 Y- I& q* s0 q  l  }/ P' Q
  71.   TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); //打开定时器更新中断
    . L% A5 A" Z# X

  72. 4 U, u7 Y) g  p( S! j; L# A
  73.   NVIC_InitTypeDef NVIC_InitStructure;- b3 ^' O% F8 M0 Y/ T5 I7 w/ _
  74. / f7 ]) t( q9 r, m. F, a# \
  75.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    ) k  I4 B) F8 u( R

  76. * O, n" a# N1 d& r0 V+ M* P
  77.   NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn; //选择串口1中断/ r/ \4 H* ?1 L' y3 K

  78. * V& D. i8 ^/ l/ ?+ K
  79.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占式中断优先级设置为1
    * k. @. j) ]9 I8 d2 E) ~; |% A
  80. + L* c1 v- W7 i! ]# V# a
  81.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应式中断优先级设置为1% ^* O( `/ ?1 n9 `+ y$ o9 }

  82. & `4 R2 x9 i) |) A% a$ o  E
  83.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断/ _# W/ s" E" R# z6 F
  84. 8 W, z4 |0 f( j' b6 _6 P; P: k
  85.   NVIC_Init(&NVIC_InitStructure);
    - [3 p, L9 k$ Z4 ^6 Q% E5 K9 b
  86. 1 B/ e% x+ R" j1 l% C" m
  87.   TIM_Cmd(TIM6,DISABLE);# P  x1 G- r' Y; j( ]: A

  88. 1 ]9 M1 i: ~* T2 Y- @
  89.   }
    & Y% v  A( j+ u6 ]( L

  90. 4 T9 U- q6 e+ k5 H( D+ M* u
  91.   //定时器6中断服务程序% y0 {; V- S9 ^2 {9 l- g' z* V

  92. . Q" A7 q4 M% ?2 Q. k, o
  93.   u32 msHcCount = 0;
    ) s! E! j7 n4 [- p* g
  94. 4 V& d8 e- J% Q. O
  95.   void TIM6_IRQHandler(void) //TIM6中断
      |8 g0 Q: g- F, c* N9 L& {* _

  96. 5 d+ Z) @! c- D
  97.   {- q+ R* I4 z3 d9 Z# g

  98. ' p& W" _! n+ b( f  A+ A4 U! r
  99.   if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
    # V, h" m5 T* G% _2 b

  100. 5 [$ g, S+ H! p2 m
  101.   {
    ( ?, n" v( _+ [# f" ^
  102. 4 r- c: `7 G6 o8 q9 }4 z
  103.   TIM_ClearITPendingBit(TIM6, TIM_IT_Update); //清除TIMx更新中断标志9 t# j. N6 u( Q

  104. ; Z  m; c" k( @. {4 A
  105.   msHcCount++;' c  y# u3 h1 b7 j% j( l

  106. 8 h: s4 C/ D  Y; \# s
  107.   }! W* P( L8 s; W$ X. x

  108. , J9 B0 O  z) m7 I% _& X" h; p
  109.   }
    - t* m5 g4 M& F) M) g# ]
  110. " A# j: [" d$ t8 o7 o
  111.   static void OpenTimerForHc() //打开定时器
    5 p3 E% c7 \0 q

  112. 9 P1 U0 D/ }% m4 c4 F% n( _
  113.   {
    * b4 B& i: E5 }  r

  114.   B) n6 ^: c( h. F
  115.   TIM_SetCounter(TIM6,0); //清除计数
    / M* A2 u9 k$ I0 L% E
  116. " h& p) `3 p& N0 C7 |
  117.   msHcCount = 0;6 }* A( h8 @6 x+ ~6 U

  118.   \2 U# C1 f$ o/ @: a4 X
  119.   TIM_Cmd(TIM6, ENABLE); //使能TIMx外设+ i* r  v% y1 n( O& d0 r" x
  120. & O7 R$ h" ?; O
  121.   }0 m9 G$ s3 p' ?: X" G8 b& K6 C1 V( q; b
  122. & {) W# S. h! D
  123.   static void CloseTimerForHc() //关闭定时器
    0 o8 D0 O1 N  ~$ t" Z+ @7 i
  124. ! `- }! {  ]9 v5 a8 D9 q
  125.   {
    % m7 T, z8 a. O7 m( F: Z

  126. 6 n+ H) }3 S8 B  H& v/ A# d5 n
  127.   TIM_Cmd(TIM6, DISABLE); //使能TIMx外设
    , [2 z, R0 m7 Q# {

  128. 6 K$ X, }' o  s) z
  129.   }
    $ E% [" z) ^, a/ U$ D% ~
  130. 1 }3 A' l0 H1 E8 {) h4 t& A% h( E
  131.   //获取定时器时间
    5 i! ?1 I7 \6 }& ~7 t( L

  132. : r0 c- @9 Y3 x7 E& N; E  }
  133.   u32 GetEchoTimer(void)4 m; J) n6 l# v" [

  134. ) E3 ]) D! W9 K- W, V
  135.   {
    ( d1 m, K* s$ {0 f

  136. 7 y; s2 k7 X# g% y( K- b/ K) {" R
  137.   u32 t = 0;
    1 O: p) M! ?2 _8 Y- U5 g
  138. - z- v6 a( Q4 w9 y
  139.   t = msHcCount*1000; //将MS转换成US& T6 w. ~- e& S6 r) W% S+ K

  140. ( D8 }. C) ^3 E9 W# H
  141.   t += TIM_GetCounter(TIM6); //得到总的US
    & U. p7 I( d' o5 J6 U1 N1 v8 c
  142. ! ?. D+ P: n. f5 G0 n5 B) x2 H( i" N
  143.   TIM6->CNT = 0; //将TIM6计数寄存器的计数值清零* G# P# S  R: M4 ]: ^

  144. " y1 b7 B9 z! K2 {( C3 M
  145.   return t;
    $ {: }! l6 K) b5 c" b+ o
  146. & B: c7 z/ L' p& Q0 y3 l: R
  147.   }
    , L8 G4 Z: {1 ?" J7 c, c

  148. . l! N2 b7 V, f' R, w
  149.   //一次获取超声波测距数据 两次测距之间需要相隔一段时间,隔断回响信号
    , S* S) D3 b+ E9 \6 g4 j% I  ]7 Z

  150. + O$ }, B0 W- K8 x- s3 f
  151.   //为了消除余震的影响,取五次数据的平均值进行加权滤波。& N: e, ~! w1 R
  152. # Q' [; E0 W9 }  O$ Q" _$ P7 q7 X
  153.   float Hcsr04GetLength(void )
    ' k8 T' ?* S8 n2 J: X

  154. , V8 I. R  Y6 }6 ]% H- O
  155.   {$ j+ H+ M! {/ h+ @& J8 [; e
  156. 8 z/ U) B4 O& Z( |# X
  157.   u32 t = 0;! @" c5 U; m) c' U) E. K& z* C1 \6 Z
  158. ) ~, M! d3 D6 s( L+ c
  159.   int i = 0;
    / u4 Q+ J4 p+ Z1 T; H

  160. ; I9 `. Y# j/ m* q8 W
  161.   float lengthTemp = 0;, \  h% v* a" P5 r

  162. - g9 m& ^% `6 m! }1 J1 A. v6 V
  163.   float sum = 0;% q) p$ `0 `7 r3 H% ~4 h
  164. : K, j& g  ~* G$ ?
  165.   while(i!=5)" G3 `) i( f" Q
  166. . b8 f/ ^* e: f
  167.   {
    % P$ F. _7 ~/ {  m

  168. * n; G+ U% G0 x
  169.   /*发送一个20ms的脉冲*/
    6 u, c+ u$ c) q* B

  170. / h- W  l3 b: T2 w/ r0 V7 U
  171.   TRIG_Send(1);
    2 @: b3 Z! N$ Y; R$ f" I0 r( V& k

  172. 6 t; d4 V  H" ~5 J/ d& P" Z3 c# y
  173.   osDelay(20);" N1 b# j! A* [% l4 l( Q6 c' w  c
  174. 7 r: l6 E$ [1 E" d0 q1 u
  175.   TRIG_Send(0);% E1 W  z: u6 B' M7 v# }. k- z

  176. ! |% v' {. h5 u, M
  177.   while(ECHO_Reci == 0); //等待接收口高电平输出(超声波发出)
      v9 W7 G5 d$ f' \" r3 j

  178. & q9 ^0 |" F& I
  179.   OpenTimerForHc(); //打开定时器, Q' [" z8 I& `7 O

  180. % h8 |9 w/ P; u  ^5 V  i
  181.   while(ECHO_Reci == 1); //等待超声波返回+ x7 G; s# P% e- |# |; y$ }( Z
  182. 1 b: ~0 B* p' F2 f1 k/ y
  183.   CloseTimerForHc(); //关闭定时器- H3 I, z* e& M) y# k( a% H
  184. 7 R5 j4 J7 s3 ^4 f
  185.   t = GetEchoTimer(); //获取时间,分辨率为1US
    : j1 |% @- \" h8 W* C# z. G$ O

  186. 1 D, n  Z& ^6 s) Y
  187.   lengthTemp = ((float)t*17/1000.0);//cm" `, \; m) z; N  b) t5 M0 G( U

  188. : t- ~- M( w: [
  189.   sum = lengthTemp + sum ;$ v- ?; i/ G; V
  190. - N' V! U4 g6 m1 E7 Q8 v
  191.   i = i + 1;
    & [5 G0 M/ l! U8 P- ~
  192. ) F$ N# _+ l3 V9 D
  193.   }
    # h# h9 j8 _6 X* \+ H+ P4 O( Y
  194. 6 b  {  ~. t5 ~! A
  195.   lengthTemp = sum/5.0;
    . m* v5 G/ y9 ^$ s+ F
  196.   I9 u6 O1 u, N/ t
  197.   return lengthTemp;
    7 ~* v! {5 h% }" _* @

  198. 2 S  W; ~$ ?/ Z* u: X% X2 ?+ J
  199.   }
复制代码

- w9 D1 `2 r* V$ ~5 r3 }& `  y" C. T7 u) o3 W6 g
  • TA的每日心情
    开心
    2023-5-15 15:25
  • 签到天数: 1 天

    [LV.1]初来乍到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-10-6 21:06 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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