1. 实验原理
超声波传感器采用的是HC-SR04,具有VCC、GND、Trig、Echo四个引脚,其使用方法为:将Trig 设置为高电平并保持至少10us,传感器将发出 8 个脉冲的声波。对于声波产生回声所需的整个时间内, Echo 为高电平。测量该高电平时间即可知经过的时间,则可计算障碍物的距离。
测量Echo 为高电平的时间是利用STM32的通用定时器进行输入捕获,测量得到的高电平时间通过公式:距离 = Thigh *340/2 (m) ,其中Thigh 单位为秒(s), 340米/秒(m/s)为声速。
2. 设计分析
由STM32F4xx数据手册可知,所采用的板子有TM2-TM5四个通用定时器,该设计中采用TIM3定时器(16位)。它具有输入捕获模式、输出比较模式、单脉冲模式等多种功能模式,其中,输入捕获模式可以设置捕获上升沿或下降沿对输入信号进行捕获,发生捕获事件时,当前计数值可被获得,如果已使能中断则可触发中断。本设计采用输入捕获模式对Echo信号进行捕获与计时。
根据HC-SR04数据手册得知,该超声波传感器射程为2cm-4m,代入距离公式中可得Thigh的范围大致为0.0235~ 0.0002857s,即1/Thigh的范围在42.5-8500Hz之间,故选择计数器时钟1MHz即可满足要求。
3. 设计过程
1. 用 STM32CubeMX配置对应引脚生成项目代码。
1)配置引脚
在左端设置TIM3为内部时钟输入,并使能通道1,可以看到右边PA6变为绿色,在电路图中寻找PA6对应的外部引脚编号为D12,该引脚将连接超声波传感器的Echo引脚,为方便器件连接,选择D12相邻的外部引脚D11作为输出与Trig连接,故配置D11相应的引脚PA7为GPIO输出。引脚配置图与电路图见下方所示。
图1 引脚配置图
图2 引脚对应电路图
2)配置计时器TIM3参数
板子没有焊外部晶振,故时钟源选用HIS,定时器时钟频率为16MHz。如下图所示。
图3 时钟配置图
定时器TIM3参数配置如下图所示,预分频系数位15,即TIM3定时器最后频率为16 MHz/(15+1)=1MHz;最大计数值为0xffff(65535),并在NVIC中开启中断。
图4 TIM3参数配置图
3)生成项目代码
2. 用Keil打开生成的项目代码,增加处理逻辑代码
1)首先定义捕获次数capture_cnt,捕获计数值capture_value1,capture_value2,及高电平时间hightime与距离distance。
2)查看HAL库中关于TIM的函数,在主函数的while 中添加以下代码。根据捕获次数进行不同操作。当捕获次数为0时,使能TIM3中断模式的输入捕获,并设置其触发捕获方式为上升沿触发;当发送捕获时,进入捕获中断函数(其中中断函数为自动生成的,里面调用了触发回调函数,故可直接在回调函数中处理),在捕获回调函数中获取当前计数值赋给capture_value1,再更改捕获方式为下降沿触发;当再次发生捕获时,将当前计数值赋给capture_value2,然后停止输入捕获。在主函数中,根据capture_value1和capture_value2直接的差值即可得到时间,再代入距离公式便求得距离。
3)在主函数的while循环中打开串口接收,判断接收到的数据为00时,进行距离测量:给超声波模块的Trig引脚一个高电平。
关键字:STM32 超声波传感器 测距
引用地址:
基于STM32的超声波传感器测距(含代码)
推荐阅读最新更新时间:2024-11-01 09:45
对STM32的NVIC_PriorityGroupConfig使用及优先级分组方式理解
STM32有43个channel的settable的中断源;AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先级的4 bits。这4个bits用于分配preemption优先级和sub优先级,在STM32的固件库中定义如下 /* Preemption Priority Group -------------------------------------------------*/ #define NVIC_PriorityGroup_0 ((u32)0x700) /* 0 bits for pre-emption priority
[单片机]
STM32定时器之控制LED灯循环显示
/* 名称:STM32定时器之控制LED灯循环显示 说明:对于STM32来说,其定时器要比C51的定时器要多,功能也更复杂。 就数目来说来说,STM32的定时器可以分为基本定时器,通用定时器和高级定时器(还包括Systick、看门口定时器和窗口定时器)。就STM32F103,一般来说,它有2个高级定时器TIM1和TIM8、4个通用定时器TIM2/3/4/5、2个基本定时器TIM6和TIM7。而C51一般只有几个定时器。 就功能来说, STM32中: 对于基本定时器,其功能就是和C51差不多,只有定时功能。 对于通用定时器,它的功能有定时、输出比较、输入捕获。虽然目前,我也不知道后面两个功能是干啥的。 对于高级定
[单片机]
STM32通过调用库函数进行编程
1、调用库函数编程和直接配置寄存器编程的区别: 2、CMSIS标准: 3、STM32库函数的组织: 4、程序例举: 调用库函数实现通过USART发送数据(26个大写的英文字母) 首先:在主函数部分先要(调用自己编写的函数)对USART要用到的I/O端口进行配置、打开系统时钟配置和对USART1进行参数配置 下图是通过调用库函数对USART1的参数进行配置,将其配置成异步收发模式、波特率用户可以自定的串口: /**************************************************************************************
[单片机]
STM32串口中断使用
简介:STM32串口中断使用:配置串口时钟在void Rcc_Configuration(void)函数中实现,配置串口管脚在void UsartGPIO_Configuration(void)中实现;初始化参数设置串口中断配置。 以提高CPU的利用率。在程序中处理流程如下: 一:串口初始化 1.配置串口时钟 在void Rcc_Configuration(void)函数中实现 1.void Rcc_Configuration(void) 1.{ 2. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE); 3.
[单片机]
【STM32】串口相关配置寄存器、库函数(UART一般步骤)
STM32F1xx官方资料: 《STM32中文参考手册V10》-第25章通用同步异步收发器(USART) 串口相关配置寄存器 状态寄存器(USART_SR) 状态寄存器适用于检测串口此时所处的状态。它能够检测到的状态有:发送寄存器空位、发送完成位、读数据寄存器非空位、检测到主线空闲位、过载错误为等等。 这边主要关注两个位:RXNE和TC(第5、6两位)。 RXNE(读数据寄存器非空):当该位被置1的时候,就是提示已经有数据被接收到了,并且可以读出来了(即RDR移位寄存器中的数据被转移到USART_DR寄存器中)。这时候要做的就是尽快读取USART_DR,从而将该位清零,也可以向该位写0,直接清除。
[单片机]
一种基于ZigBee和STM32的室内智能照明系统的设计
在人们的传统意识中,照明系统仅以照明为目的。传统的照明系统中主要的控制方式有手动控制方式和自动控制方式。其中手动控制方式简单、有效,但是过于依赖人工操作,并且控制相对分散,不能有效管理;自动控制方式主要是由时钟元件、光电元件或两者组合的方式来实现对照明设备的控制,这种控制方式减少了对人员的依赖性,管理相对集中,实现了照明控制的自动化,但却不能对照明系统进行调光控制。 此外,随着生活水平的不断提高,人们对日常生活的无线化、网络化、智能化、节能化的需求越来越强烈,以上两种传统的照明控制系统已经无法满足人们对日常生活品质的需求。基于上述原因提出了一种基于ZigBee和STM32的室内智能照明系统的设计。 1 系统总体
[单片机]
Stm32 基于蓝牙的串口通信 详细篇
1. HC-05蓝牙 1.1蓝牙模块使用介绍 蓝牙HC05是主从一体的蓝牙串口模块,简单的说,当蓝牙设备与蓝牙设备配对连接成功后,我们可以忽视蓝牙内部的通信协议,直接将将蓝牙当做串口用。当建立连接,两设备共同使用一通道也就是同一个串口,一个设备发送数据到通道中,另外一个设备便可以接收通道中的数据。 1.2蓝牙模块使用注意 hc-05支持从4800bps~1382400bps间的标准波特率,使用时波特率一定要匹配,vcc接3.3 或者 5V GND 接GND TX接单片机上的RX RX接TX。 2.Stm32F1串口通信 2.1串口通信介绍 STM32F103ZET6 最多可提供 5 路串口, 2.2串口通信算法思路
[单片机]
浅谈STM32定时器的输入捕获功能
STM32系列是ST公司基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核的32位单片机。按内核架构分为不同产品: 其中STM32F系列有:STM32F103增强型系列、STM32F101基本型系列、STM32F105、STM32F107互联型系列 增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是32位产品用户的最佳选择。 输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32的定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能。STM32的输入捕获,简单的说就是通过检测TIMx_CHx上
[单片机]