目录

概述

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库 输入捕获进行超声波测距 案例相关推荐

  1. 【STM32】【STM32CubeMX】STM32CubeMX的使用之七:定时器输入捕获实现超声波测距

    文章目录 0.前言 1.硬件设计 1.1.超声波模块 1.2.STM32L151 2.CubeMX配置 3.软件设计   下载工程文件:   https://gitee.com/Joseph_Coop ...

  2. STM32CubeMX学习笔记3——TIM2输入捕获(SR-04测距)

    文章目录 一.打开Cube,建立工程 二.系统配置 三.配置串口 四.配置TIM2 五.在 Clock Configuration中: 六.工程输出配置 七.代码部分处理 八.原理与代码分析 MCU: ...

  3. STM32CubeIDE HAL库操作IIC (二)案例篇(MPU9250)

    接上一篇:STM32CubeIDE HAL库操作IIC (一)配置篇 目录 一.IIC协议操作MPU9250寄存器函数 二.MPU9250的操作(举例) 1.设置寄存器方法 2.读取寄存器方法 三.M ...

  4. STM32单片机基于HAL库开发HC-SR04 超声波测距模块(终极版)

    参考: 某宝HC-SR04 超声波测距模块商品详情页 STM32L051C8T6 HAL库 输入捕获进行超声波测距 案例 STM32CubeMX学习笔记3--TIM2输入捕获(SR-04测距) cub ...

  5. HAL库STM32F103C8T6超声波测距

    HAL库 STM32F103C8T6主控芯片 HC-SR04超声波测距模块 参考文章,十分感谢原作者 手把手教你,通过HAL库实现STM32的超声波测距–以SR-04为例 工程源码 https://g ...

  6. 学习并使用HC-SR04超声波测距模块+STM32

    ** 超声波测距原理 ** 参考博客: https://blog.csdn.net/qq_40734815/article/details/105992801 https://blog.csdn.ne ...

  7. STM32系列(HAL库)——F103C8T6通过NRF24L01(2.4G)无线模块进行双机通信

    本文参考:STM32L051C8T6 HAL库 + nRF24L01 收发案例(硬件SPI通讯) 1.软件准备 (1)编程平台:Keil5 (2)CubeMX (3)XCOM(串口调试助手) 2.硬件 ...

  8. 【STM32】标准库与HAL库对照学习教程外设篇--超声波测距传感器

    [STM32]标准库与HAL库对照学习教程外设篇--超声波测距传感器 一.前言 二.准备工作 三.超声波测距传感器 1.原理说明 2.使用说明 四.标准库使用传感器 1.实验程序 2.实验效果 五.H ...

  9. 基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距

    系列文章目录 一.基于STM32F103C8T6最小系统板和STM32CubeMX实现LED灯循环闪烁 二.基于STM32F103C8T6和STM32CubeMX实现UART串口通信数据收发 三.实战 ...

最新文章

  1. hdu 1255(线段树+离散化)
  2. 阿里搜索技术,在AI路上走了多远?
  3. lua实现继承(lua程序设计21.7 练习21.2题)
  4. 揭秘任务型对话机器人(下篇)
  5. 利用SQL查找表中的质数(prime number)和完全数(perfect number)以及几个有趣的SQL语句...
  6. 构建大数据网络 你不得不重视的六个问题
  7. 从问题到解决方案到应用-android-ApiDemo入口源代码学习及应用
  8. javacv教程文档手册开发指南汇总篇
  9. 转载 DM9000的调试
  10. 计算机提示应用程序无法启动,告诉你电脑提示应用程序无法正常启动0x000007b怎么办...
  11. android 模拟器声音设置,android模拟器用mediaplayer播放没有声音
  12. 淘宝/天猫API:upload_img-上传图片到淘宝
  13. 『Less』学习笔记
  14. XSuperNEST套料引擎
  15. 输入文本的html,输入文本的步骤主要包括
  16. 算法租用游艇问题c语言,动态规划租用游艇问题
  17. (二)【Matlab】Matlab矩阵处理
  18. java+ElementUI前后端分离旅游项目第三天 预约管理
  19. Mac是不是基于Linux系统开发?
  20. java 对象向上转型_JAVA对象向上转型和向下转型

热门文章

  1. 被商业化「催熟」的B站
  2. QQ在线交谈(客服)代码
  3. 自学太慢了?不报班只白嫖行不行?又或者报个班,逼自己一把?
  4. 2019淘宝天猫拼多多大促时间表!附:大促售后/公号私号吸粉黑科技!
  5. flexible.js原理理解
  6. double转int精度丢失问题
  7. 驾校练车总结 -- 科二 -- 直角
  8. 《Soft Filter Pruning for Accelerating Deep Convolutional Neural Networks》论文笔记
  9. js面向对象和面向过程的区别
  10. 对各浏览器userAgent的检测客户端