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

stm32驱动超声波模块源码

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
  下面是关于stm32驱动超声波模块的一段代码,有需要的朋友可以复制参考,希望对大家能够有所帮助和启发。. ^6 u9 l. [5 S+ h9 j+ o, h0 P
" w4 E6 ?9 i: W" A
0 V. z  \" Y- j

0 a5 w, A2 W6 [- i
5 ]  f: ]( N) K/ X0 U
  1.   #define HCSR04_PORT GPIOB: y7 ^' Y' f) {8 S2 S8 _  C  u# V

  2. 9 \9 W' E% H* N1 g9 ?% J
  3.   #define HCSR04_CLK RCC_APB2Periph_GPIOB+ @1 q6 {# x- A5 ~8 y: \

  4.   J, j$ L9 x8 S" W: ]4 F, e
  5.   #define HCSR04_TRIG GPIO_Pin_8
    $ @, e0 Y# n# A: ?  ]

  6. 2 h2 U+ K8 H1 \' s7 Z% e
  7.   #define HCSR04_ECHO GPIO_Pin_9
    4 f' X+ L1 p9 \6 X

  8. / F8 H- U/ I' U' v' Q6 A
  9.   #define TRIG_Send(n) do{
    % B5 b, [* p( [, C0 z

  10. * P( g& B' L* [
  11.   if(n == 0)
    6 ?' r( @7 i9 j

  12. ! N6 k& ^5 z. R. r, b8 `% X! k: B
  13.   GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);
    - x( V- G0 o$ ]

  14. . z. r+ Z( N- J; h+ {
  15.   else if(n == 1)
    # \4 h# N! ^7 t  P3 M
  16. / B, o6 ]( Z# s3 l
  17.   GPIO_SetBits(HCSR04_PORT,HCSR04_TRIG);4 ~3 `, j$ M1 H, V
  18. ' v/ Y4 R1 Z* e9 M1 l. y/ h8 _3 T
  19.   }while(0)
    6 A5 p/ \! X$ S5 Y0 {" T

  20.   o0 K0 s: t. w- J  j! t! Z
  21.   #define ECHO_Reci GPIO_ReadInputDataBit(GPIOB,HCSR04_ECHO)3 y. }6 {- E& h  s% f" D: h
  22. $ H! F7 a  B0 ^4 p9 |
  23.   void UltrasonicInit(void)1 E' j6 q' T5 s: _7 E. q& M
  24. + @! j, |/ V+ {; a$ D  l/ L( I9 [
  25.   {
    6 o1 p- ?& k1 D

  26. : \! I6 E6 n: h% I3 V: ~* U, X  t
  27.   GPIO_InitTypeDef GPIO_InitStructure;8 r" W9 T; {" o* b  [# D3 g

  28. 5 n+ |, c4 e2 K1 x
  29.   RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);* W" ]) E) i, M2 Z5 P) `

  30. 9 H6 A- V7 W$ W  f' p) m3 t
  31.   //IO初始化* y& S' `( [9 i* Y3 E2 v

  32. / F5 ], L$ d( y$ a
  33.   GPIO_InitStructure.GPIO_Pin = HCSR04_TRIG; //发送电平引脚3 Z" r+ Y& O  v2 I

  34. ! X4 X0 p' d5 r* D" J7 D( c
  35.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;* V% P' R% N" u7 p0 i
  36. : {+ o+ r1 E/ Q: S' P7 V. L
  37.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出1 ]* p: I% Z! A6 k) Z
  38. # E2 g3 K% v' o/ k) n( F* @# ?
  39.   GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);2 I9 W) `6 d1 W9 d5 ^& S
  40. 5 U& b5 Q' f# ~! z5 }' q, U
  41.   GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);) t, H1 r& @& j

  42. 2 \) {/ K+ `- t0 C# K/ h
  43.   GPIO_InitStructure.GPIO_Pin = HCSR04_ECHO; //返回电平引脚$ i( p2 `( G& u9 _7 V" G
  44. ( g8 L: `5 [2 @1 [8 |+ H
  45.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    8 R8 g' w0 o/ z: }. b% |5 v

  46. ! N8 |; a0 q* w- f2 h6 ?
  47.   GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);3 o' l' j3 b3 n2 h
  48. 8 [# M$ @* s9 e! R! z. a
  49.   GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);
    - N, e; _( |' ~0 q

  50. - Z! d7 o. e8 ]) a; W7 r! ]
  51.   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //生成用于定时器设置的结构体
    4 O) ?; L8 s0 K5 f5 j* r" R
  52.   Q+ }8 A8 V; a: w
  53.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //使能对应RCC时钟5 K3 \% h2 [2 m: M
  54. 1 o+ Q) j) G9 K" ^; L) s: X2 v
  55.   //配置定时器基础结构体
    ' Z' M, v% k1 I* k
  56. % p% T- f6 m& S
  57.   TIM_DeInit(TIM6);
    6 _8 }$ B, d4 V$ }! }) G9 G6 q

  58. ( S# L! r( [1 F% O8 \
  59.   TIM_TimeBaseStructure.TIM_Period = (1000-1); //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到1000为1ms
    4 _, c, F2 Y) t4 b# d2 m  v

  60. 1 \" X/ y6 \8 g7 ]
  61.   TIM_TimeBaseStructure.TIM_Prescaler =(72-1); //设置用来作为TIMx时钟频率除数的预分频值 1M的计数频率 1US计数
    ' w0 d) g% k! Y2 m$ u
  62. 0 B; q. {7 Y/ M: ]" @; }; Z
  63.   TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//不分频
    + w9 d7 E( i* Z  j$ e* G, Z% c+ u
  64. ( x2 p6 \% |( ?2 k, F) ^% Z
  65.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式" }  T: H5 s0 u8 L0 M5 K/ j
  66. * P7 z& _) _, {8 F- N/ a: c7 r
  67.   TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
    ! A2 X& x& d7 ^! c2 }* o- W: B
  68. 7 F8 D+ ^8 X0 S5 F; O
  69.   TIM_CleaRFlag(TIM6, TIM_FLAG_Update); //清除更新中断,免得一打开中断立即产生中断
    * W5 H; f+ _! w# k
  70. + n: I5 J* b! G5 Y/ f9 ^
  71.   TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); //打开定时器更新中断
    7 `, Z& M* r4 J0 a) B2 I+ L6 ?
  72. ! K6 w. @8 g% e( `* X2 @( y, X' z
  73.   NVIC_InitTypeDef NVIC_InitStructure;! H0 V. R- i; R$ Y1 N( M, L8 H( ]" Q

  74. ' D7 x+ }; y0 w. q
  75.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    " p& T( j$ R' @. D8 W& U

  76. : A) U3 I0 S3 p, m
  77.   NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn; //选择串口1中断
    - W; ~. W; t0 Q; [, x

  78. 2 [9 B( z9 d; `2 L# M
  79.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占式中断优先级设置为1
    2 F, v& t% u6 r# y
  80. 4 r' c$ u: q; s% q1 H3 ~
  81.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应式中断优先级设置为1
    ; }8 w6 n+ l# H, R. U
  82. : n3 T- F, v; Q) R9 `6 @
  83.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断% c6 @3 W1 L+ y1 w3 Y
  84. 2 k8 N6 M+ i8 q
  85.   NVIC_Init(&NVIC_InitStructure);
    ' l1 J7 ?! _7 U
  86. # J0 s. |: x' c, Z5 _9 d
  87.   TIM_Cmd(TIM6,DISABLE);
      c4 h! \% J* h9 r, ^
  88. % e% n8 I0 Y2 U5 q0 x1 ?
  89.   }( h4 \! ^1 R8 @" D6 S
  90. . i( x; ~6 ]" @" \; j
  91.   //定时器6中断服务程序
    5 e4 `+ x% Y- Z6 J. I

  92. ; F+ Y, t* ~1 f; t9 H- z
  93.   u32 msHcCount = 0;0 S' q6 d, l7 R" ]& {7 g
  94. 1 Y2 p+ n: a, A" I8 E3 M& g. M2 a6 w
  95.   void TIM6_IRQHandler(void) //TIM6中断. m8 X( J" k# K9 J& l
  96. ; ^' p8 `1 R" q( @3 ~0 R0 L8 q
  97.   {" `/ }% y$ g, ]2 i8 O

  98. ( }  z, E5 W3 ~8 U( a" I4 N
  99.   if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
    ' H* i. a, r" A
  100. + K6 L- `: ]" A6 Q7 ^$ n
  101.   {
    . t$ d# ]& R1 [2 c9 |  ~+ K
  102. & Q# `( c  b% R1 `& P0 g
  103.   TIM_ClearITPendingBit(TIM6, TIM_IT_Update); //清除TIMx更新中断标志) g5 c7 |* m5 I1 C

  104. 6 C4 u7 q" s( o  K* M3 [
  105.   msHcCount++;
    ( Y+ _% k" g# x4 W8 ]$ P( O. {
  106.   ~2 c$ E5 ]( Y1 v" R- y8 D
  107.   }5 Y1 x% S( J6 e' M7 I5 G- d

  108. 9 |  ]; i. ~/ `
  109.   }+ G2 t* c0 Z* C% h* M; I
  110. 0 F0 J7 A4 u8 ^( t3 L$ H
  111.   static void OpenTimerForHc() //打开定时器
      M* ?5 O, i( [- N: Z

  112. 8 N1 q- U+ Y7 u; r# Y! M' V
  113.   {/ i- B% s# k1 S* a4 W; U6 ]

  114. ' o9 q' K; r$ `% `6 e4 f
  115.   TIM_SetCounter(TIM6,0); //清除计数
    5 W- f2 _* E6 n+ o! B9 ~

  116. : U; v! F6 J0 N7 a' L
  117.   msHcCount = 0;5 N# F# d" ?. S, ?7 P& @& ~

  118. 6 e7 Z' }3 y! G7 Y1 L5 ?; Z. z# j
  119.   TIM_Cmd(TIM6, ENABLE); //使能TIMx外设. m# z# ~9 O6 }+ V0 \# A

  120. ! m$ m$ T+ l. B, r& s6 @: D8 r+ D# d
  121.   }; l6 w+ R; O: J/ g$ Z! B3 G

  122. 1 S' ?9 J& o$ h1 I  m
  123.   static void CloseTimerForHc() //关闭定时器
    3 d) x3 d2 m" w2 l, U9 R
  124. $ ~6 G$ y# I& ?# Q5 W! y; s9 Y
  125.   {  Q- ?4 G1 Z2 F7 ?! F( u6 H

  126. # {: i; ~" ?" H1 ~$ s# m9 F9 L
  127.   TIM_Cmd(TIM6, DISABLE); //使能TIMx外设+ S1 Y( h- `3 H* z6 |6 `
  128. 0 b; i, p0 @  E) r% R8 P
  129.   }. Q5 N! [+ f1 K8 w  ^+ e
  130. 5 }# z$ {0 y' S6 V' T" P0 d2 E9 q
  131.   //获取定时器时间2 a: |; g) p( A! j
  132. + y! |$ s/ T  N* d( q3 u/ Y
  133.   u32 GetEchoTimer(void)
    0 N, @! |5 A- k

  134. 2 Q" d5 i0 T# e$ E
  135.   {7 d# Q  U% U: G4 |

  136. $ k1 w7 G/ `2 Y  q. q, @; f
  137.   u32 t = 0;4 h+ k  A2 O9 U+ ~
  138. ; D7 P& F9 e: K8 h% F, F+ r
  139.   t = msHcCount*1000; //将MS转换成US3 G, \0 u( b$ U5 n+ g+ ?

  140. # ?. z/ L# E+ q$ B9 _  t
  141.   t += TIM_GetCounter(TIM6); //得到总的US
    & F% E4 `: k: z6 ~, X
  142. 3 U5 w" w- G2 H7 K" R# Z$ _6 {' G
  143.   TIM6->CNT = 0; //将TIM6计数寄存器的计数值清零
    0 h- Z; p& V3 U6 T
  144. ( r) _& j+ I( L1 J0 g+ k
  145.   return t;
    ) H- R# s+ F7 o7 f) w9 G  q0 ^
  146. + x  I( c3 G# ]4 q2 ^5 n
  147.   }# o- b& P& p3 U* Z9 P; B: o
  148. + c: B0 l" M% S: T
  149.   //一次获取超声波测距数据 两次测距之间需要相隔一段时间,隔断回响信号% M$ [6 G" J6 M; W

  150. 8 `# {1 Q- Q# p. H3 m
  151.   //为了消除余震的影响,取五次数据的平均值进行加权滤波。6 ?; L  N5 Z5 u! t, G

  152. . t5 s4 e, f% F7 @% }5 i& J
  153.   float Hcsr04GetLength(void )" I, o/ ?/ |, m' F$ o% g. v; ?
  154. " \2 ^: u. `% n( l
  155.   {! A( a# E$ Z3 X1 s3 i$ k, [: y
  156. / C. V/ j$ w1 _$ o
  157.   u32 t = 0;
    8 K, B! F# M7 z3 f! W7 [
  158. 9 y: B8 i/ L0 ^
  159.   int i = 0;
    3 E( J+ [& E7 B" b

  160. + e( ]+ I& M- I
  161.   float lengthTemp = 0;3 f! f6 o. }, n8 u
  162. ' q5 o( y' P, h8 k, Z
  163.   float sum = 0;
    5 k' l2 ~0 r* ?0 t  s. F  r
  164. 5 M# k0 f! Q7 g3 U$ e7 w+ k
  165.   while(i!=5). ^5 v& X+ `3 F8 P0 v3 U/ @/ V

  166. 5 C( @4 R0 E0 @& ?" c( c) b5 P
  167.   {( }, m& y2 k8 w. x
  168. 7 P/ F( b1 x& z3 M. n. @/ e
  169.   /*发送一个20ms的脉冲*/
    ! r3 _2 v6 ]6 }2 C7 A3 \% T
  170. : r. G2 `( c4 P4 t
  171.   TRIG_Send(1);
    * @2 J% k, ~8 d! Y) @3 d5 i, c& g
  172. ) E% m- D  y7 R  R( L9 r
  173.   osDelay(20);% X9 A' L# c. R
  174. + S; P4 U! c( l/ n% b
  175.   TRIG_Send(0);; m, H% T. I$ o! A# z0 {7 p% O# o& M. U

  176. & N4 ?) P- D$ u. u% y; Z( @* `& ?
  177.   while(ECHO_Reci == 0); //等待接收口高电平输出(超声波发出)$ Z. _  g0 s3 ]% Y) [7 P

  178. / C: s" s- C3 M
  179.   OpenTimerForHc(); //打开定时器
    1 M( e; b  w2 [; |; f% h, L
  180. , s, G. T3 c# B* V1 y
  181.   while(ECHO_Reci == 1); //等待超声波返回
    ) ^+ T( R# r& g0 C9 p" Y8 J7 g

  182. , B  P  @: i) t! m5 |1 U: R& V: }) M
  183.   CloseTimerForHc(); //关闭定时器
    : R. A7 j! d2 g% {
  184. ' N8 l0 E3 m! U! c1 C6 W2 k6 |
  185.   t = GetEchoTimer(); //获取时间,分辨率为1US
    ' {7 S8 ]1 N5 H0 B" z

  186.   W" d' m  C5 @& ]( w& }  h
  187.   lengthTemp = ((float)t*17/1000.0);//cm! i8 q% g' k/ f6 m# l
  188. - s7 s/ ?5 O$ n1 f( d, s) Z
  189.   sum = lengthTemp + sum ;
    ( X, ?$ g# Z, C! d& V) R' u
  190. ) T5 \2 k# N' O2 ^% X
  191.   i = i + 1;
    - m) t* u# S/ J: q. V9 q* B9 A

  192. 0 x( h6 s# x1 `+ p2 s
  193.   }
    ( Z- F+ u' g+ \* G: c, Q! F8 F

  194. % _" N, A/ Y! a9 [2 R
  195.   lengthTemp = sum/5.0;
    - ~- M1 o8 R% H/ B4 O. I

  196. 5 U- H6 Y7 d/ f1 y/ c9 i# I
  197.   return lengthTemp;+ l- z' K) N3 c" u6 L2 a6 X* P
  198. 3 h& Q" j* o) K
  199.   }
复制代码
& }+ E% e5 w5 O7 J3 D# B% A+ z

( {6 B' f+ {, Z6 v7 s& ?. _9 H3 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-6-21 13:16 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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