简介
HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可高达23mm。模块包括超声波发射器、接收器与控制电路 该模块引出四个接口:
- VCC和GND为供电端,VCC接5V,GND必须和单片机共地(很重要,给单片机提供一个低电平参考,否则接下来的通信会错乱而导致读取到的数值无规律)
- TRIG和ECHO为通信端,TRIG是触发控制信号输入,ECHO是回响信号输出
工作原理
单片机给TRIG引脚提供一个10us以上的高电平,该模块将会向正前方发出一束超声波,但超声波遇到前方的障碍物后便会返回,模块接收到返回的超声波时,ECHO引脚会触发为高电平,然后单片机只需要在ECHO引脚等待读取高电平信号,读到的高电平持续时间就是超声波从发出到接收到回响的时间,再根据声速为340m/s便可以计算出超声波模块距离障碍物的距离
注意:
1. 测距时,被测物体的面积不少于0.5㎡且尽量平整
2. 建议测量周期为60ms以上,以防止发射信号对回响信号的影响
STM32驱动
输出输入IO口配置
这里我们需要配置两个IO口来实现SMT32和HC-SR04之间的通信,一个可以输出高电平,另一个检测高电平。
- 我们使用CubeMX选择两个GPIO,并配置为推挽输出和浮空输入,这里选择PB6、PB7
定时器中断计时
这是使用该模块最重要的部分,对高电平持续时间的精准计时,这里我们使用定时器中断进行计时
- 使用CubeMX选择一个定时器,这里选择TIM2,按照下图配置,把预分频系数设置为72-1,重装载值为10000-1,这样定时器开启后每10000us进入一次中断(配置系统时钟为72MHz)。我们只需要记录定时器进入中断的次数和定时器中CNT的值便能计算出定时器从开启到关闭所经过的时间:
Times=TimeCNT*10000+CNT - 为了实现对定时器进入中断次数的记录,我们需要修改CubeMX生成的中断函数TIM2_IRQHandler,该函数在stm32f1xx_it.c中,找到并进行如下修改(其中TimerCnt为全局变量,记得引入头文件)
#include "ultrasound.h"
void TIM2_IRQHandler(void)
{
HAL_TIM_IRQHandler(&htim2);
TimerCnt++;
}
程序逻辑
- 建立.h文件
#ifndef __ULTRASOUND_H__
#define __ULTRASOUND_H__
#include "sys.h"
#define Trig PBout(6)
#define Echo PBin(7)
extern uint32_t TimerCnt;
uint32_t GetTIM2Times(void);
float GetUltrasoundDistance(void);
#endif
- 建立.c文件
#include "ultrasound.h"
#include "delay.h"
#include "tim.h"
#include "usart.h"
uint32_t TimerCnt=0;
uint32_t GetTIM2Times(void)
{
uint32_t times=0;
times=htim2.Instance->CNT+TimerCnt*10000;
TimerCnt=0;
htim2.Instance->CNT=0;
delay_ms(50);
return times;
}
float GetUltrasoundDistance(void)
{
uint32_t times=0;
Trig=1;
delay_us(11);
Trig=0;
while(Echo==0);
HAL_TIM_Base_Start(&htim2);
while(Echo==1);
HAL_TIM_Base_Stop(&htim2);
times=GetTIM2Times();
printf("times=%d\r\n",times);
return times/58.0;
}
|