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

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

[复制链接]
STMCU小助手 发布时间:2022-5-12 19:10
1. 实验原理
; b- W) y. g' p+ i% u4 s) i( c
* q8 o8 d5 E+ l        超声波传感器采用的是HC-SR04,具有VCC、GND、Trig、Echo四个引脚,其使用方法为:将Trig 设置为高电平并保持至少10us,传感器将发出 8 个脉冲的声波。对于声波产生回声所需的整个时间内, Echo 为高电平。测量该高电平时间即可知经过的时间,则可计算障碍物的距离。4 k: k' B3 H$ P0 t5 t$ g) o; g0 ^

$ m- ~8 k- s0 ]         测量Echo 为高电平的时间是利用STM32的通用定时器进行输入捕获,测量得到的高电平时间通过公式:距离 =  Thigh *340/2 (m) ,其中Thigh 单位为秒(s), 340米/秒(m/s)为声速。- R/ c3 r5 q9 u) G3 M

5 k6 `- c. l, l2 ~2. 设计分析( l& _. D0 H! J' M% i% x  U7 @

" b% S" Y" V# x" V1 @        由STM32F4xx数据手册可知,所采用的板子有TM2-TM5四个通用定时器,该设计中采用TIM3定时器(16位)。它具有输入捕获模式、输出比较模式、单脉冲模式等多种功能模式,其中,输入捕获模式可以设置捕获上升沿或下降沿对输入信号进行捕获,发生捕获事件时,当前计数值可被获得,如果已使能中断则可触发中断。本设计采用输入捕获模式对Echo信号进行捕获与计时。8 I, l9 o+ T& n; a  F% T& h: y

% M, m* k! F2 G' A        根据HC-SR04数据手册得知,该超声波传感器射程为2cm-4m,代入距离公式中可得Thigh的范围大致为0.0235~ 0.0002857s,即1/Thigh的范围在42.5-8500Hz之间,故选择计数器时钟1MHz即可满足要求。
( a# T% J3 P( v- x' S  n, M! M4 u! c0 ?5 r1 `" R/ Q
3. 设计过程
! _( M2 b, Y# V; N9 R. h2 T4 s, f; R. D% F: M5 c) t* H
1. 用 STM32CubeMX配置对应引脚生成项目代码。

) C8 F/ {7 V; N6 V* @. L- g  d- |  U0 ]% H* Y+ ~( n
1)配置引脚9 l$ }+ i" N3 n9 _* u( D
$ g( c2 q8 d; ^2 ^
在左端设置TIM3为内部时钟输入,并使能通道1,可以看到右边PA6变为绿色,在电路图中寻找PA6对应的外部引脚编号为D12,该引脚将连接超声波传感器的Echo引脚,为方便器件连接,选择D12相邻的外部引脚D11作为输出与Trig连接,故配置D11相应的引脚PA7为GPIO输出。引脚配置图与电路图见下方所示。% E! i7 r$ I9 V4 f, `

! \! `, n' u0 V, p# |' Y
Y9YR7T%0TVMC}D%Q3_)R.png

0 \1 i+ G$ Z# k% i1 z7 U8 Q: Q
% j3 |3 E+ s; a6 ~( p8 J# v) t  B
图1 引脚配置图
8 C5 t8 r; F7 {( C, k# \2 H) K; t

2 P, @! h' A5 U+ u
20190217202308989.png

" |+ A& b: r1 T9 i6 E( m1 a, Q8 A5 ?
图2 引脚对应电路图
! e3 B2 g. H  P' M/ J
2)配置计时器TIM3参数" U1 d) A8 g1 B# g9 O/ ~) g
  Z# t9 ^8 C: m9 ]3 C
      板子没有焊外部晶振,故时钟源选用HIS,定时器时钟频率为16MHz。如下图所示。9 |) v, }5 l9 k7 V2 F
) s+ R4 E* u  k3 p9 r
NRH[L`QU(RG173NGTGWW{95.png

; M5 H! m7 b) S# x/ ?+ J
7 I8 q9 R! ~& N7 W  V1 ]' {
图3 时钟配置图

% q! |: Z- a+ t8 u- p" ?$ R         定时器TIM3参数配置如下图所示,预分频系数位15,即TIM3定时器最后频率为16 MHz/(15+1)=1MHz;最大计数值为0xffff(65535),并在NVIC中开启中断。 8 @* O! [  a' l  a) |; f) j

6 @) M: b8 v; e6 D# P- a
M8P9ZP[DS4UJ5{ULD%BKSU8.png
  d. r/ |* ^" k% d2 n

. \3 y! {% u) H1 ~
图4 TIM3参数配置图

) t- ~1 a# p, y& o5 P3)生成项目代码& L% L# I# {3 |& @$ b

# u7 z" v4 b8 a8 e2. 用Keil打开生成的项目代码,增加处理逻辑代码' A, m4 @1 G+ u6 ~
) A+ R6 [/ O. C
1)首先定义捕获次数capture_cnt,捕获计数值capture_value1,capture_value2,及高电平时间hightime与距离distance。
* h& N% w- @+ d/ V# c, i8 e) O9 C! o# D2 h
20190217202538387.png 9 i7 B* `# i. T

6 }8 X% q) @/ O4 b' y+ ]2)查看HAL库中关于TIM的函数,在主函数的while 中添加以下代码。根据捕获次数进行不同操作。当捕获次数为0时,使能TIM3中断模式的输入捕获,并设置其触发捕获方式为上升沿触发;当发送捕获时,进入捕获中断函数(其中中断函数为自动生成的,里面调用了触发回调函数,故可直接在回调函数中处理),在捕获回调函数中获取当前计数值赋给capture_value1,再更改捕获方式为下降沿触发;当再次发生捕获时,将当前计数值赋给capture_value2,然后停止输入捕获。在主函数中,根据capture_value1和capture_value2直接的差值即可得到时间,再代入距离公式便求得距离。/ T; i! [# u( Q' w

4 \5 {: Y( p+ K; g# C 8GPJ}CF@28BBOUS6[TW()GB.png
# s  o  |9 V- V- Q8 k* e% u
& m& l- u  U" A% J: |8 w Z11X]04YF3`P62[E8YYPBIP.png ; ]& C9 z: ]4 t$ f; h& ^8 Y0 k% C

; J3 H! t$ v5 K& y% i9 a# A 3)在主函数的while循环中打开串口接收,判断接收到的数据为00时,进行距离测量:给超声波模块的Trig引脚一个高电平。
5 w  Q! ~2 U$ s6 u, d4 p
* w+ w) A6 `2 X0 z) V* f5 h, z2 I 20190217202636457.png
  L! d  f# K( K/ D# c$ @1 \) E+ _8 K  Q
# t4 r: e. x* i# m7 K% D9 i3 ^
% T% N/ _( e6 a/ q: q8 a
收藏 评论0 发布时间:2022-5-12 19:10

举报

0个回答

所属标签

相似分享

官网相关资源

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