文章目录
一.概要
HC-SR04超声波模块常用于机器人避障、物体测距、液位检测、公共安防、停车场检测等场所。HC-SR04超声波模块主要是由两个通用的压电陶瓷超声传感器,并加外围信号处理电路构成的。
两个压电陶瓷超声波传感器,一个用于发出超声波信号,一个用于接收反射回来的超声波信号。由于发出信号和接收信号都比较微弱,所以需要通过外围信号放大器提高发出信号的功率,和将反射回来信号进行放大,以能更稳定地将信号传输给单片机。
模块如图所示:
二.HC-SR04主要参数
1.模块引脚定义
2.模块电气参数
3.模块通讯时序
以上时序图表明单片机只需要提供一个10uS以上脉冲触发信号给模块的TRIG引脚,该模块内部将发出8个40kHz周期电平并检测回波。模块一旦检测到有回波信号则输出回响信号到模块ECHO引脚。回响信号的脉冲宽度与所测的距离成正比。单片机通过采集收到的输出回响信号的宽度时间就可以计算得到距离。
距离公式:距离=回响高电平时间*声速(340M/S)/2
4.模块原理图
三.STM32单片机超声波模块测距实验
硬件准备:
STLINK接STM32F103C8T6小系统板,STLINK接电脑USB口。
板子与OLED用杜邦线连接:
板子G----液晶GND
板子3.3–液晶VCC
板子B10—液晶SCL
板子B11—液晶SDA
板子与超声波模块用杜邦线连接:
板子A0----模块Trig
板子A1----模块Echo
板子3.3—模块VCC
板子G-----模块GND
打开STM32CubeMX软件,新建工程
Part Number处输入STM32F103C8,再双击就创建新的工程
配置下载口引脚
配置外部晶振引脚
配置系统主频
配置PA0为输出,PA1为输入,PA1管脚选择下拉
配置定时器2,10us产生中断一次,用来统计后续采集超声波返回的脉冲宽度时间
配置工程文件名,保存路径,KEIL5工程输出方式
生成工程
用Keil5打开工程
添加OLED驱动文件
添加超声波相关代码
主要代码
void TIM2_IRQHandler(void)
{
/* USER CODE BEGIN TIM2_IRQn 0 */
/* USER CODE END TIM2_IRQn 0 */
HAL_TIM_IRQHandler(&htim2);
/* USER CODE BEGIN TIM2_IRQn 1 */
TimeCounter++;//10us计数一次
/* USER CODE END TIM2_IRQn 1 */
}
uint32_t Distance_Calculate(uint32_t count)//传入时间单位10us
{
uint32_t Distance = 0;
Distance = (uint32_t)(((float)count *17)/100);//距离单位cm,声速340M/S,时间*速度/2=距离
return Distance;
}
//等待us级别
void Delay_us(unsigned long i)
{
unsigned long j;
for(;i>0;i--)
{
for(j=12;j>0;j--);
}
}
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();//8M外部晶振,72M系统主频
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM2_Init();//定时器2初始化,配置成10us,溢出一次
/* USER CODE BEGIN 2 */
if (HAL_TIM_Base_Start_IT(&htim2) != HAL_OK)//启动定时器2,10us进入中断一次
{
while(1);
}
OLED_Init(); //初始化OLED
OLED_Clear(); //清屏
while(1)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0,GPIO_PIN_RESET);//预先拉低Trig引脚
HAL_Delay(5);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0,GPIO_PIN_SET);//拉高Trig引脚
Delay_us(20);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0,GPIO_PIN_RESET);//拉低Trig引脚
Delay_us(20);
while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == 0);//如果是低电平,一直等
HalTime1= TimeCounter;
while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == 1);//如果是高电平,一直等
if(TimeCounter>HalTime1)
{
HalTime2 = TimeCounter-HalTime1;
if(HalTime2<0x300)
{
Distance = Distance_Calculate(HalTime2);//计算距离
}
}
OLED_Clear();
OLED_ShowCHinese(18,0,0);//光
OLED_ShowCHinese(36,0,1);//子
OLED_ShowCHinese(54,0,2);//物
OLED_ShowCHinese(72,0,3);//联
OLED_ShowCHinese(90,0,4);//网
OLED_ShowString(24,3,"SR04 TEST");
OLED_ShowString(0,6,"Dis: ");
OLED_ShowNum(30,6,Distance,3,16);//显示距离值,单位cm
OLED_ShowString(60,6,"cm");
HAL_Delay(1000);
}
/* USER CODE END 3 */
}
四.CubeMX工程源代码下载
链接:https://pan.baidu.com/s/1Km6ioytkj1S7QWQDif-h1Q
提取码:7y10
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行
五.小结
超声波模块基于声音传播的速度和时间差来计算模块到前方障碍物的距离,可用于人体检测,机器人避障,距离测量等,例如在门口安装超声波模块可以检测人的接近并触发开门动作,或者用于室内的距离测量和自动照明等
标签:HAL,SR04,CODE,STM32,OLED,源码,USER,模块,GPIO From: https://blog.csdn.net/zy2232652/article/details/140295774