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


STM32全部教程【STM32】标准库与HAL库对照学习系列教程大全

一、前言

本篇介绍如何使用STM32控制超声波传感器,方法可以使用STM32的 定时器计数或者输入捕获功能,本篇使用的是定时器中断。

有关定时器的知识在:
【STM32】标准库与HAL库对照学习教程七–定时器中断中有详细说明。

本篇使用串口将测试的距离打印在电脑,有关STM32串口通信的知识可以看这篇文章:
【STM32】标准库与HAL库对照学习教程八–串口通信详解

二、准备工作

  • STM32开发板(我用的是普中的STM32F103ZE的Z200系列)
  • STM32cubemx软件、keil5(MDK)
  • HC-SR04超声波传感器或者HY-SRF05超声波传感器

三、超声波测距传感器

1、原理说明

超声波测距传感器使用回声测距法。传感器由超声波发射器、超声波接收器、传感器电路组成,传感器主要用到4个引脚,VCC、Trig、Echo、GND
测距原理是超声波发射器向某一方向发射超声波,在发射时刻的同时计数器开始计时,超声波在空气中传播,途中碰到障碍物面阻挡就立即反射回来,超声波接收器收到反射回的超声波就立即停止计时。
超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物面的距离s,即:s=340t/2
在这里插入图片描述

2、使用说明

  • VCC应接5V供电
  • 使用时,STM32Trig引脚输出10us到20us的高电平,传感器发射超声波。
  • 当接收到回声时,Echo引脚输出一定时间的高电平,高电平的持续时间,就是整个过程的时间,因此,距离=高电平时间*声速/2
  • 超声波测距模块可测量距离范围是2cm-400cm, 测距精度可达高到3mm
  • 为了防止回声信号干扰,建议测量周期在60ms以上。

四、标准库使用传感器

1、实验程序

main.c

#include "LED.h"
#include "Delay.h"
#include "System.h"
#include "usart.h"
#include<stdio.h>
#include "ultrasonic.h"


/*************************************************
*函数名:    main
*函数功能: 主函数
*输入:     无  
*返回值:   无
**************************************************/
int main()
{
	
	SysTick_Init(72);
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //抢占式优先级与响应式优先级的分组
	LED_Init();
	USART1_Init(9600);
	Ultrasonic_Init();
	while(1)
	{
		  printf("distance = %f mm\r\n",Get_distance()); //输出距离
	}
}

ultrasonic.c

#include "ultrasonic.h"
#include "System.c"
#include "Delay.h"

/*************************************************
*函数名:    Ultrasonic_Init
*函数功能:  超声波初始化函数
*输入:      无
*返回值:    无
**************************************************/
void Ultrasonic_Init()
{
	GPIO_InitTypeDef GPIO_InitStruct;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
//	NVIC_InitTypeDef NVIC_InitStruct;
	
	RCC_APB2PeriphClockCmd(Trig_RCC|Echo_RCC, ENABLE); //打开对应引脚时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  //打开定时器时钟
	
	GPIO_InitStruct.GPIO_Pin = Trig_Pin;  //Trig引脚
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;  //输出速度
	GPIO_Init(Trig_Port, &GPIO_InitStruct);  //引脚初始化
	GPIO_ResetBits(Trig_Port,Trig_Pin);  //引脚置低
	
	GPIO_InitStruct.GPIO_Pin = Echo_Pin;  //Echo引脚
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;  //下拉输入
	GPIO_Init(Echo_Port, &GPIO_InitStruct);  //引脚初始化
	
	TIM_TimeBaseInitStruct.TIM_Prescaler = 71;  //分频系数
	TIM_TimeBaseInitStruct.TIM_Period = 50000;     //重装载值
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;  //定时器时钟不分频
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);  //定时器初始化
	
}

/*************************************************
*函数名:     Get_distance
*函数功能:   获得距离
*输入:       无
*返回值:     距离,类型浮点型,单位mm
**************************************************/
float Get_distance()
{
	float TIME_distance;
	Trig = 1; Delay_us(15); Trig = 0;  //给Trig引脚15us的高电平 
	TIM_Cmd(TIM3, ENABLE);  //定时器3使能
	while(!Echo)  //等待高电平出现
	{
		if(TIM_GetCounter(TIM3)>40000)  //200ms内未接收到返回信号
		{
			TIM_Cmd(TIM3, DISABLE);  //定时器3失能
			TIM_SetCounter(TIM3, 0);  //计时器清零
			return ERROR;
		}
	}
	TIM_SetCounter(TIM3, 0);   //接收到高电平,开始计时
	while(Echo); //等待低电平出现
	TIM_Cmd(TIM3, DISABLE);  //定时器3失能
	TIME_distance = ((float)TIM_GetCounter(TIM3)/1000.0)*340/2.0; //计算距离
	TIM_SetCounter(TIM3, 0);  //计时器清零
	return TIME_distance;  //返回距离,单位mm
}

ultrasonic.h

#ifndef ULTRASONIC_H_
#define ULTRASONIC_H_


#include "stm32f10x.h"

/************重定义引脚便于移植************/
#define Trig_RCC   RCC_APB2Periph_GPIOB
#define Trig_Pin   GPIO_Pin_1
#define Trig_Port  GPIOB

#define Echo_RCC   RCC_APB2Periph_GPIOB
#define Echo_Pin   GPIO_Pin_2
#define Echo_Port  GPIOB

/************位带操作************/
#define Trig       PBout(1)
#define Echo       PBin(2)

/************函数说明************/
void Ultrasonic_Init(void);
float Get_distance(void);

#endif

2、实验效果

在这里插入图片描述

五、HAL库使用传感器

1、cubemx主要配置


在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
④串口配置
在这里插入图片描述
⑤定时器配置
在这里插入图片描述
⑥引脚配置
在这里插入图片描述
⑦工程配置
在这里插入图片描述
在这里插入图片描述
⑧在工程内添加文件(记得添加文件路径)
在这里插入图片描述

2、实验程序

ultrasonic.c

#include "Ultrasonic.h"
#include "tim.h"
#include "Delay.h"
#include "System.h"

/*************************************************
*函数名:   Ultrasonic_Get_Distance
*函数功能: 获取超声波距离函数
*输入:     无
*返回值:   无
**************************************************/
float Ultrasonic_Get_Distance()
{
	float Distance;
	Trig = 1; Delay_ms(15); Trig = 0;   //给Trig引脚15us的高电平
	HAL_TIM_Base_Start(&htim3);  //打开定时器
	while(!Echo)  //等待回声出现
	{
		if(__HAL_TIM_GET_COUNTER(&htim3)>40000)  //时间超时
		{
			HAL_TIM_Base_Stop(&htim3);         //关闭定时器
			__HAL_TIM_SET_COUNTER(&htim3, 0);  //计数器清零
			return ERROR;
		}
	}
	__HAL_TIM_SET_COUNTER(&htim3, 0);  //计数器清零
	while(Echo); //等待低电平结束
	HAL_TIM_Base_Stop(&htim3);         //关闭定时器
	Distance = ((float)__HAL_TIM_GET_COUNTER(&htim3)/1000.0)*340/2.0;  //计算距离
	__HAL_TIM_SET_COUNTER(&htim3, 0);  //计数器清零
	return Distance;
}

ultrasonic.h

#ifndef UITRASONIC_H_
#define UITRASONIC_H_


#include "stm32f1xx_hal.h"


/************位带操作************/
#define Trig  PBout(1)
#define Echo  PBin(2)

/************函数定义************/
float Ultrasonic_Get_Distance(void);


#endif

main.c
在这里插入图片描述

#include<stdio.h>
#include "Ultrasonic.h"
/**
  * 函数功能: 重定向c库函数printf到DEBUG_USARTx
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}

在这里插入图片描述

printf("distance = %f mm \r\n",Ultrasonic_Get_Distance());
HAL_Delay(500);

3、实验效果

在这里插入图片描述
到这里就结束啦!

在这里插入图片描述

  • 24
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 23
    评论
STM32标准库HAL库都是针对STM32系列微控制器的库,但是它们的设计思路和使用方法有所不同。STM32标准库是由ST公司提供的一套基于寄存器操作的低层驱动库,而HAL库则是基于标准库的封装,提供了更加高级的API接口,使得开发者可以更加方便地进行开发。 具体来说,STM32标准库主要包括以下几个部分: 1. CMSIS(Cortex Microcontroller Software Interface Standard):这是一套由ARM公司提供的针对Cortex-M系列微控制器的标准接口,包括了一些通用的API接口和一些与具体芯片相关的头文件和链接脚本等。 2. 寄存器操作库:这是STM32标准库的核心部分,通过对芯片内部寄存器的直接操作,实现了对外设的控制和数据传输等功能。 3. 外设驱动库:这是对一些常用外设(如USART、SPI、I2C等)的封装,提供了更加方便的API接口,使得开发者可以更加方便地进行开发。 相比之下,HAL库则提供了更加高级的API接口,使得开发者可以更加方便地进行开发。HAL库主要包括以下几个部分: 1. HAL库核心:这是HAL库的核心部分,提供了一些通用的API接口,如时钟配置、中断控制等。 2. 外设驱动库:这是对一些常用外设(如USART、SPI、I2C等)的封装,提供了更加方便的API接口,使得开发者可以更加方便地进行开发。 3. 扩展库:这是一些额外的功能库,如USB库、文件系统库等。
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修成真

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值