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

stm32驱动超声波模块源码

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
  下面是关于stm32驱动超声波模块的一段代码,有需要的朋友可以复制参考,希望对大家能够有所帮助和启发。
& _/ |5 ~% P# ]% s: A  E
4 F- U6 }: b- i; K+ G% R
8 s4 \! ~7 O4 X$ N1 S) K& G
% E( Z# {6 t7 P6 q0 c! J
0 V1 _0 V: o; f" c# D) x8 a. c
  1.   #define HCSR04_PORT GPIOB
    : u7 M0 X/ d& t# A  T0 @
  2. * w2 Q. i$ Q/ |
  3.   #define HCSR04_CLK RCC_APB2Periph_GPIOB
    $ i% z2 ?# W3 q

  4. 7 v$ ~6 s6 V3 E: g" ~; y
  5.   #define HCSR04_TRIG GPIO_Pin_8. o1 k8 g, x4 O, X

  6. ! X; J  d7 @# A9 m" L2 U
  7.   #define HCSR04_ECHO GPIO_Pin_9$ ?  D1 i: G+ @: u5 }! c1 d& E( V
  8. / h) ~; H8 D3 V( O  ^
  9.   #define TRIG_Send(n) do{
    " @, f8 l9 V7 P7 G0 ?5 l  w3 z

  10. 4 Z6 ?/ g3 q. r( H: V
  11.   if(n == 0): T  ]( f3 w7 m* a$ @
  12. ! n8 d& o9 k/ t
  13.   GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);
    % w" e) I& q% }9 A+ h
  14. - \7 S. J9 L7 L( f1 p  v- ?3 J
  15.   else if(n == 1)
    ( G+ B# L2 f! _; P& c- s

  16. 7 r5 b& X7 j4 k6 f! z* n
  17.   GPIO_SetBits(HCSR04_PORT,HCSR04_TRIG);
    7 @- w5 v+ N- ]: j1 _4 N) {4 q

  18.   C9 V; h) f5 E! f
  19.   }while(0)
    5 s% `* v' w9 z

  20. " c; e) w! x2 e! Q1 c7 q; u' I4 P
  21.   #define ECHO_Reci GPIO_ReadInputDataBit(GPIOB,HCSR04_ECHO)
    5 T" z+ i2 n* d6 y

  22. ' x! u& `& L7 i/ e8 i. I/ W9 [. G
  23.   void UltrasonicInit(void)" s0 n: T% d! |& w- Q( a
  24. 2 b' m. D$ D5 C  w- t0 c- h# y
  25.   {* m7 Z9 [* K( o% v$ S
  26. % C( k4 a& F5 e4 `- W/ X% }5 q& C9 S
  27.   GPIO_InitTypeDef GPIO_InitStructure;
    * e4 g9 Y& Z/ S# R' }

  28. , J/ l. }$ ~3 e1 p
  29.   RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);. z; n% d$ K+ c6 [

  30. % J9 Z3 j8 p3 C
  31.   //IO初始化% w+ A( Z' S1 e; z8 Z

  32. & l" D8 p' e2 w7 \5 d
  33.   GPIO_InitStructure.GPIO_Pin = HCSR04_TRIG; //发送电平引脚
    3 Q& `9 x6 Y/ F& Y6 X& }( o- U
  34. 3 t, G$ @  M' X4 Y1 A  ?
  35.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;6 d  h! ?% d) g' \5 A- E, ~5 U

  36. 3 l+ F, d/ f5 l' U) s
  37.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出& ?( z( F, }0 k) K4 c1 t

  38. * G2 _3 [. c( }& u2 @' a
  39.   GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
    * s0 J- r. I* U; n0 e
  40. 6 R; E! [) B0 V
  41.   GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);4 ^( C. d, o0 M! S: f* a
  42. / E+ i9 p5 M: t. Y) E
  43.   GPIO_InitStructure.GPIO_Pin = HCSR04_ECHO; //返回电平引脚& Z$ J. `& b) `- i
  44. 9 N+ j$ y- G( ~
  45.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入8 R# i- z; U) ?/ V6 n8 b: J

  46. 4 U7 g- {6 K6 w; W4 N2 X
  47.   GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
    : {( Q& C2 @& M2 r: s/ h- z9 o

  48. 0 f7 t/ F$ @8 |6 |: {
  49.   GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);
    % A' I" M: ]3 \. }

  50. + ?' F5 g) \2 g% P8 V2 O5 L
  51.   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //生成用于定时器设置的结构体6 x. C5 |! v/ W/ L+ X1 n. K

  52. + k! q$ b+ g8 P7 T' b+ G; s* n
  53.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //使能对应RCC时钟3 T6 J; z' _6 U+ j0 d" M. ~

  54. + `$ }2 I5 A6 B' X/ F- i
  55.   //配置定时器基础结构体
    ' `; q2 S1 M6 h5 q/ K1 z) X
  56. 8 D" f8 I$ j5 k& a3 B% O
  57.   TIM_DeInit(TIM6);( @7 O6 l0 R5 g5 l2 J, o5 q

  58. " x, E+ ^) y7 }1 S" M; w
  59.   TIM_TimeBaseStructure.TIM_Period = (1000-1); //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到1000为1ms
    % |0 l+ J2 q+ @. N) |: Y
  60. ; [  F6 V- Z4 J
  61.   TIM_TimeBaseStructure.TIM_Prescaler =(72-1); //设置用来作为TIMx时钟频率除数的预分频值 1M的计数频率 1US计数& A3 u: l5 [8 P/ B9 A3 J: F$ W

  62. 9 ^" Y8 M/ ?- l; x0 u4 q5 ^4 f
  63.   TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//不分频+ i& H  H+ r, c- g: o1 K) X. I

  64. 5 k; l: a8 @8 I1 b! l/ f
  65.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
    1 C; F# A3 f3 L  R" y
  66. 0 X5 ^* T' V8 _* _: |, T! g
  67.   TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位8 |3 Q0 k) \+ k# q/ ^
  68. 5 a: c' o: s7 q: X  D7 D; b; F
  69.   TIM_CleaRFlag(TIM6, TIM_FLAG_Update); //清除更新中断,免得一打开中断立即产生中断+ g, j, H: p1 c; Q. t& J
  70. + [( d' {( A0 e4 {& h' N0 B
  71.   TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); //打开定时器更新中断
    ( V; `* v- N9 J1 c$ u
  72. ; v1 f0 r6 G5 M: o# m
  73.   NVIC_InitTypeDef NVIC_InitStructure;4 D0 D3 `4 T* ~7 x$ E' |0 K
  74. " c; f: l6 y' P, I, m& D
  75.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    5 w5 k, l! m1 C% B

  76. 7 q% W1 o% j6 z
  77.   NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn; //选择串口1中断
    ( A! t3 e7 h2 A/ L; [  p4 J3 s: S
  78. 8 W  A8 U& f7 H- t, t  Q- X
  79.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占式中断优先级设置为1
    $ N8 C- l' r2 H% S
  80. ( E# y8 c- P- O) [
  81.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应式中断优先级设置为1, P: E& G5 R) r
  82. & W+ G$ _8 X8 v* _
  83.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断/ |7 ?1 Y$ t8 K- w  h
  84. $ A/ k0 m6 L* j; k
  85.   NVIC_Init(&NVIC_InitStructure);+ B6 F; M; ], H- K
  86. 1 s/ `' m" H# y- M& C. s; X
  87.   TIM_Cmd(TIM6,DISABLE);
    9 `3 a! ]* E& Y9 O( X
  88. 1 D- ]1 c  c0 ~1 Q; h" m) D
  89.   }
    & b* s2 @( ^9 \

  90. / @: `" H0 x) c! _8 S* Y
  91.   //定时器6中断服务程序
    + |* ]9 n' D% @1 Z3 |

  92. 1 j  S) O7 K* u0 j7 n* Z1 m
  93.   u32 msHcCount = 0;1 F) y7 @" `: H; P* n1 {! Q

  94. 6 G8 R4 J1 ^! Q2 y
  95.   void TIM6_IRQHandler(void) //TIM6中断
    3 q" ^) }' ~" Y

  96. . s/ T  ^# q7 z' p
  97.   {9 r1 T, ]4 T' [% {
  98. ! A; B& Z( @  }8 ~  H8 }# D: o4 n
  99.   if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
    : x3 A3 e6 [" {6 G7 A3 l

  100. + J" t/ c; w3 \7 c! |) g8 \
  101.   {
    3 X' b  {7 b( M% N# S

  102. ; x$ X2 [$ c; `: z) B1 w
  103.   TIM_ClearITPendingBit(TIM6, TIM_IT_Update); //清除TIMx更新中断标志
    ( g8 ~! r$ b: v% u/ m! e
  104. 6 ~9 W1 i' K3 M- T8 b* k
  105.   msHcCount++;5 f3 [0 |: ?/ l/ j* t" l( n4 h. l6 U
  106. * {4 K  {9 b  [' m
  107.   }$ d5 X1 P2 z! b( W& I9 i

  108. 5 e/ P9 I7 U5 }# @+ f7 }6 M6 y
  109.   }
    5 Q6 p- i; T- J/ j3 b

  110. 9 J) r' _0 E  f2 E2 ~3 j0 L
  111.   static void OpenTimerForHc() //打开定时器3 I' m0 `0 P5 g' B. K
  112. 3 M8 [: @, i2 m4 D( I0 [  Z% `. F/ ~
  113.   {) }# X/ V7 t9 {: M0 h0 x
  114. 2 ]$ i* i6 m( P' U: I
  115.   TIM_SetCounter(TIM6,0); //清除计数) V8 @4 l- ~1 W, _$ j3 N

  116. 6 |6 i- u5 n6 N+ K) j, S* I
  117.   msHcCount = 0;
    7 w# C0 r3 c1 J

  118. 3 z) d9 `: F4 ?* s& C" n* `9 i
  119.   TIM_Cmd(TIM6, ENABLE); //使能TIMx外设
    2 N- p2 y% s+ Y% ~1 F0 [+ \% I
  120. # ?# x& q+ _4 n, ?* T' {. t
  121.   }# [8 h- ]" Y: G3 Z# r. ^) Q, l

  122. % G( B, q# J' [# n
  123.   static void CloseTimerForHc() //关闭定时器
    + I( R6 u) c6 L  x1 w3 C& w
  124. 6 r6 x  ?# Q( m" U# H
  125.   {
    3 O5 r" ~$ B7 k1 O4 b
  126.   I3 C5 p! C! Y+ T/ y9 M; E
  127.   TIM_Cmd(TIM6, DISABLE); //使能TIMx外设
    : \( \! j1 e% }8 }1 |( r7 L

  128. 5 Y. N: V/ W4 O: U
  129.   }, W6 z$ t: L! S% R

  130. . l6 j  r3 u% D2 l' M9 f
  131.   //获取定时器时间
    ) d4 i7 x! \5 v. G5 B& ]

  132. ( \7 t4 j; s. r( y0 D9 O- ^
  133.   u32 GetEchoTimer(void)4 l1 B! j3 ~0 Z

  134. " k+ c- H% q3 @. z. L" ~; G% Y
  135.   {. _/ [9 [: b0 M( }1 r
  136.   ?( P$ ~# _# ?) x
  137.   u32 t = 0;
    9 h9 g* a' n8 G: J7 `$ T! q

  138. % c6 d4 F/ R; E5 A, G, i8 O
  139.   t = msHcCount*1000; //将MS转换成US4 v6 k' Q% {, _. B6 J: z

  140. + k/ G$ j1 M0 I' \" C  Z: q% D
  141.   t += TIM_GetCounter(TIM6); //得到总的US: W+ u+ B# ~$ ?2 j
  142. - z1 c- ]( G* _3 @! v8 L
  143.   TIM6->CNT = 0; //将TIM6计数寄存器的计数值清零
    8 O7 q( q3 c/ t/ U1 X  j3 e

  144. 6 @7 k* _# k0 U) n7 E, t
  145.   return t;
    5 t& k0 Q* v; D( E  f
  146.   l6 _3 y; ^1 n4 h' y# I0 Z
  147.   }
    1 H1 x! `7 L$ f/ S
  148. ! n' P+ m$ D. D) n& w
  149.   //一次获取超声波测距数据 两次测距之间需要相隔一段时间,隔断回响信号
    ! Y+ a' {$ |$ V4 J

  150. ) f% D) s! E. b4 L/ I2 k' p$ I
  151.   //为了消除余震的影响,取五次数据的平均值进行加权滤波。9 e$ t" Z+ ^1 b" [$ ^

  152. ' L( C0 O9 Z/ M! @+ V0 M
  153.   float Hcsr04GetLength(void )
    . M! C' ~% J& c* i1 ?0 F# r9 v
  154. + E2 m4 J7 a+ B. I/ }
  155.   {
    ) Z# x$ g  a( O# z) s! Q$ O
  156. / D& v. J) z# Q+ n; V
  157.   u32 t = 0;1 ?: m  A* p: l
  158. 4 l( y- L& G, A+ f6 l
  159.   int i = 0;  O# j) L" y0 |& h% q; J

  160. ) R; b3 ~+ F7 y; _" |
  161.   float lengthTemp = 0;
    5 m, D  h- e6 ]/ x

  162. % ]" R+ b/ e1 l, d. h
  163.   float sum = 0;; B7 U* o3 ]: z8 d

  164. 0 Q1 K: C+ F. K2 s* ^9 u" \5 ]
  165.   while(i!=5)  N. k$ M; v. n% S0 b

  166. & x; ^' x( v/ M0 j
  167.   {
    . ]* F: X' J8 [9 J. _

  168. 8 [. g" }" u7 Q5 B. e# |
  169.   /*发送一个20ms的脉冲*/6 Y4 k% W- m% U9 ]* f4 N
  170.   a4 D3 F2 n+ s$ d2 Z' r
  171.   TRIG_Send(1);. l8 K* y6 b7 r& T- ~& K

  172. 2 W! d$ j9 I4 S, x
  173.   osDelay(20);: P  Z- L& g1 p, U

  174. 2 N- x/ O- h( n1 `
  175.   TRIG_Send(0);" @. L' d) ?& ?# s
  176. 8 k' G) _+ `! [' C2 Q* P* q5 Y4 A9 ^
  177.   while(ECHO_Reci == 0); //等待接收口高电平输出(超声波发出)# a' h# D4 I) t$ w* s, e

  178. , c9 E4 n7 Y2 I7 ?7 r& i, f' b
  179.   OpenTimerForHc(); //打开定时器. x+ h3 y8 `. F% p0 ~
  180.   v* U6 y$ B9 g- n% Z3 Y
  181.   while(ECHO_Reci == 1); //等待超声波返回
    3 ~' H: q/ D+ H" t
  182. ' N- p0 M( O- C; S+ Q1 r
  183.   CloseTimerForHc(); //关闭定时器
    ! q* c) h! F* J3 T: G" X& o* ]/ ?

  184. ' ~, t. j" g% x+ Q
  185.   t = GetEchoTimer(); //获取时间,分辨率为1US) V1 {" j# S/ i/ x/ i3 X

  186. ( D+ s# y# l* q& }% r
  187.   lengthTemp = ((float)t*17/1000.0);//cm- K* H8 P- {2 Y  e7 O4 c, V1 G

  188. 0 N( i# m+ e& @8 i3 {9 Q
  189.   sum = lengthTemp + sum ;: `4 A8 V4 v: s: K/ C3 b, [

  190. * `0 I0 Y  ?6 J; E
  191.   i = i + 1;
    2 G3 e. v" R0 ^* n) d2 F

  192. $ N- }4 N  W' Q" {3 M
  193.   }
    7 v* |( w* z( l6 X/ A$ T# s# K
  194. 0 E) _$ c* @: b
  195.   lengthTemp = sum/5.0;4 Z! A- j9 j: {
  196. 0 {9 b( J% }$ Q+ w
  197.   return lengthTemp;- ?; v( V5 ]4 h& {5 A
  198. 9 `3 W8 v; d  U( a6 d
  199.   }
复制代码

4 [. l) j4 j0 t' ~! I8 H* a4 z8 Y# ?3 j1 Q0 v
  • TA的每日心情
    开心
    2023-5-15 15:25
  • 签到天数: 1 天

    [LV.1]初来乍到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-6-8 22:53 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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