STM32超声波模块(HC-SR04\US015)测试程序-HAL库函数
STM32F103系列单片机HAL库的超声波模块测试程序
原理:
声波遇到障碍物会反射,而声波的速度已知,所以只需要知道发射到接收的时间差,就能轻松计算出测量距离,再结合发射器和接收器的距离,就能算出障碍物的实际距离。
超声波原理图
以HC-SR04硬件为例,端口为VCC、Trig、Echo、GND。
- VCC–接STM32板子+5V;
- GND–接STM32板子GND;
- Trig–为触发控制信号输入,触发测距,给至少10us的高电平信号,模块自动发射8个40KHz的方波,自动检测是否有信号返回;
- Echo–回响信号输出,有信号返回,通过IO口ECHO输出一个高电平,高电平持续时间就是超声波从发射到返回的时间。
那用STM32怎么给端口信号呢?又是怎么获取信号呢?
Trig端口为超声波模块的输入信号,也就是通过STM23一个端口推挽输出一个至少10us的高电平信号即可,利用delay_ms(20)实现;
Echo端口为超声波模块的输出信号,也就是利用STM32端口捕获高电平时间,那么这个端口肯定是可以用做定时器的端口。
通过以上分析,这里采用以下STM32端口
超声波模块硬件连接图
定时器捕获原理:arr为自动重装载值,psc为时钟预分频数
当捕获不满一个时长的原理图
当捕获超过一个时长的原理图
部分程序
Trig程序
void Trig_Init(void)
{GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟GPIO_Initure. Pin=GPIO_PIN_0;//PA8GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出GPIO_Initure.Pull=GPIO_PULLDOWN; //下拉GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);HAL_GPIO_Init(GPIOA,&GPIO_Initure);}void CHL_capture(void)
{ TRIG1=1;delay_us(20);TRIG1=0;
}
Echo程序
#include "us015timer.h"
#include "led.h"
// PA1---Echo TIM2 CH2 //TIM2 捕获初始化
TIM_HandleTypeDef TIMx_Handler; //定时器3句柄//定时器2通道1输入捕获配置
//arr:自动重装值(TIM2是16位的!!)
//psc:时钟预分频数
void TIM2_CHx_Cap_Init(u32 arr,u16 psc)
{ TIM_IC_InitTypeDef TIMx_CHyConfig; TIMx_Handler.Instance=TIM2; //通用定时器2TIMx_Handler.Init.Prescaler=psc; //分频系数TIMx_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器TIMx_Handler.Init.Period=arr; //自动装载值TIMx_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子TIMx_Handler.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;//使能自动重载HAL_TIM_IC_Init(&TIMx_Handler); //初始化输入捕获时基参数TIMx_CHyConfig.ICPolarity=TIM_ICPOLARITY_RISING; //上升沿捕获TIMx_CHyConfig.ICSelection=TIM_ICSELECTION_DIRECTTI;//映射到TI1上TIMx_CHyConfig.ICPrescaler=TIM_ICPSC_DIV1; //配置输入分频,不分频TIMx_CHyConfig.ICFilter=0; //配置输入滤波器,不滤波HAL_TIM_IC_ConfigChannel(&TIMx_Handler,&TIMx_CHyConfig,TIM_CHANNEL_2);//配置TIM3通道3HAL_TIM_IC_Start_IT(&TIMx_Handler,TIM_CHANNEL_2); //开启TIM2的捕获通道2,并且开启捕获中断__HAL_TIM_ENABLE_IT(&TIMx_Handler,TIM_IT_UPDATE); //使能更新中断HAL_NVIC_SetPriority(TIM2_IRQn,2,0); //设置中断优先级,抢占优先级2,子优先级0HAL_NVIC_EnableIRQ(TIM2_IRQn); //开启ITM2中断通道
}//定时器2底层驱动,时钟使能,引脚配置
//此函数会被HAL_TIM_IC_Init()调用
//htim:定时器2句柄
void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim)
{GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_TIM2_CLK_ENABLE(); //使能TIM2时钟__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟GPIO_Initure.Pin=GPIO_PIN_1; //PA1GPIO_Initure.Mode=GPIO_MODE_AF_INPUT; //复用推挽输入GPIO_Initure.Pull=GPIO_PULLDOWN; //下拉GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速HAL_GPIO_Init(GPIOA,&GPIO_Initure);HAL_NVIC_SetPriority(TIM2_IRQn,2,0); //设置中断优先级,抢占优先级2,子优先级0HAL_NVIC_EnableIRQ(TIM2_IRQn); //开启ITM2中断通道
}//捕获状态
//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到低电平;1,已经捕获到低电平了.
//[5:0]:捕获低电平后溢出的次数
u8 TIM2CH2_CAPTURE_STA=0; //输入捕获状态
u16 TIM2CH2_CAPTURE_VAL; //输入捕获值(TIM2是16位)//定时器2中断服务函数
void TIM2_IRQHandler(void)
{HAL_TIM_IRQHandler(&TIMx_Handler); //定时器共用处理函数
}//定时器更新中断(计数溢出)中断处理回调函数, 该函数在HAL_TIM_IRQHandler中会被调用,实现多个计数器满装载的计数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//更新中断(溢出)发生时执行
{if((TIM2CH2_CAPTURE_STA&0X80)==0) //还未成功捕获上升沿{if(TIM2CH2_CAPTURE_STA&0X40) //已经捕获到高电平了{if((TIM2CH2_CAPTURE_STA&0X3F)==0X3F) //高电平太长了{TIM2CH2_CAPTURE_STA|=0X80; //标记成功捕获了一次TIM2CH2_CAPTURE_VAL=0XFFFF;}else TIM2CH2_CAPTURE_STA++;} }
}//定时器输入捕获中断处理回调函数,该函数在HAL_TIM_IRQHandler中会被调用
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//捕获中断发生时执行
{if((TIM2CH2_CAPTURE_STA&0X80)==0) //还未成功捕获{if(TIM2CH2_CAPTURE_STA&0X40) //捕获到一个下降沿 { TIM2CH2_CAPTURE_STA|=0X80; //标记成功捕获到一次高电平脉宽TIM2CH2_CAPTURE_VAL=HAL_TIM_ReadCapturedValue(&TIMx_Handler,TIM_CHANNEL_2);//获取当前的捕获值.TIM_RESET_CAPTUREPOLARITY(&TIMx_Handler,TIM_CHANNEL_2); //一定要先清除原来的设置!!TIM_SET_CAPTUREPOLARITY(&TIMx_Handler,TIM_CHANNEL_2,TIM_ICPOLARITY_RISING);//配置TIM2通道2上升沿捕获}else //还未开始,第一次捕获上升沿{TIM2CH2_CAPTURE_STA=0; //清空TIM2CH2_CAPTURE_VAL=0;TIM2CH2_CAPTURE_STA|=0X40; //标记捕获到了上升沿__HAL_TIM_DISABLE(&TIMx_Handler); //关闭定时器2__HAL_TIM_SET_COUNTER(&TIMx_Handler,0);TIM_RESET_CAPTUREPOLARITY(&TIMx_Handler,TIM_CHANNEL_2); //一定要先清除原来的设置!!TIM_SET_CAPTUREPOLARITY(&TIMx_Handler,TIM_CHANNEL_2,TIM_ICPOLARITY_FALLING);//定时器2通道2设置为下降沿捕获__HAL_TIM_ENABLE(&TIMx_Handler); //使能定时器2} }
}
主函数
int main()
{HAL_Init(); //初始化HAL库 Stm32_Clock_Init(RCC_PLL_MUL9); //设置时钟,72Mdelay_init(72); //初始化延时函数uart_init(9600); //初始化串口LED_Init(); //初始化LED Trig_Init();TIM2_CHx_Cap_Init(0xffff,7200-1);float len=0;u32 time=0; while(1){ u8 count=0;delay_ms(10);CHL_capture(); //PAout(0)if(TIM2CH2_CAPTURE_STA&0X80) //成功捕获到了一次高电平{time=TIM2CH2_CAPTURE_STA&0X3F; time*=65536; //溢出时间总和time+=TIM2CH2_CAPTURE_VAL; //得到总的高电平时间len=time*1.7;if(len<20)LED0=0;else LED0=1;TIM2CH2_CAPTURE_STA=0; //开启下一次捕获}printf("LENGHT:%f CM\r\n",len); //打印平均距离}}
程序下载链接(https://download.csdn.net/download/qq_42258981/12141380)
STM32超声波模块(HC-SR04\US015)测试程序-HAL库函数相关推荐
- STM32超声波模块测距串口输出/通用定时器中断并输出PWM控制舵机/系统定时器延时
参考:stm32 超声波模块 原理 实现测距 +舵机使用 作者:点灯小哥 发布时间: 2021-03-10 19:37:16 网址:https://blog.csdn.net/weixin_46016 ...
- HC-SR04超声波模块的使用(stm32f103c8t6/HAL)(超详细)
系列文章目录(STM32常用外设/HAL库版) 一.HC-SR04超声波模块的使用(本篇) 二.OLED的HAL库代码介绍及使用 三.编码电机以及双电机驱动 本文主要介绍超声波模块HC-SR04的两种 ...
- STM32超声波模块实验(定时器实现)
实验材料准备 1个HC-SR04超声波模块 1台STM32F103ZET6开发板 若干杜邦线 HC-SR04模块简介 STM32定时器设置 实验中接收发送信号都用定时器,方便管理 上表在<STM ...
- STM32——超声波模块
模块介绍 超声波模块一般使用的都是HC-SR04来进行测距 1)产品特点 HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能,测 距精度可达高到的非接触式距离感测功能,测 ...
- STM32 超声波模块测距
目录 HC-SR04模块 HC-SR04超声波测距模块工作原理 HC-SR04超声波模块的时序触发图 思路步骤 代码 实验结果 总结 HC-SR04模块 HC-SR04超声波测距模块工作原理 (1)采 ...
- 13.STM32超声波模块讲解与实战
目录 1.超声波模块讲解 2.超声波时序图 3.超声波测距步骤 4.项目实战 1.超声波模块讲解 超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接收.电路板上有4个引脚:VCC G ...
- stm32单片机屏幕一直闪_STM32使用HAL库函数点亮OLED
OLED屏幕应用十分广泛,我们可以使用STM32单片机对其进行控制,使其显示我们需要的各种数字.字母.汉字.图画等.我们此次使用下图这款非常普遍的0.96寸OLED液晶屏.此款OLED屏采用IIC的通 ...
- hc sr04流程图_超声波传感器HC-SR04完整应用以及程序讲解
带有Arduino的超声波传感器HC-SR04完整应用指南 本文是有关流行的超声波传感器HC – SR04的应用指南.我们将解释其工作原理,向您展示其某些功能,并分享一个您可以遵循的Arduino项目 ...
- stm32蓝牙模块和超声波测距模块
蓝牙 蓝牙概念 蓝牙技术是一种无线数据和语音通信开放的全球规范,它是基于低成本的近距离无线连接,为固定和移动设备建立通信环境的一种特殊的近距离无线技术连接. [1] 蓝牙使当前的一些便携移动设备和计算 ...
最新文章
- EditPlus 中添加 Win32 ASM 语法支持
- Android 界面滑动实现---Scroller类 从源码和开发文档中学习(让你的布局动起来)...
- STM32 基础系列教程 28 - USB_DFU
- 福建省计算机应用考试成绩,福建省高等学校非计算机专业学生计算机应用水平等级考试成绩查询...
- rhel6系统中,mysql 5.6复制新特性下主从复制配置[基于GTID]
- 拦截聊天记录--Hook技巧简介【原创】
- Java 的日子屈指可数,这是真的吗?
- TF2 keras Tensoboard学习总结
- net空间一次购买终身使用_net域名与org域名哪个投资价值更高?
- [Vue进阶]为什么我的代码让别人看起来头皮发麻?
- DbVisualizer配置神通数据库驱动
- meanshift算法通俗讲解
- Label Consistent Matrix Factorization Hashingfor Large-Scale Cross-Modal Similarity Search(LC)--文献翻译
- matlab病毒模拟传播
- ZT 内地20年经典电视剧大全
- Win7系统中wmiprvse.exe占用CPU高如何解决
- SpringBoot整合Logback日志框架+Slf4j注解使用
- tuxedo错误码6_TUXEDO错误解析
- android 弹出窗口
- CUMT学习日记——计算机组成原理之面向考题复习