STM32L051C8T6 HAL库 输入捕获进行超声波测距 案例
目录
概述
1、MCU主控:
2、超声波模块:
3、输入捕获简介
4、STM32CubeMx 配置
1)、系统时钟配置
2)、定时器22配置
3)、串口1配置
5、代码说明:
1)、tim.c文件
2)、usart.c文件
3)、main.c文件
6、串口助手打印运行结果
7、传送门->代码链接
概述
下面是讲解使用ST MCU中的HAL库来实现,测距的功能。
1、MCU主控:
STM32L051C8T6
2、超声波模块:
RCWL-1601
基本工作原理:
1、采用IO口TRIG触发测距,给至少10us的高电平信号;
2、模块自动发送8个40khz的方波,自动检测是否有信号返回;
3、有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;
本模块使用方法简单,一个控制口发一个10US以上的高电平,就可以在接收口等待高电平输出.一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,即可以得到你移动测量的值。超声波模块时序图如下:
3、输入捕获简介
输入捕获可以用来测量脉冲宽度或者测量频率。超声波用到的是测量脉宽,这里我以测量脉宽为例,用一个简图来说明输入捕获的原理,如下图:
如上图所示,就是输入捕获测量高电平脉宽的原理,假定定时器工作在向上计数模式,图中t1-t2时间,就是我们需要测量的高电平时间。测量方法如下:首先设置定时器通道x为上升沿捕获,这样,t1时刻就会捕捉到CNT值,然后立即清零CNT,并设置通道x为下降沿捕获,这样t2时刻又会发生捕获事件,得到此时的CNT值,记为CCRx2。这样,根据定时器的计数频率,我们就可以算出t1-t2的时间,从而得到高电平的脉宽。
在t1-t2之间,可能产生N次定时器溢出,这就要求我们对定时器溢出做处理,防止高电平太长,导致数据不准确。如上图所示,t1-t2之间CNT计数的的次数等于:N*ARR+CRRx2,有了这个计数次数,再乘以CNT的计数周期,即可得到t1-t2的时间长度,即高电平持续时间。
4、STM32CubeMx 配置
1)、系统时钟配置
2)、定时器22配置
3)、串口1配置
5、代码说明:
1)、tim.c文件
/* USER CODE BEGIN 0 */
#include "stdio.h"uint8_t dis_fm = 0;
uint8_t Channel2Edge = 0;
uint16_t Channel2HighTime, Channel2RisingTime, Channel2FallingTime;/* USER CODE END 0 */...../* USER CODE END 1 */void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{/*防止未使用参数(s)编译警告*/UNUSED(htim);if(htim->Instance == htim22.Instance){if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2){if(Channel2Edge == 0) //捕获上升沿{Channel2RisingTime = HAL_TIM_ReadCapturedValue(&htim22, TIM_CHANNEL_2); //获取上升沿时间点__HAL_TIM_SET_CAPTUREPOLARITY(&htim22, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_FALLING); //切换捕获极性HAL_TIM_IC_Start_IT(&htim22, TIM_CHANNEL_2); //切换捕获极性后需重新启动Channel2Edge = 1; //上升沿、下降沿捕获标志位}else if(Channel2Edge == 1) //捕获下降沿{Channel2FallingTime = HAL_TIM_ReadCapturedValue(&htim22, TIM_CHANNEL_2); //获取下降沿时间点__HAL_TIM_SET_CAPTUREPOLARITY(&htim22, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_RISING); //切换捕获极性HAL_TIM_IC_Start_IT(&htim22, TIM_CHANNEL_2); //切换捕获极性后需重新启动Channel2HighTime = Channel2FallingTime < Channel2RisingTime ? Channel2FallingTime + 0xffff - Channel2RisingTime + 1 : Channel2FallingTime - Channel2RisingTime;//高电平持续时间 = 下降沿时间点 - 上升沿时间点dis_fm = Channel2HighTime * 17 / 100; //计算超声波测量距离printf("dis_fm = %dcm \r\n", dis_fm);//i++;//累加计数Channel2Edge = 0; //一次采集完毕,清零}HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);}}
}/* USER CODE END 1 */
2)、usart.c文件
/* USER CODE BEGIN 0 */
#include "stdio.h"
/* USER CODE END 0 */
..../* USER CODE BEGIN 1 */
#ifdef __GNUC__/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printfset to 'Yes') calls __io_putchar() */#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/*** @brief Retargets the C library printf function to the USART.* @param None* @retval None*/
PUTCHAR_PROTOTYPE
{/* Place your implementation of fputc here *//* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);return ch;
}
/* USER CODE END 1 */
3)、main.c文件
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */void Delay_us(uint32_t t)//64M条件下的一微妙
{ int n = 11;while(--t){while(--n);n = 11;}
}void gases_start_signal(void)
{ HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_SET);//延时20usDelay_us(20);HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_RESET);
}
/* USER CODE END 0 */..../* USER CODE BEGIN 2 */HAL_TIM_IC_Start_IT(&htim22, TIM_CHANNEL_2);
/* USER CODE END 2 */
..../* USER CODE BEGIN WHILE */while (1){//ADC_GetValue();gases_start_signal();/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
6、串口助手打印运行结果
7、传送门->代码链接
STM32L051C8T6 HAL库 输入捕获进行超声波测距 案例相关推荐
- 【STM32】【STM32CubeMX】STM32CubeMX的使用之七:定时器输入捕获实现超声波测距
文章目录 0.前言 1.硬件设计 1.1.超声波模块 1.2.STM32L151 2.CubeMX配置 3.软件设计 下载工程文件: https://gitee.com/Joseph_Coop ...
- STM32CubeMX学习笔记3——TIM2输入捕获(SR-04测距)
文章目录 一.打开Cube,建立工程 二.系统配置 三.配置串口 四.配置TIM2 五.在 Clock Configuration中: 六.工程输出配置 七.代码部分处理 八.原理与代码分析 MCU: ...
- STM32CubeIDE HAL库操作IIC (二)案例篇(MPU9250)
接上一篇:STM32CubeIDE HAL库操作IIC (一)配置篇 目录 一.IIC协议操作MPU9250寄存器函数 二.MPU9250的操作(举例) 1.设置寄存器方法 2.读取寄存器方法 三.M ...
- STM32单片机基于HAL库开发HC-SR04 超声波测距模块(终极版)
参考: 某宝HC-SR04 超声波测距模块商品详情页 STM32L051C8T6 HAL库 输入捕获进行超声波测距 案例 STM32CubeMX学习笔记3--TIM2输入捕获(SR-04测距) cub ...
- HAL库STM32F103C8T6超声波测距
HAL库 STM32F103C8T6主控芯片 HC-SR04超声波测距模块 参考文章,十分感谢原作者 手把手教你,通过HAL库实现STM32的超声波测距–以SR-04为例 工程源码 https://g ...
- 学习并使用HC-SR04超声波测距模块+STM32
** 超声波测距原理 ** 参考博客: https://blog.csdn.net/qq_40734815/article/details/105992801 https://blog.csdn.ne ...
- STM32系列(HAL库)——F103C8T6通过NRF24L01(2.4G)无线模块进行双机通信
本文参考:STM32L051C8T6 HAL库 + nRF24L01 收发案例(硬件SPI通讯) 1.软件准备 (1)编程平台:Keil5 (2)CubeMX (3)XCOM(串口调试助手) 2.硬件 ...
- 【STM32】标准库与HAL库对照学习教程外设篇--超声波测距传感器
[STM32]标准库与HAL库对照学习教程外设篇--超声波测距传感器 一.前言 二.准备工作 三.超声波测距传感器 1.原理说明 2.使用说明 四.标准库使用传感器 1.实验程序 2.实验效果 五.H ...
- 基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距
系列文章目录 一.基于STM32F103C8T6最小系统板和STM32CubeMX实现LED灯循环闪烁 二.基于STM32F103C8T6和STM32CubeMX实现UART串口通信数据收发 三.实战 ...
最新文章
- hdu 1255(线段树+离散化)
- 阿里搜索技术,在AI路上走了多远?
- lua实现继承(lua程序设计21.7 练习21.2题)
- 揭秘任务型对话机器人(下篇)
- 利用SQL查找表中的质数(prime number)和完全数(perfect number)以及几个有趣的SQL语句...
- 构建大数据网络 你不得不重视的六个问题
- 从问题到解决方案到应用-android-ApiDemo入口源代码学习及应用
- javacv教程文档手册开发指南汇总篇
- 转载 DM9000的调试
- 计算机提示应用程序无法启动,告诉你电脑提示应用程序无法正常启动0x000007b怎么办...
- android 模拟器声音设置,android模拟器用mediaplayer播放没有声音
- 淘宝/天猫API:upload_img-上传图片到淘宝
- 『Less』学习笔记
- XSuperNEST套料引擎
- 输入文本的html,输入文本的步骤主要包括
- 算法租用游艇问题c语言,动态规划租用游艇问题
- (二)【Matlab】Matlab矩阵处理
- java+ElementUI前后端分离旅游项目第三天 预约管理
- Mac是不是基于Linux系统开发?
- java 对象向上转型_JAVA对象向上转型和向下转型