你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】stm32Cubemx实用篇(二):定时器捕获功能实现SR04超声波测距

[复制链接]
STMCU小助手 发布时间:2022-3-9 22:00
一、SR04使用方法
6 r, y  q+ f4 ], I; ^6 ^0 ?SR04实物
/ x9 X3 L% X  v- p) P. p3 O8 Z6 I% C+ g
~R@QV6@9F5SDGBINGT4.png - b. e8 L  j: l  @

! \3 J) ]" G6 `1、工作原理2 A, W. p; P. j# }& I0 a, E( g$ ]

& c5 n* h6 a8 t9 h+ V. y2 r3 @0 `5 _ }N$F1MY1Q`]ZLT{54HEDBI0.png ) G+ @( s6 Z0 P/ F

$ \& `7 A' y: ^9 x# v( r2、接口定义和使用方法
- L& |: X/ k9 A6 q8 v6 Q9 D2 e1 S/ }2 s7 r* S6 F  _
0_D~GA{7N`8DQ7Z6FV0W(`K.png 3 i) o9 Z7 H8 L9 v% |/ E2 E! {: C
4 s% K6 A& W9 W" y, u; C  E' t4 z
3、注意事项
( E( a* B/ H. R  S) r: r. H' [& {" [# m- R
1:此模块不宜带电连接,如果要带电连接,则先让模块的 Gnd 端先连接。否则会影响$ F0 n% W9 e2 i( d
模块工作。
& p( a: Q3 J. i* e" Q5 N" E2:测距时,被测物体的面积不少于 0.5 平方米且要尽量平整。否则会影响测试结果。! u9 Z3 [% A: d, p8 C
# M/ D) {$ |3 \6 Q& \7 C$ n
二、Cubemx参数配置
  [" V% D' K9 c# r+ ]* x( Q) a1、时钟配置5 }2 t9 Q! m& _0 t

. F7 s2 i2 `3 L& @- i 7R[G{%HOUU0IX3$G5D5~S2O.png
- c: Z( P( B* R/ g* X+ }
  i( Q  `4 X, B# q' ^& }0 ]; h2、定时器输入捕获设置
4 W' b' y; J+ T( F
3 |0 Z) d# ?: q' f; ^设置定时器输入捕获:内部时钟、预分频为240、双边沿触发0 V0 _& k( V) _2 L+ D

& I: }' C- \0 V, O; o% J具体设置如下图所示:+ z* A3 R+ ?  e: U- E6 K$ q0 g4 _! Z

1 A7 O1 K- c& T( n7 [8 c 6`S1[55R731P~RH4BQR%_WO.png
* j2 [, J- n9 u7 B  y. t" ]9 P+ P' ]- ~/ I/ h
三、MDK代码修改与运行1 S0 e  C7 W+ ^% T2 F& @
1.输入捕获函数实现

) s! n6 j9 g' W1 c( k- V+ A: b# O" IHAL库给我们提供了一个输入捕获回调函数,我们只需要重写这个函数,实现测量接受端口高电平持续时间即可。4 z$ |2 F7 ~  L& b
代码如下(示例):. h" N; x3 B6 ~# y

  1. 7 a5 z; X* {3 h1 |
  2. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)" ^4 H" |6 v9 }7 V6 E' ^) L
  3. {6 p- Y9 r( _3 j2 [5 d' \
  4. static uint32_t capture_buf[2]={0,0}; //计数器缓存" p) ?7 N" \% Q, d4 b/ x
  5. static uint8_t capture_cnt=0;   //循环次数$ W7 o5 F6 q% {' d
  6. static uint32_t high_time;    //高电平时间,超声波来回一次的时间,us
    . X  Z0 S4 @* j
  7. /* Prevent unused argument(s) compilation warning */  X3 p5 \$ j+ p, V
  8. UNUSED(htim);
    9 \1 U  H+ `5 k* U
  9. //需要发送完触发信号后先开启上升沿捕获7 g- g* ^; J, s  {: n  N
  10. if(TIM12== htim->Instance)4 x5 S4 ?0 i# ~' G% P6 @8 L4 N
  11. {
    : x; L5 t! i) V
  12. if(HAL_TIM_ACTIVE_CHANNEL_2 == htim->Channel)6 G& I2 u9 I9 E$ T9 q
  13. {
    - f) M% ^1 h9 s; q9 g5 M: a
  14. switch(capture_cnt)
    " x% Y2 j) z6 e4 P" Q; O' F
  15. {
    * F  l- _) C' v1 y
  16. case 0://捕获到上升沿,记录下来当前时间3 W3 H' l0 N. T2 E# j
  17. capture_buf[0]= __HAL_TIM_GET_COMPARE(htim,TIM_CHANNEL_2);% e: ?& Q! I1 X; e- A. x$ e8 I3 h
  18. __HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_FALLING); //开启捕获下降沿
    , E+ h% r! z0 K( ^: ?0 Z) X4 g! J
  19. capture_cnt++;
    9 [$ j$ t% T" ?1 p
  20. break;
    : O. ?. K6 k" N- |6 B, {
  21. case 1://捕获到下降沿,记录下此刻时间. ^% z$ R1 [0 R& D
  22. capture_buf[1]= __HAL_TIM_GET_COMPARE(htim,TIM_CHANNEL_2);
    . s5 V( l1 V7 V: D9 f# P
  23. capture_cnt=0;9 h6 ?8 Q) Q% ?: F% B, s6 |& z
  24. HAL_TIM_IC_Stop_IT(htim,TIM_CHANNEL_2); //停止捕获. b) @2 }5 ?" w/ c( t6 ^$ v/ s) }  [
  25. high_time = capture_buf[1]- capture_buf[0];
    ( }% y4 A1 X* `, \5 ~. [+ ]
  26. if(capture_buf[1]>capture_buf[0])printf("ultrasonic DIST = %.1fCM\r\n",17.0*high_time/1000);
    , y6 F) `9 V- z' C- g, y8 M. y# y
  27. break;
    6 o0 O( O% D$ K4 C0 F3 n% }2 m5 E
  28. default: break;, e7 O% M9 j# t. R) q4 I& j
  29. }        
    $ Q- m/ g3 E3 I$ b
  30. }/ I: C" o9 L! r1 `9 g  r8 a4 l
  31. }1 E5 F- u0 {& P  G5 T1 u
  32. }
复制代码

! C# ?; C7 G, {2.主函数实现
- B3 V' d+ j3 Y' }& c2 y这里在主函数增加了按键扫描通过按键控制SR04测量距离。+ D% }% Y$ w: F) i. m  h- p
另外还增加了串口printf函数,打印出测量到的距离。
3 M8 B% S8 Q0 W9 b- O
# G( E" a6 A7 o% ^1 U& p/ ?代码如下(示例):* q$ U9 d! d  i/ ?% f* N5 ^1 \
  1. key=KEYPRESS();    //按键
    " |8 I' ^/ C+ Y1 I* @9 @
  2. if(key==1)//如果按键按下则进行一次测距3 ]  X3 {9 m9 ~4 G$ W# H' u) M: i: k
  3. {
    . f: [+ J# j# c6 i- j
  4. //发送>10us的超声波trig信号
    ; X$ m6 I( B! q% @5 a( F
  5. HAL_GPIO_WritePin(GPIOG, GPIO_PIN_11,GPIO_PIN_SET);
    7 Q. g" }) A% p
  6. HAL_Delay(1);+ p& q3 i/ z9 I+ Y# \; r
  7. HAL_GPIO_WritePin(GPIOG, GPIO_PIN_11,GPIO_PIN_RESET);
    3 j) ^* c% y- z) d8 e
  8. __HAL_TIM_SET_CAPTUREPOLARITY(&htim12,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_RISING);  //开启上升沿捕获% k3 E# o: y% J
  9. HAL_TIM_IC_Start_IT(&htim12,TIM_CHANNEL_2);  //开启输入捕获中断
    ) g/ W3 A" g3 @4 L3 t. Y' |1 \4 `
  10. }
复制代码

3 X1 ]1 A% y: I6 a9 E" C可以看到按键按下后能够正确测出距离。
, u( A2 V+ ^. k" L8 `
" P' m6 V4 _$ S3 l JWF3IQ~Z{OB_85~J4Y}J643.png ' h! k+ a' h" [3 T; w
赞 收藏 评论0 发布时间:2022-3-9 22:00

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版