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

stm32驱动超声波模块源码

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
  下面是关于stm32驱动超声波模块的一段代码,有需要的朋友可以复制参考,希望对大家能够有所帮助和启发。
+ u0 ?& e3 t+ u. z: Z( ~0 ^  }$ a6 J* P8 \) ~+ D8 p2 s# B- z
" H5 i9 j& O) X& T

. B5 V$ b  I1 m2 Z* ?# p) @$ I3 X
, G6 @+ `/ m0 f- F. m, D  T, V
  1.   #define HCSR04_PORT GPIOB
    + f+ }& i+ _% f+ @

  2. % O: z4 n: G) a% J$ e
  3.   #define HCSR04_CLK RCC_APB2Periph_GPIOB
    ( ~/ D+ \5 Q4 n

  4. 2 w0 t/ q% V, X- L, x/ T
  5.   #define HCSR04_TRIG GPIO_Pin_80 r8 n- ]. [& X; c+ z% @
  6. 4 a4 g  `, P3 p, l; O7 b3 A. M
  7.   #define HCSR04_ECHO GPIO_Pin_9  ~6 A" H$ Q  u" h1 H1 X/ O& T6 R
  8. 2 B. G0 w. D4 Q. u9 p, c  M0 o
  9.   #define TRIG_Send(n) do{  l! U5 `6 D. O3 l; I

  10. ( w* a0 U; ~9 x5 A4 D5 z
  11.   if(n == 0)
    : V% P0 s- t; ~* p. M$ P6 }, L+ `
  12. . _1 ^% C% w: e7 }: |3 ?
  13.   GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);% u7 f& p( N& f; l; ^
  14. & l5 |8 u8 |, X6 p  U* g
  15.   else if(n == 1)
    3 c1 Z- X8 T5 [! D6 m& [7 f3 j" M

  16. ' H, Q' l1 `0 a2 B5 g
  17.   GPIO_SetBits(HCSR04_PORT,HCSR04_TRIG);
    % w) J' h0 R! Q, H+ }/ q
  18. " G/ G) P) _' e) [
  19.   }while(0)+ z" r7 _8 r% U1 S

  20. * j# n5 P% X1 z3 a* @# q
  21.   #define ECHO_Reci GPIO_ReadInputDataBit(GPIOB,HCSR04_ECHO)
    7 p3 b9 e- H1 ]+ `
  22. / T7 W" f+ f( m1 C
  23.   void UltrasonicInit(void)
    : m! w: [+ u( ^( i7 E/ o
  24. 7 _) |6 _5 K! b! e
  25.   {; N2 Y, M$ U8 Y3 O
  26. + L6 e+ e( I- V  \+ U% Y$ ?' `( e
  27.   GPIO_InitTypeDef GPIO_InitStructure;2 {$ {* r  G2 v* @0 x
  28. * E# S' x6 l; g9 p" ?5 N
  29.   RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);9 N; T) u; z5 x5 k
  30. . B5 `$ `2 c  Y
  31.   //IO初始化
    ' p2 S5 p- [, K% S3 F
  32. . L' r- V+ \4 Z3 x. i
  33.   GPIO_InitStructure.GPIO_Pin = HCSR04_TRIG; //发送电平引脚
    # ^6 o) c/ c. O/ l2 `( U

  34. 3 q! z5 \& j2 [* d
  35.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;# N& ~9 i6 F) ~

  36. 6 K( u0 d0 k/ w, ^
  37.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
    2 D0 F; u) H9 N; C: l. S
  38. # O1 @7 ?' A7 A: S
  39.   GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
    : s7 y6 T0 ~' ?2 \% T
  40. ! [+ D8 n4 x+ `# x/ I6 G
  41.   GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);
    4 K/ J+ m; O  u7 o% C3 w5 a" s  f; P
  42. $ o  ?1 e. z2 T+ i4 g
  43.   GPIO_InitStructure.GPIO_Pin = HCSR04_ECHO; //返回电平引脚
      U5 ?' v/ ?* a& _+ C( e' s( T# a

  44.   e* @' i4 N/ M' ], n1 e
  45.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    8 P) r( z( B! w% P
  46. % W% M# S# i4 j( e
  47.   GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
    ! e+ t  b0 F  M5 J8 ]/ E) V
  48. ; A  p# q/ `( `; B3 Y* z
  49.   GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);6 C6 @, F3 Q. o1 v' s9 C
  50. 2 G# U& R6 S* \7 n4 l- ~, {, S( c
  51.   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //生成用于定时器设置的结构体+ m0 l, b$ X/ r3 Z, i! x! r- U
  52. . Z0 V2 O* I* @# [" Z
  53.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //使能对应RCC时钟
    1 b+ B* y+ |. Y6 }! E; Q

  54. 5 b( M3 X& y1 q; n8 P6 U
  55.   //配置定时器基础结构体0 X  n; F2 c2 ^7 b* i

  56. " C- {& v$ C* ^1 l0 l
  57.   TIM_DeInit(TIM6);" m$ g8 _# W( _2 W) U
  58. " O  q: M7 t3 L" Q) R
  59.   TIM_TimeBaseStructure.TIM_Period = (1000-1); //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到1000为1ms3 U0 Q/ b7 Z+ w/ E  g3 x9 I2 [
  60. , w" W; [5 ~# s& g% Y: u' U
  61.   TIM_TimeBaseStructure.TIM_Prescaler =(72-1); //设置用来作为TIMx时钟频率除数的预分频值 1M的计数频率 1US计数
    . K; R; Z$ d  {+ g* n% I
  62. * v! l+ [3 k9 S0 A- f" F  D
  63.   TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//不分频
    2 {( `) D  w& R1 T4 i2 W0 N& V
  64. 9 L  f1 F' _$ m! z
  65.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式1 c% `( f' z( W: K7 r! d9 X( @
  66. 6 O% h  l( |$ Y4 x1 Q- _
  67.   TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
    4 X0 G: E! x+ Z: T# {* b
  68. 0 @  N  A: e* ^# k
  69.   TIM_CleaRFlag(TIM6, TIM_FLAG_Update); //清除更新中断,免得一打开中断立即产生中断2 {8 `1 t* `( }5 P6 Z

  70. - ^8 b, \$ d, ^5 r0 R
  71.   TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); //打开定时器更新中断! P2 ~3 ?- n  P, M# J4 S6 \
  72. , Y- p) B' S5 N0 h6 V: t1 l& K; r  O
  73.   NVIC_InitTypeDef NVIC_InitStructure;
    , }: D; k2 [4 g- A( d4 Q. E
  74. ) e6 S9 `( ?6 {- ?9 I7 N, J% G. D
  75.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);8 Z, m  Q0 U1 t- s  |5 Q

  76. ( c* _# P/ y$ X0 o3 |
  77.   NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn; //选择串口1中断2 H! B0 y& P% y! G
  78. - l/ Q- {6 N5 e, X
  79.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占式中断优先级设置为1
    , r. K& h7 A1 Q2 v, G/ {2 c

  80. / \: Q& X+ i* Q% N1 g& i8 B
  81.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应式中断优先级设置为1
    + ?2 U0 V! k2 l( r# e6 R) T

  82. 4 m9 ?8 U5 j0 [# |$ i+ u
  83.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断, C1 U6 K- w) O: U" z
  84. ! c& b  V- b; d
  85.   NVIC_Init(&NVIC_InitStructure);
    5 M6 I& D$ B- w7 l/ A) v
  86. 7 z0 ?+ u, I- G+ n
  87.   TIM_Cmd(TIM6,DISABLE);0 L8 d: |4 L4 w$ h, x* i
  88. & @- }  d% v8 |0 g
  89.   }
    ! s4 B* ]* i& u) F' k1 X+ }
  90. % k! m" ^" M5 H4 e! T2 Q. x
  91.   //定时器6中断服务程序
      C) L6 C* |; O( x9 a7 u  y0 Y' m7 Q
  92. 3 v+ x1 Y& ~7 W4 g
  93.   u32 msHcCount = 0;$ V  L4 ^" w9 {2 f* g# G

  94. , j7 E2 L& C" [! F/ V. v
  95.   void TIM6_IRQHandler(void) //TIM6中断: {) b1 j0 s5 s9 O) p. E; b/ {

  96.   C/ y+ V& r5 m7 V" _& d( e
  97.   {
    % S/ z" E3 L+ K" E, ]1 C

  98. 7 v6 T  [; D1 F# H5 S
  99.   if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
    " e2 j! ]$ ]( t1 Y6 m6 P. S
  100. ) b) ]  ?1 P0 R0 u3 H! v
  101.   {
    ; s1 Y9 a! E1 K. `
  102. : T$ w) g" {0 @
  103.   TIM_ClearITPendingBit(TIM6, TIM_IT_Update); //清除TIMx更新中断标志; _0 q& X1 |# Z7 f
  104. / G3 T- K' t+ `
  105.   msHcCount++;
    , R7 Y' \" p/ i% j0 R
  106. " j2 d6 ^' ?9 x& r6 b% o/ w) c# h6 v
  107.   }
    , j1 B# {$ I: {9 v" ?' `

  108. " J4 a4 s- g! v" z, w& t( ]
  109.   }0 u  z- R! ?: T  q3 z) w3 O1 g

  110. 4 v9 \8 _, o! d# ^8 c
  111.   static void OpenTimerForHc() //打开定时器
    5 f! x; O- G5 J$ r$ c1 C" D

  112. : T* D% o% f/ |- l, n/ z
  113.   {  n. L$ o. g# R, H% p
  114. ( p" m& O2 c& R0 O
  115.   TIM_SetCounter(TIM6,0); //清除计数7 ~+ \" t. A, [7 M( p! z

  116. $ ?" M# P' [+ R* S5 T. l2 {- V
  117.   msHcCount = 0;
    # H2 g8 T. c: k# A7 N4 T: i2 G
  118. + H4 i( |1 Q* G0 F4 L* p3 w! [# k
  119.   TIM_Cmd(TIM6, ENABLE); //使能TIMx外设
    ! R' a6 m6 S2 U9 ]
  120. 7 ^- l3 {( Z: I- o+ i& a0 O, a
  121.   }$ W  I& n; D6 }: h
  122. 6 [% p6 C4 Y5 n4 m* X- u
  123.   static void CloseTimerForHc() //关闭定时器
    % j) S% R, q  T0 A- c2 M$ v
  124. ( l# e/ C( D& W1 h( N) S' i) Q
  125.   {
    . h/ I. R" u7 N0 `! v

  126. 4 n( M7 ^- F9 u0 Q, k
  127.   TIM_Cmd(TIM6, DISABLE); //使能TIMx外设
    # ^& Z9 y5 ?4 k' O1 I$ R8 E" `

  128. ( }* o1 l# e* c* `, L  K5 D
  129.   }6 v+ c, G( |$ T9 {- W3 h8 `

  130. ! S! K2 H+ ~3 \$ k& G" d; `3 H- H: ?4 i
  131.   //获取定时器时间+ {1 ~+ [; x* G
  132. # d: o% F8 B) w+ `
  133.   u32 GetEchoTimer(void)
    7 t1 x( o& {2 l' l

  134. 1 R5 E- ~& s; M0 o, H1 E
  135.   {8 |6 Q0 u8 V0 S
  136. 6 @4 s, ~, `) A) L9 N1 y9 m
  137.   u32 t = 0;0 u* s( Y: }# K* ~- h4 }8 A

  138. 4 b& i6 h, [/ _. l
  139.   t = msHcCount*1000; //将MS转换成US( {  p! D% Z. d3 r  r1 v

  140.   f. C) ~6 L# {$ Y* P- q
  141.   t += TIM_GetCounter(TIM6); //得到总的US- R7 H9 G: T/ Z# L  R) `) r( c
  142. , N5 U7 n5 l, H" I) Q9 z
  143.   TIM6->CNT = 0; //将TIM6计数寄存器的计数值清零
    ; R! \7 U. o% x9 ]* o8 \$ O' K

  144. 8 c- F* M2 n. k7 A# L& |9 M
  145.   return t;/ @' k0 }) q% @+ R% }. B2 R2 [5 S

  146. # t8 o; E* [& Y8 D6 k% r1 [5 r
  147.   }3 h9 G. m, l( N

  148. ; m6 S( v5 x! X! @% ^
  149.   //一次获取超声波测距数据 两次测距之间需要相隔一段时间,隔断回响信号
    7 J. ]0 T5 m. }- @) d; ~
  150. " ?4 e6 \7 T0 \$ A% E
  151.   //为了消除余震的影响,取五次数据的平均值进行加权滤波。) W. ?9 z" e$ e. i1 T. F
  152. 8 n+ C0 N* e7 {! E
  153.   float Hcsr04GetLength(void )' ?8 E  _& u0 J1 ]' l$ x
  154. * I( j- n  ~  _& c% D* E
  155.   {% ]7 w% @  b9 H) V) e
  156. + K/ ^$ W: L4 @+ s4 G
  157.   u32 t = 0;9 S& I4 R- y% ?6 U) T5 q% j

  158. ' ]* F) R  T$ z
  159.   int i = 0;
    7 `: l# a$ Q0 N1 m$ ^* D
  160. " r; O, C4 h7 _) M+ |3 m" s9 Y
  161.   float lengthTemp = 0;9 X3 B9 A# [8 m( y, w. M( u: S/ Z

  162. , G  I5 y# X: _
  163.   float sum = 0;
    4 B- i, ?0 ~0 Q9 @7 X% |

  164. & l/ z$ g2 K* z8 Z# t5 `
  165.   while(i!=5)
    / K1 N6 Q, T1 y+ ?/ N' T

  166. " F1 H1 F1 l. W7 U0 f
  167.   {
    " y* b( e3 j- z5 g9 y  }$ ?8 C% m
  168. 8 v( s8 Z7 E7 f: U) B/ S
  169.   /*发送一个20ms的脉冲*/
    * G. f8 v/ z. \9 H

  170. # Q3 `# x7 }5 r( m' |* w
  171.   TRIG_Send(1);: f1 R6 q7 e3 f/ A- I, u

  172. / J( _+ l: i* C1 O
  173.   osDelay(20);# N: ?: ~2 w  X- ]
  174. & q0 `7 k# W; Q, p) I% u
  175.   TRIG_Send(0);
    - l* D+ ]" N1 j4 C( ~7 Y
  176. 9 j0 T7 ?/ e/ l7 k4 Q
  177.   while(ECHO_Reci == 0); //等待接收口高电平输出(超声波发出)( B! b* Z+ p5 }$ e0 r6 X
  178. 6 A6 c8 u9 e9 |  [' d
  179.   OpenTimerForHc(); //打开定时器
    # @. W& ]- p7 L: s7 O

  180. ' @( H7 `* _+ \' U  O
  181.   while(ECHO_Reci == 1); //等待超声波返回
    / v" W4 I7 k" v, e5 }8 U2 W9 z
  182. . i! y: W& P# ?; g
  183.   CloseTimerForHc(); //关闭定时器6 G5 c5 i2 e0 Q6 i3 o7 r
  184. 5 f+ v/ U" E% s; h+ {7 y
  185.   t = GetEchoTimer(); //获取时间,分辨率为1US* F6 S# o3 U2 L
  186. + B7 @+ {+ O5 n0 e5 |. N4 L% S' @
  187.   lengthTemp = ((float)t*17/1000.0);//cm
    & A2 i! R2 ^- H
  188. ( A9 Z% r6 n% u/ v) U
  189.   sum = lengthTemp + sum ;
    0 e& T  V2 N1 |# D

  190. ( j' Z' C7 U* p5 h& `3 y
  191.   i = i + 1;
    ; h' ]! Z) |) ]; ^, l/ H  [

  192. : w6 D; i1 l7 Q% s9 Z# k/ q$ j
  193.   }! B- y' N2 i- v) g" z4 l( h

  194. 5 X( N; C7 [# q! L6 W  d
  195.   lengthTemp = sum/5.0;% \: S1 S, r4 e8 {9 w; C  S

  196. 7 O9 h- z& x, _) T3 J8 n
  197.   return lengthTemp;$ A# C9 n4 c+ Z3 i' |
  198. 0 y+ V0 B; \/ Z6 i2 t3 M9 u3 r
  199.   }
复制代码

$ I0 U$ ?3 F4 x+ Z& M: g) N8 C3 ^; L: K
* |4 k: T4 q8 `& k3 ~: G8 D+ _
  • 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-19 02:30 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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