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

【经验分享】基于STM32的超声波传感器测距(含代码)

[复制链接]
STMCU小助手 发布时间:2022-5-12 19:10
1. 实验原理
, j. \& b% G% @: v2 z/ d
9 y4 r9 _4 m  r8 }5 @. n        超声波传感器采用的是HC-SR04,具有VCC、GND、Trig、Echo四个引脚,其使用方法为:将Trig 设置为高电平并保持至少10us,传感器将发出 8 个脉冲的声波。对于声波产生回声所需的整个时间内, Echo 为高电平。测量该高电平时间即可知经过的时间,则可计算障碍物的距离。
6 P6 u0 B! B6 X7 L' [1 s7 {& W0 E7 a
         测量Echo 为高电平的时间是利用STM32的通用定时器进行输入捕获,测量得到的高电平时间通过公式:距离 =  Thigh *340/2 (m) ,其中Thigh 单位为秒(s), 340米/秒(m/s)为声速。
9 A) ^- |) c$ y1 {8 b% Z, u! r: n) C" ]5 K/ }
2. 设计分析
: _2 B+ q6 \4 z* e( |6 ?& s' m: Z2 C1 ?3 c9 V: z! k
        由STM32F4xx数据手册可知,所采用的板子有TM2-TM5四个通用定时器,该设计中采用TIM3定时器(16位)。它具有输入捕获模式、输出比较模式、单脉冲模式等多种功能模式,其中,输入捕获模式可以设置捕获上升沿或下降沿对输入信号进行捕获,发生捕获事件时,当前计数值可被获得,如果已使能中断则可触发中断。本设计采用输入捕获模式对Echo信号进行捕获与计时。
2 Q5 Q: P8 i, M* G0 D5 g/ ]" j( K( f$ t5 s8 @4 G1 {) I
        根据HC-SR04数据手册得知,该超声波传感器射程为2cm-4m,代入距离公式中可得Thigh的范围大致为0.0235~ 0.0002857s,即1/Thigh的范围在42.5-8500Hz之间,故选择计数器时钟1MHz即可满足要求。
5 i: m3 z1 m- j: H# V# v) M% ?* b" c1 v, Z3 U2 P! t
3. 设计过程
9 p6 q  S1 t4 H+ B$ t7 g8 q" q+ _  A  z; z0 l7 P% f( |
1. 用 STM32CubeMX配置对应引脚生成项目代码。

( X( L5 {7 a% l: O5 _
: j  g( z  P* ]- U/ t8 z) c1)配置引脚. ~" V8 m1 c6 r: E

( L) v; R! V# o, _6 k在左端设置TIM3为内部时钟输入,并使能通道1,可以看到右边PA6变为绿色,在电路图中寻找PA6对应的外部引脚编号为D12,该引脚将连接超声波传感器的Echo引脚,为方便器件连接,选择D12相邻的外部引脚D11作为输出与Trig连接,故配置D11相应的引脚PA7为GPIO输出。引脚配置图与电路图见下方所示。1 \7 {7 O9 R/ Z8 [* J5 s& t
4 U; f9 G* y6 v0 n# e4 ]
Y9YR7T%0TVMC}D%Q3_)R.png
1 Q9 h8 C1 O- l) m

7 b! k! Y# f/ x+ U6 V) h
图1 引脚配置图
  C* N6 T8 X$ i% @
- }! _/ \1 l  ^
20190217202308989.png

8 q. S; F  I" M  _% ?0 K5 ?# o, @8 _! ?+ a
图2 引脚对应电路图
: l$ b1 W' r# o6 {" d1 x* g8 \$ @
2)配置计时器TIM3参数3 b8 @: y. S) T% n3 ?% o6 L3 }

- D* z# Z! Z) t$ `( r+ w* ]      板子没有焊外部晶振,故时钟源选用HIS,定时器时钟频率为16MHz。如下图所示。6 R5 t' i! `8 ^- j( u, ]0 z

( r* E+ B; |) w5 S" M+ X
NRH[L`QU(RG173NGTGWW{95.png
1 C$ x: T$ S% u& Z, r1 x
: n, e0 e  n+ }
图3 时钟配置图
. m! K/ X9 B8 V1 T9 T
         定时器TIM3参数配置如下图所示,预分频系数位15,即TIM3定时器最后频率为16 MHz/(15+1)=1MHz;最大计数值为0xffff(65535),并在NVIC中开启中断。
4 d7 i/ l- s- O: ]8 a% Y1 F8 M
) t! f( h, I0 m+ p
M8P9ZP[DS4UJ5{ULD%BKSU8.png

; m; x7 c! E/ l: ~: `# h2 b( ^; ~8 h7 Z# j$ K
图4 TIM3参数配置图
$ d  Z  B# q4 ^/ j
3)生成项目代码$ {1 ^' c( ~  w% F( O" {" A  w
: w2 J8 c6 i* z1 G$ q( D
2. 用Keil打开生成的项目代码,增加处理逻辑代码; s, c; ~% a( k" n' p/ G9 b" O

) S% C. k/ b  A' b' i$ x  }* l8 I+ B1)首先定义捕获次数capture_cnt,捕获计数值capture_value1,capture_value2,及高电平时间hightime与距离distance。3 G6 v8 l5 q/ A% z- I4 K

, D$ T5 L$ E! z3 B% T. t! r 20190217202538387.png 0 D: s/ C: @2 b9 k5 u8 @0 c

+ G% P/ g/ w- u3 `& d8 M7 q& p2)查看HAL库中关于TIM的函数,在主函数的while 中添加以下代码。根据捕获次数进行不同操作。当捕获次数为0时,使能TIM3中断模式的输入捕获,并设置其触发捕获方式为上升沿触发;当发送捕获时,进入捕获中断函数(其中中断函数为自动生成的,里面调用了触发回调函数,故可直接在回调函数中处理),在捕获回调函数中获取当前计数值赋给capture_value1,再更改捕获方式为下降沿触发;当再次发生捕获时,将当前计数值赋给capture_value2,然后停止输入捕获。在主函数中,根据capture_value1和capture_value2直接的差值即可得到时间,再代入距离公式便求得距离。, Z& d, b. U3 `! @9 W

7 b, F; o1 R0 v! o; H# i 8GPJ}CF@28BBOUS6[TW()GB.png & f) U; Q% {6 d5 j! U
$ i8 X" }5 z: r( F
Z11X]04YF3`P62[E8YYPBIP.png 1 {  J: \5 g0 c& Z8 \1 l  R
* g) F( J5 [9 i7 W
3)在主函数的while循环中打开串口接收,判断接收到的数据为00时,进行距离测量:给超声波模块的Trig引脚一个高电平。
* z. N. K" Q! f5 ~
4 n4 y& F8 x& f% V, P9 e" y1 X 20190217202636457.png
$ H' h/ L9 V$ Y* ?
( i3 e9 r. @! ]+ A% Q: i' t) b8 f+ ]  |4 ~% e9 A
收藏 评论0 发布时间:2022-5-12 19:10

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版