一、SR04使用方法
6 r, y q+ f4 ], I; ^6 ^0 ?SR04实物
/ x9 X3 L% X v- p) P. p3 O8 Z6 I% C+ g
- 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 _
) 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 _
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
- 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
* 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
7 a5 z; X* {3 h1 |- void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)" ^4 H" |6 v9 }7 V6 E' ^) L
- {6 p- Y9 r( _3 j2 [5 d' \
- static uint32_t capture_buf[2]={0,0}; //计数器缓存" p) ?7 N" \% Q, d4 b/ x
- static uint8_t capture_cnt=0; //循环次数$ W7 o5 F6 q% {' d
- static uint32_t high_time; //高电平时间,超声波来回一次的时间,us
. X Z0 S4 @* j - /* Prevent unused argument(s) compilation warning */ X3 p5 \$ j+ p, V
- UNUSED(htim);
9 \1 U H+ `5 k* U - //需要发送完触发信号后先开启上升沿捕获7 g- g* ^; J, s {: n N
- if(TIM12== htim->Instance)4 x5 S4 ?0 i# ~' G% P6 @8 L4 N
- {
: x; L5 t! i) V - if(HAL_TIM_ACTIVE_CHANNEL_2 == htim->Channel)6 G& I2 u9 I9 E$ T9 q
- {
- f) M% ^1 h9 s; q9 g5 M: a - switch(capture_cnt)
" x% Y2 j) z6 e4 P" Q; O' F - {
* F l- _) C' v1 y - case 0://捕获到上升沿,记录下来当前时间3 W3 H' l0 N. T2 E# j
- capture_buf[0]= __HAL_TIM_GET_COMPARE(htim,TIM_CHANNEL_2);% e: ?& Q! I1 X; e- A. x$ e8 I3 h
- __HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_FALLING); //开启捕获下降沿
, E+ h% r! z0 K( ^: ?0 Z) X4 g! J - capture_cnt++;
9 [$ j$ t% T" ?1 p - break;
: O. ?. K6 k" N- |6 B, { - case 1://捕获到下降沿,记录下此刻时间. ^% z$ R1 [0 R& D
- capture_buf[1]= __HAL_TIM_GET_COMPARE(htim,TIM_CHANNEL_2);
. s5 V( l1 V7 V: D9 f# P - capture_cnt=0;9 h6 ?8 Q) Q% ?: F% B, s6 |& z
- HAL_TIM_IC_Stop_IT(htim,TIM_CHANNEL_2); //停止捕获. b) @2 }5 ?" w/ c( t6 ^$ v/ s) } [
- high_time = capture_buf[1]- capture_buf[0];
( }% y4 A1 X* `, \5 ~. [+ ] - 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 - break;
6 o0 O( O% D$ K4 C0 F3 n% }2 m5 E - default: break;, e7 O% M9 j# t. R) q4 I& j
- }
$ Q- m/ g3 E3 I$ b - }/ I: C" o9 L! r1 `9 g r8 a4 l
- }1 E5 F- u0 {& P G5 T1 u
- }
复制代码
! 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 \
- key=KEYPRESS(); //按键
" |8 I' ^/ C+ Y1 I* @9 @ - if(key==1)//如果按键按下则进行一次测距3 ] X3 {9 m9 ~4 G$ W# H' u) M: i: k
- {
. f: [+ J# j# c6 i- j - //发送>10us的超声波trig信号
; X$ m6 I( B! q% @5 a( F - HAL_GPIO_WritePin(GPIOG, GPIO_PIN_11,GPIO_PIN_SET);
7 Q. g" }) A% p - HAL_Delay(1);+ p& q3 i/ z9 I+ Y# \; r
- HAL_GPIO_WritePin(GPIOG, GPIO_PIN_11,GPIO_PIN_RESET);
3 j) ^* c% y- z) d8 e - __HAL_TIM_SET_CAPTUREPOLARITY(&htim12,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_RISING); //开启上升沿捕获% k3 E# o: y% J
- HAL_TIM_IC_Start_IT(&htim12,TIM_CHANNEL_2); //开启输入捕获中断
) g/ W3 A" g3 @4 L3 t. Y' |1 \4 ` - }
复制代码
3 X1 ]1 A% y: I6 a9 E" C可以看到按键按下后能够正确测出距离。
, u( A2 V+ ^. k" L8 `
" P' m6 V4 _$ S3 l
' h! k+ a' h" [3 T; w
|