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

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

[复制链接]
STMCU小助手 发布时间:2022-5-12 19:10
1. 实验原理
- Y5 \6 \5 k3 |! J' a8 @( j2 x/ J: |# M1 Y
        超声波传感器采用的是HC-SR04,具有VCC、GND、Trig、Echo四个引脚,其使用方法为:将Trig 设置为高电平并保持至少10us,传感器将发出 8 个脉冲的声波。对于声波产生回声所需的整个时间内, Echo 为高电平。测量该高电平时间即可知经过的时间,则可计算障碍物的距离。
3 c( V% ?8 t. t- E9 \9 A( [" d' L6 K) u$ k% v  S! u- f9 H
         测量Echo 为高电平的时间是利用STM32的通用定时器进行输入捕获,测量得到的高电平时间通过公式:距离 =  Thigh *340/2 (m) ,其中Thigh 单位为秒(s), 340米/秒(m/s)为声速。% L- k( a* }+ S# Y

0 R4 j- {1 R2 ~1 t3 j6 {6 W5 X. E2. 设计分析
; S- @# K! l0 I# K- E1 T* P9 K3 X5 D- t$ J! J
        由STM32F4xx数据手册可知,所采用的板子有TM2-TM5四个通用定时器,该设计中采用TIM3定时器(16位)。它具有输入捕获模式、输出比较模式、单脉冲模式等多种功能模式,其中,输入捕获模式可以设置捕获上升沿或下降沿对输入信号进行捕获,发生捕获事件时,当前计数值可被获得,如果已使能中断则可触发中断。本设计采用输入捕获模式对Echo信号进行捕获与计时。
; c5 M/ T3 X' s# J* l
( g. B4 ^/ }. E5 ?1 ]) e9 g) t        根据HC-SR04数据手册得知,该超声波传感器射程为2cm-4m,代入距离公式中可得Thigh的范围大致为0.0235~ 0.0002857s,即1/Thigh的范围在42.5-8500Hz之间,故选择计数器时钟1MHz即可满足要求。+ }$ A( E% P5 o6 k

8 c" p7 T  e& t" O% n3. 设计过程! }, t; p# \4 a8 }
# Y" X+ y& k& P! |4 _+ K& u5 Y5 X
1. 用 STM32CubeMX配置对应引脚生成项目代码。
: g$ L) O+ F5 C# x8 h4 b0 }7 {4 D

9 m  v- F- r" w+ ^  _4 X1)配置引脚
2 `: R# |) d2 l0 E9 b( J/ n) u
7 D* l$ e. s, L* K# t/ S$ O/ X% q/ @在左端设置TIM3为内部时钟输入,并使能通道1,可以看到右边PA6变为绿色,在电路图中寻找PA6对应的外部引脚编号为D12,该引脚将连接超声波传感器的Echo引脚,为方便器件连接,选择D12相邻的外部引脚D11作为输出与Trig连接,故配置D11相应的引脚PA7为GPIO输出。引脚配置图与电路图见下方所示。
. K& B, `/ Y: n8 F: I. H3 {0 u# G' g9 f1 U: X
Y9YR7T%0TVMC}D%Q3_)R.png
6 g# g! a  ]$ ?; \+ q. _
- I$ D8 I- \: ^
图1 引脚配置图

! c- C1 {1 _. ^: j( Z
. S- a* u3 ?  o
20190217202308989.png

, o5 h* D4 ~; Z, l8 @" g
  X; M2 O3 m+ e; l8 u0 N5 p$ E
图2 引脚对应电路图

5 F8 B% E6 I$ |, m1 m/ O2)配置计时器TIM3参数7 g: {$ n) k7 f3 }  C

, t! T" O2 b$ B      板子没有焊外部晶振,故时钟源选用HIS,定时器时钟频率为16MHz。如下图所示。
" U& `6 s( d6 k2 v7 k2 Y* D# A' ?3 r, W) t% N) X: ?7 @
NRH[L`QU(RG173NGTGWW{95.png

" I' F, f# u6 t2 B3 v9 F; @0 z) }/ K) `6 T
图3 时钟配置图

& @: v- n$ [3 R         定时器TIM3参数配置如下图所示,预分频系数位15,即TIM3定时器最后频率为16 MHz/(15+1)=1MHz;最大计数值为0xffff(65535),并在NVIC中开启中断。 $ X5 B8 e0 k4 D: A9 V7 U+ k
8 n0 X  ]# I( e. A$ U$ v$ P/ j
M8P9ZP[DS4UJ5{ULD%BKSU8.png
: P9 Q( l% m4 R( a% ]1 Z& \) Q/ C0 }0 k
( u# r* k3 p0 o) h* @$ L6 }, F- e/ Z
图4 TIM3参数配置图

9 _  H, |7 v! X: A* ~3)生成项目代码# S- g5 U+ T* h4 U+ W& R2 z  m0 n
( `! D' j; N& l# w# ^
2. 用Keil打开生成的项目代码,增加处理逻辑代码
; L" N! D5 ]& G  C  _6 P
" y3 R; \' q* i( V8 @' Y1)首先定义捕获次数capture_cnt,捕获计数值capture_value1,capture_value2,及高电平时间hightime与距离distance。
4 Q7 b% z! e4 v# Z
& E& d2 X& x# c. w 20190217202538387.png
! U0 E- @) d; _- |' o" Y
' f+ N! {, v; b7 ]( ]& A2)查看HAL库中关于TIM的函数,在主函数的while 中添加以下代码。根据捕获次数进行不同操作。当捕获次数为0时,使能TIM3中断模式的输入捕获,并设置其触发捕获方式为上升沿触发;当发送捕获时,进入捕获中断函数(其中中断函数为自动生成的,里面调用了触发回调函数,故可直接在回调函数中处理),在捕获回调函数中获取当前计数值赋给capture_value1,再更改捕获方式为下降沿触发;当再次发生捕获时,将当前计数值赋给capture_value2,然后停止输入捕获。在主函数中,根据capture_value1和capture_value2直接的差值即可得到时间,再代入距离公式便求得距离。
% R$ b2 R$ Z1 |' {/ h+ }3 a
& S% U" K6 E. t- r3 _ 8GPJ}CF@28BBOUS6[TW()GB.png
  z( V: v, s! j) L' F
0 \' ^6 F. G) K' A: l Z11X]04YF3`P62[E8YYPBIP.png # W9 f7 `9 a3 w: \* f; Y1 X6 y

! q& l( n4 U- J% K: o 3)在主函数的while循环中打开串口接收,判断接收到的数据为00时,进行距离测量:给超声波模块的Trig引脚一个高电平。( B# C4 M- s9 ]5 `
; N0 }* k; U/ n* J! X3 K
20190217202636457.png
4 z0 s4 C, ^# q( w% _9 F( W; U$ ^5 b% n: r/ r# C
& W+ |! X! r0 r% T: v
赞 收藏 评论0 发布时间:2022-5-12 19:10

举报

0个回答

所属标签

相似技术帖

官网相关资源

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