基于STM32_HAL库实现超声波测距

这篇具有很好参考价值的文章主要介绍了基于STM32_HAL库实现超声波测距。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

核心板               :STM32F103C8T6。

超声波测距模块 :HC-SR04超声波测距模块

实验目的            :利用超声波测距,将测量的距离打印在串口并输出。


HC-SR04超声波测距模块介绍

        接口定义:Vcc、 Trig(控制端——PA2)、 Echo(接收端——PA11)、 Gnd

        模块工作原理:采用 IO 触发测距,给至少 10us 的高电平信号; 模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;有信号返回,通过 IO 输出一高电平,高电平持续的时间就是超声波从发射到返回的时间,测试距离=(高电平时间*声速(340M/S))/2;

hal库超声波测距,stm32,单片机


 测距方法介绍:

        距离 = 超声波来回的时间/2 * 340,因此最重要的就是求时间。

        方法一:利用定时器计数功能在成功发送触发信号后,通过读取Echo信号引脚的高低电平变化的时间内计数器所计数的值,再乘以计一下数的所用的时间即可计算出该段变化电平所用的时间。

        方法二:利用定时器的输入捕获功能,在Echo电平升高时进入回调函数,在回调函数中将此时的计数值保存,并设置定时器为下降沿捕获;在Echo电平降低时进入回调函数,在回调函数中将此时的计数值保存,并设置定时器为下降沿捕获(为了下次测量准备);将两次保存的计数值进行相减并乘以计一下数所用的时间就可计算出该段电平变化所用的时间。


STM32CubeMX的配置:

        配置时钟,为最高的72MHZ

hal库超声波测距,stm32,单片机

 hal库超声波测距,stm32,单片机

         串口的配置

hal库超声波测距,stm32,单片机

 hal库超声波测距,stm32,单片机

         定时器的配置

        ( 为了不在重复配置,这里就直接配置成输入捕获模式,开启溢出中断与捕获中断,方法一只需要开启定时器即可。)

        (利用TIM1_CH4是因为Echo与TIM1_CH4共用引脚)

hal库超声波测距,stm32,单片机

hal库超声波测距,stm32,单片机

                        以上配置就可以得到我们记一次数需要 72MHZ/72 = 1us

        引脚的命名

hal库超声波测距,stm32,单片机

 hal库超声波测距,stm32,单片机

                生成代码 


首先,重定向printf函数

        打开 usart.c,在 /* USER CODE BEGIN 0 */ 和 /* USER CODE END 0 */加入以下代码:


#include <stdio.h>
 
#ifdef __GNUC__
	/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
	set 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__ */

 hal库超声波测距,stm32,单片机

           在 /* USER CODE BEGIN 1 */ 和 /* USER CODE END 1 */ 之间加入以下代码:


/**
* @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;
}

        记得勾选

hal库超声波测距,stm32,单片机

 以上就是最基础的配置,接下来我们进行方法一

        在tim.c中编写毫秒延时函数

/* USER CODE BEGIN 1 */

//使用TIM1来做us级延时函数,此函数为1us
void TIM1_Delay_us(uint16_t n_us)
{
	/* 使能定时器1计数 */
	__HAL_TIM_ENABLE(&htim1);
	
	__HAL_TIM_SetCounter(&htim1, 0);//htim1
	
	while(__HAL_TIM_GetCounter(&htim1) < ((1 * n_us)-1) );
	
    /* 失能定时器1计数 */
	__HAL_TIM_DISABLE(&htim1);
}


/* USER CODE END 1 */

        在main.c中编写超声波开始函数

void Start()
{
	HAL_GPIO_WritePin(Trig_GPIO_Port, Trig_Pin, GPIO_PIN_SET);//拉高
		
	TIM1_Delay_us(20);
		
	HAL_GPIO_WritePin(Trig_GPIO_Port, Trig_Pin, GPIO_PIN_RESET);//拉低
}

        在主函数外定义变量

int Cnt;//计数值
float Distance;//距离

        主函数

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_TIM1_Init();
  /* USER CODE BEGIN 2 */
	
	HAL_TIM_Base_Start(&htim1);//开启定时器
	
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */

  while (1)
  {
		/* 定时器1,通道1,模式随便,主要用于计数,没有使用边沿捕获 */	
		Start();//开启超声波模块
		
		HAL_TIM_Base_Start(&htim1);//开启定时器

		//对超声波输入端口操作
		while( HAL_GPIO_ReadPin (Echo_GPIO_Port ,Echo_Pin) == GPIO_PIN_RESET);//等待输入电平拉高
		
		__HAL_TIM_SetCounter(&htim1,0);
		
		//对超声波输入端口操作
		while( HAL_GPIO_ReadPin (Echo_GPIO_Port ,Echo_Pin) == GPIO_PIN_SET);//等待输入电平变低
		
		Cnt = __HAL_TIM_GetCounter(&htim1);
		
		HAL_TIM_Base_Stop(&htim1);
		
		Distance = Cnt*340/2*0.000001*100 ;
		
		printf("Distance=%.1fcm\n",Distance);
		
		HAL_Delay(500);
		
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

         实验结果

hal库超声波测距,stm32,单片机


方法二

        在主函数外编写溢出中断与捕获中断的回调函数

int Edge;//0为捕获到上升沿,1为捕获到下降沿
int Cnt = 0;//完成了几次溢出
uint32_t  t1,t2,T;
float Distance;

/* 定时器溢出中断回调函数 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if((htim->Instance == htim1.Instance))
		Cnt++;
}

/* 定时器输入捕获中断回调函数 */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if((htim->Instance == htim1.Instance) && (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4))
	{
		if(Edge == 0)//如果捕获到上升沿
		{
			t1 = HAL_TIM_ReadCapturedValue(&htim1,TIM_CHANNEL_4);
			
			//__HAL_TIM_SetCounter(&htim1,0);
			
			//设置为下降沿捕获
			__HAL_TIM_SET_CAPTUREPOLARITY(&htim1,TIM_CHANNEL_4,TIM_INPUTCHANNELPOLARITY_FALLING);
			
			Cnt = 0;//计数器清零
			
			Edge = 1;//采集下降沿
		}
		else if(Edge == 1)
		{
			t2 = HAL_TIM_ReadCapturedValue(&htim1,TIM_CHANNEL_4);
			
			t2 += Cnt * 65535;
			
			T = t2 - t1;
			
			//设置为上升沿沿捕获
			__HAL_TIM_SET_CAPTUREPOLARITY(&htim1,TIM_CHANNEL_4,TIM_INPUTCHANNELPOLARITY_RISING);
			
			Distance = T * 0.000001 * 170 * 100 ; 
			
			printf("Distance=%.1fcm\n",Distance);
			
			Edge = 0;//采集上升沿
		}
	}
}

        主函数中

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_TIM1_Init();
  /* USER CODE BEGIN 2 */
	
	HAL_TIM_Base_Start(&htim1);//开启定时器
	
	HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_4);//在中断模式下开启定时器输入捕获
	
	HAL_TIM_Base_Start_IT(&htim1);//开启溢出中断

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		Start();//开启超声波模块
		
		HAL_Delay(500);
		
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

        实验结果:

hal库超声波测距,stm32,单片机


以上仅供自己与大家学习积累,欢迎各位大佬批评与指正! 文章来源地址https://www.toymoban.com/news/detail-599573.html

到了这里,关于基于STM32_HAL库实现超声波测距的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)

    一、小车1.0——基本蓝牙小车(仅蓝牙遥控小车运动方向,本篇) 二、小车2.0——蓝牙小车PLUS(可以蓝牙控制方向+蓝牙直接调节车速) 三、小车3.0——避障小车(超声波+舵机云台) 四、小车4.0——无线手柄方向感知操控小车(mpu6050+双蓝牙透传) 五、双轮自平衡小车(HAL库版

    2024年02月05日
    浏览(77)
  • 基于STM32F407实现超声波测距(SR04)

    今天要实现的功能是超声波测距,这一功能在很多的地方都能用到,比如:在智能小车上可以添加超声波避障功能。今天需要用到SR04超声波模块,在使用这一模块的时候我很会接触到时序图。 模块如图所示: 模块有四个引脚 VCC 供 5V电源, GND 为地线, TRIG 触 发 控 制 信 号

    2024年02月11日
    浏览(58)
  • 基于STM32的超声波测距

    一、HC-SR04模块介绍 HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可高达3mm;模块包括超声波发射器、接收器、与控制电路。 模块的基本工作原理为: (1)采用 IO口 TRIG触发测距,给最少 10us的高电平信呈。 (2)模块自动发送 8个 40khz的方波,自动检测是

    2024年02月13日
    浏览(48)
  • 基于STM32超声波测距系统设计

    随着社会的发展和科技的进步,人们对测距的要求越来越高,特别是在一些要求实时测距的场合,传统的测距方式已经无法满足人们的需求,而超声波测距由于其非接触和实时反馈的特点在生活中得到广泛应用。 本系统硬件部分由电源模块、控制模块、显示模块、报警模块、

    2024年02月04日
    浏览(56)
  • 基于STM32的HC_SR04模块实现超声波测距(附源码)

    本次实验需要通过STM32与HC_SR04模块实现实时测距,并将测距信息通过串口显示在电脑上 原理 超声波测距原理是在超声波发射装置发出超声波,它的根据是接收器接到超声波时的时间差,与雷达测距原理相似。 超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时

    2024年02月11日
    浏览(49)
  • STM32:两种方式实现超声波测距

    超声波模块HC-SR04的工作原理很简单,有很多办法可以完成超声波测距,这里简单介绍两种。 配置定时器的中断并声明一个Time的变量,在中断中先判断标志位,然后检查echo端口是否为高电平,如果是,Time++,然后变量time乘以定时时间就能得到echo端口高电平持续的时间,经过

    2024年04月16日
    浏览(51)
  • 基于STM32F103C8T6的超声波测距应用

    #一、超声波HC_SR04简介 #二、超声波工作原理 #三、超声波测距步骤 #四、硬件接线 #五、项目代码 一、超声波HC_SR04简介 超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接收。电路板上有四个引脚:VCC、GND、Trig(触发)、Echo(回应) 工作电压与电流

    2024年02月03日
    浏览(47)
  • stm32之14.超声波测距代码

           -------------------- 源码  

    2024年02月11日
    浏览(50)
  • 最详细STM32,cubeMX 超声波测距

    这篇文章将详细介绍 STM32使用 cubeMX驱动超声波测距 。 实验材料:STM32F103C8T6开发板, HC-SR04 超声波模块。 所需软件:keil5 , cubeMX ,AiThinker Serial Tool 串口助手。 实验目的:了解 STM32使用 cubeMX驱动超声波 。 实验:超声波测距。 HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触

    2024年02月08日
    浏览(52)
  • STM32超声波测距(OLED显示距离)

    超声波原理: 利用声音测距,声音在空气中的速度是340m/s(15℃) 当声音传播时,若遇到障碍物时,就会被反弹回来,通过计时反弹回来的时间就可以计算出从发射端到障碍物的距离 引脚定义: 工作电压:3V-5.5V宽电压供电 测距盲区:2cm最小盲区 接口定义如图 序号 接口定义

    2024年02月04日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包