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

  • 一、前言
  • 二、准备工作
  • 三、超声波测距传感器
    • 1、原理说明
    • 2、使用说明
  • 四、标准库使用传感器
    • 1、实验程序
    • 2、实验效果
  • 五、HAL库使用传感器
    • 1、cubemx主要配置
    • 2、实验程序
    • 3、实验效果

一、前言

本篇介绍如何使用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、实验效果


到这里就结束啦!

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

  1. 【STM32】标准库与HAL库对照学习教程外设篇--红外避障传感器

    [STM32]标准库与HAL库对照学习教程外设篇--红外避障传感器 一.前言 二.准备工作 三.红外避障传感器 1.传感器原理说明 2.传感器特性 四.标准库使用红外传感器 1.实验程序 2.实验效果 ...

  2. 【STM32】STM32标准库与HAL库对照学习教程特别篇--系统时钟RCC详讲

    [STM32]STM32标准库与HAL库对照学习教程特别篇--系统时钟RCC详讲 一.前言 二.时钟是什么 三.时钟树 1.时钟树图 2.时钟树讲解 左边部分 中间部分 右边部分 特殊部分 四.初始化 ...

  3. 【STM32】标准库与HAL库对照学习教程六--位带操作

    [STM32]标准库与HAL库对照学习教程六--位带操作 一.前言 二.准备工作 三.位带介绍 1.位带操作 2.STM32位带及位带别名区域 四.位带区与位带别名区地址转换 五.GPIO的位带操作 ...

  4. 【STM32】标准库与HAL库对照学习教程十三--软件IIC控制AT24C02

    [STM32]标准库与HAL库对照学习教程十三--软件IIC控制AT24C02 一.前言 二.准备工作 三.AT24C02(EEPROM)介绍 1.AT24C02简介 2.引脚功能 3.设备地址 四. ...

  5. 【STM32】STM32标准库与HAL库对照学习教程一--使用寄存器操控LED闪烁详讲

    [STM32]STM32标准库与HAL库对照学习教程一--使用寄存器操控LED闪烁详讲 前言 本教程文章是我在学习STM32标准库和HAL库后写的,想通过标准库与HAL库的对照学习加强我对STM32的 ...

  6. 【STM32】标准库与HAL库对照学习教程八--串口通信详解

    [STM32]标准库与HAL库对照学习教程八--串口通信详解 一.前言 二.准备工作 三.通信的基本概念 1.通信方式 2.串行通信与并行通信 (1)串行通信 (2)并行通信 3.异步通信与同步通信 ...

  7. 【STM32学习】(29)STM32实现595驱动三个数码管(标准库和HAL库实现)

    我选用的单片机型号为:STM32F103系列 74LS595是一个串转并行输出的芯片,它能为单片机节省很多的IO口,应用场景广泛. 现要求三个数码管动态显示,常规设计都是并行实现,需要8个IO数据口, ...

  8. 【STM32学习】(30)STM32实现18B20温度采集(标准库和HAL库实现)

    单片机型号:STM32F103 源码下载链接:(2条消息) STM32实现18B20温度采集(标准库和HAL库实现)-电信文档类资源-CSDN下载 现要求完成温度采集并在串口或液晶屏上显示.我们这里使 ...

  9. STM32标准库、HAL库特点与应用

    新手在入门STM32的时候,一般大多数都会选用标准库和HAL库,而极少部分人会通过直接配置寄存器进行开发. 对于刚入门的朋友可能没法直观了解这些不同开发发方式彼此之间的区别,本文试图以一种非常直白的方 ...

最新文章

  1. 为了提升续航,马斯克又引发一场“造芯”革命,华为比亚迪已进场
  2. 程序员应该知道的那些画图工具-第一期
  3. java 程序命令_命令行运行JAVA程序
  4. 蓝牙通信-搜索附近的蓝牙设备
  5. Ubuntu 12.04 设置终端字体为文泉驿(转载)
  6. android毕业论文附录,毕业论文常见格式 论文附录格式
  7. 海尔手机V73 PC套件安装使用说明 管理好你的电话簿
  8. Python-精准提取行政区省市区
  9. 扫码枪 android EditText
  10. linux 中什么是进程号,Linux中脚本进程号由什么决定?
  11. Global Tracking Transformers
  12. 用python画星空-用python画星空源代码是什么?
  13. Python程序设计(第三版)约翰·策勒 编程练习课后答案(第二章)
  14. 计算机开机自动进入bios,电脑开机自动进入bios界面的原因及解决办法
  15. Mac 解压缩rar文件
  16. Git和Bitbucket入门之代码上传
  17. 使用Java计算生辰八字五行属性
  18. ubuntu安装teamviewer后无法打开,提示权限不够
  19. ROS学习记录(一) Plugin插件
  20. python3 类似‘\xe4\xbd\xa0\xe5\xa5\xbd.pdf‘这种str到byte的转换

热门文章

  1. 数据标注的终点会是众包么?(AI数据标注猿交流社区群欢迎加入)
  2. NVIDIA wget下载cuda失败的解决方案,Linux/Ubuntu cuda 11离线下载安装包
  3. 如何正确的自学Python?
  4. 软件系统设计-4-建造者模式、原型模式
  5. 研究生人工智能就业没烦恼?一文了解研究生AI就业前景
  6. 807 保持城市天际线
  7. 树莓派只要一连上wifi就出现两个红叉子
  8. 系统升级Apply LUT插件不能使用,FCPX如何导入LUT调色预设?
  9. CAD的使用群体有哪些?AutoCAD对业余小白来说友好吗?
  10. AutoRuns V13.30