STM32通过定时器捕获的方法驱动(HC-SR04)超声波测距模块
HC-SR04 超声波测距模块
超声波测距原理及方法一
方法二:
在向Trig控制端发送触发信号后,通过定时器的输入捕获引脚抓取到Echo引脚上升沿,开启定时器计时直到Echo变为低电平,关闭定时器记录下计时时间,通过公式计算具体的距离。
程序:
定时器初始化:
tim.c
#include "tim.h"
#include "delay.h"
#include "Printf.h"/*2020.11.16*///通用定时器 5 初始化
void TIM5_Int_Init(u16 arr,u16 psc)
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM5_ICInitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能 TIM5 时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能 GPIOA 时钟//初始化 GPIOA.0 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0 设置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入 //回波接收ECHO端口GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.0GPIO_ResetBits(GPIOA,GPIO_Pin_0); //PA0 下拉//初始化 TIM5 参数TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频器TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数模式//TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //初始化 TIMx//初始化 TIM5 输入捕获通道 1TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择输入端 IC1 映射到 TI1 上TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到 TI1 上TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频TIM5_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 配置输入滤波器 不滤波TIM_ICInit(TIM5, &TIM5_ICInitStructure); //初始化 TIM5 输入捕获通道 1//初始化 NVIC 中断优先级分组NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; //TIM5 中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级 2 级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级 0 级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能NVIC_Init(&NVIC_InitStructure); //初始化 NVICTIM_ITConfig( TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断捕获中断//TIM_SetCounter(TIM5,0); //设置计数器初值TIM_Cmd(TIM5,ENABLE ); //使能定时器 5}u8 TIM5CH1_CAPTURE_STA=0; //输入捕获状态
u16 TIM5CH1_CAPTURE_VAL; //输入捕获值//定时器 5 中断服务程序
void TIM5_IRQHandler(void)
{if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获{if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET){if(TIM5CH1_CAPTURE_STA&0X40) //已经捕获到高电平了{if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了{TIM5CH1_CAPTURE_STA|=0X80; //标记成功捕获了一次TIM5CH1_CAPTURE_VAL=0XFFFF;}else TIM5CH1_CAPTURE_STA++;}}if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET) //捕获 1 发生捕获事件{if(TIM5CH1_CAPTURE_STA&0X40) //捕获到一个下降沿{TIM5CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次上升沿TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //设置为上升沿捕获}else //还未开始,第一次捕获上升沿{TIM5CH1_CAPTURE_STA=0; //清空TIM5CH1_CAPTURE_VAL=0;TIM_SetCounter(TIM5,0);TIM5CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //设置为下降沿捕获}}}TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位}
tim.h
#include "sys.h"//通用定时器 5 初始化
void TIM5_Int_Init(u16 arr,u16 psc);
超声波引脚配置
hc-sr04.c
#include "hc-sr04.h"
#include "tim.h"
#include "delay.h"
#include "Printf.h"/*2020.11.16
* HC-SR04超声波测距模块
* 基本工作原理:* 给TRIG引脚至少10us的高电平信号触发测距* 模块自动发送8个40KHz的方波,自动检测是否有信号返回* 有信号返回,通过Echo引脚输出一个高电平,高电平的持续时间就是超声波从发射到返回的时间* 测量距离 = (高电平的持续时间 * 声速(340m/s))/ 2
*/#define HC_SR04_TRIG_CLK RCC_APB2Periph_GPIOA //脉冲触发TRIG端口
#define HC_SR04_TRIG_PORT GPIOA
#define HC_SR04_TRIG_PIN GPIO_Pin_4//HC_SR04超声波初始化
void HC_SR04_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(HC_SR04_TRIG_CLK, ENABLE); //使能PA端口时钟GPIO_InitStructure.GPIO_Pin = HC_SR04_TRIG_PIN; // 脉冲触发端口(Trig)配置PA4GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHzGPIO_Init(HC_SR04_TRIG_PORT, &GPIO_InitStructure); //根据设定参数初始化端口}//发送20us的脉冲触发信号
void HC_SR04_start(void)
{GPIO_SetBits(HC_SR04_TRIG_PORT,HC_SR04_TRIG_PIN); //TRIG置高delay_us(20);GPIO_ResetBits(HC_SR04_TRIG_PORT,HC_SR04_TRIG_PIN); //TRIG置低delay_ms(10);
}
hc-sr04.h
#include "sys.h"//HC_SR04超声波初始化
void HC_SR04_Init(void);
//发送20us的脉冲触发信号
void HC_SR04_start(void);
主函数;
main.c
#include "sys.h"
#include "delay.h"
#include "hc-sr04.h"
#include "usart.h"
#include "Printf.h"
#include "tim.h"extern u8 TIM5CH1_CAPTURE_STA; //输入捕获状态
extern u16 TIM5CH1_CAPTURE_VAL; //输入捕获值int main(void)
{ float Distance=0;RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //系统时钟设置PLL作为系统时钟delay_init(); //初始化延时函数uart_init(9600);HC_SR04_Init();TIM5_Int_Init(65535,71);printf("开始测量距离\r\n");/*在发送触发信号后,通过定时器的输入捕获引脚抓取Echo引脚上升沿,开启定时器计时直到Echo变为低电平,关闭定时器记录下计时时间*/while(1){HC_SR04_start(); //发送20us的脉冲触发信号if(TIM5CH1_CAPTURE_STA&0X80)//成功捕获到了一次高电平{Distance=TIM5CH1_CAPTURE_STA&0X3F;Distance*=65536; //溢出时间总和Distance += TIM5CH1_CAPTURE_VAL; //得到总的高电平时间 ECHO输出的高电平的时间就是超声波从发射到返回的时间Distance = Distance *170*0.0001; printf("测的距离 = %0.4f cm \r\n",Distance);TIM5CH1_CAPTURE_STA=0; //开启下一次捕获} delay_ms(500);}}
STM32通过定时器捕获的方法驱动(HC-SR04)超声波测距模块相关推荐
- STM32—驱动HC-SR04超声波测距模块
文章目录 超声波测距原理 HC-SR04工作原理 STM32实现驱动 1.引脚的配置 2.时序控制 3.时间差测量 4.如何将距离测出来 超声波测距原理 利用HC-SR04超声波测距模块可以实现比较精 ...
- HC-SR04超声波测距模块使用方法和例程(STM32)
基于STM32和HC-SR04模块实现超声波测距功能 最近在学STM32做个简单的应用实践一下,顺便水一篇文章. 本文用的单片机是STM32F103C8T6,超声波测距模块是HC-SR04,显示测距结 ...
- STM32单片机基于HAL库开发HC-SR04 超声波测距模块(终极版)
参考: 某宝HC-SR04 超声波测距模块商品详情页 STM32L051C8T6 HAL库 输入捕获进行超声波测距 案例 STM32CubeMX学习笔记3--TIM2输入捕获(SR-04测距) cub ...
- 学习并使用HC-SR04超声波测距模块+STM32
** 超声波测距原理 ** 参考博客: https://blog.csdn.net/qq_40734815/article/details/105992801 https://blog.csdn.ne ...
- STM32蓝牙控制循迹避障小车源代码——3.舵机、超声波测距模块
STM32蓝牙控制循迹避障小车源代码--3.舵机.超声波测距模块 注意-所需模块: US-015超声波模块 SG90舵机云台 接线:舵机超声波: A1–P2.7 B8–Trig B9–Echo 代码 ...
- stm32控制超声波测距模块HC-SR04
引脚:PB15 TRIG,PB0 ECHO: 不同距离,LED对应不良.闪烁.亮状态,并通过串口发送到PC; TIM3定时中断,测出脉宽长度,没有像野火一样使用捕捉功能: 1.HS-SR04模块实物图 ...
- STM32智能小车------超声波测距模块
文章目录 一.原理讲解 1.实物图 2.工作原理: 3.接线: 二.软件驱动代码 1.接口定义 2.驱动函数 总结 最终效果 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的普通大学生. 进 ...
- stm32蓝牙模块和超声波测距模块
蓝牙 蓝牙概念 蓝牙技术是一种无线数据和语音通信开放的全球规范,它是基于低成本的近距离无线连接,为固定和移动设备建立通信环境的一种特殊的近距离无线技术连接. [1] 蓝牙使当前的一些便携移动设备和计算 ...
- STM32——超声波测距模块(HAL库CubeMx)
超声波测距 1. 超声波测距模块原理 2. CubeMx配置 3. 代码的编写 3.1 定时器计时的计算 3.2 接口函数 1. 超声波测距模块原理 (2021/11/28 16:25编辑) 超声波测 ...
- hc sr04流程图_超声波测距模块工作原理_HC-SR04模块详解
超声波测距模块有好多种类型,目前比较常用的有URM37超声波传感器默认是232接口,可以调为TTL接口,URM05大功率超声波传感器测试距离能到10米,算是目前来说测试距离比较远的一款了,另外还有比较 ...
最新文章
- JUC里面的相关分类|| java并发编程中,关于锁的实现方式有两种synchronized ,Lock || Lock——ReentrantLock||AQS(抽象队列同步器)
- Android MVP模式的初识
- 北京大学计算机系 丁主任,丁骋、李时新参加第七届新闻史论青年论坛暨北京大学新闻学研究会年会...
- diskfileitemfactory 需要的包_《开心枕和生气包》中班下学期社会教案
- python 调用C语言DLL的方法
- gdb 命令_16. 如何使用 GDB 调试 Go 程序?
- oracle 并行之二: parallel dml
- 切!原来进入500强就那么简单啊——前IBM,HP,Dell员工揭开外企的招聘内幕
- 声纹技术(七):声纹技术的未来
- XSS插入绕过一些方式总结
- python语音识别分析_Python语音识别(计算器)
- 量子计算与量子信息之量子力学引论(一)
- Android 面试必备 - 系统、App、Activity 启动过程
- C - 有符号数和无符号数扩展
- Office课程习题
- hadoop ha搭建 namenode格式化失败等错误
- arduino声音传感器与二极管_如何将声音传感器与Arduino连接 并实现继电器控制项目...
- 基于osp平台和Echarts的折线图案例
- fiddler 抓ios app包
- 无线控制器与无线AP