你可能会用到的毕业设计模块——HC-SR04超声波模块测距(HAL库版)

一、硬件连接

1、STM32F103ZET6

      VCC--5V

      GND--CND

       PF4--Trig

       PA6--Echo

2、  超声波测距模块原理

二、工程配置

1、基础配置略

2、TIM3输入捕获模式echo

3、trig配置,随便一个引脚配置成output

三、代码分析

1、main.c

 /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim6);//开启1ms定时器中断
	HAL_TIM_Base_Start(&htim3);//启动定时器计数
	
	HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_1);//启动输入捕获
	HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);//启动输入捕获中断,由于需要通道2捕获完成后,需要通过中断通知我们
  /* USER CODE END 2 */
/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{	
		 if(htim->Instance == TIM6)//控制AllTask(),1ms执行一次
    {
			 time.alltask_flag= 1;//总任务
				
			 ultrasonic.ultrasonic_10ms++;
			
			if(ultrasonic.ultrasonic_10ms==10)
			{
					time.ultrasonic_flag=1;//超声波10ms测量
				  ultrasonic.ultrasonic_10ms=0;
			}
			 
		}
}
/* USER CODE END 4 */

2、AllTask.h

#ifndef __ALLTASK_H
#define __ALLTASK_H

#include "main.h"

typedef struct
{
		uint8_t alltask_flag;//所有任务1ms中断
		uint8_t ultrasonic_flag;//超声波10ms中断

}time_control;

extern time_control time;//每1ms执行一次中断

void Alltask(void);

#endif

3、AllTask.c

#include "Alltask.h"
#include "HC_SR04.h"

time_control time=
{
  .alltask_flag=0,
	.ultrasonic_flag=0,
};


void Alltask(void)
{
		if(time.alltask_flag==1)//1ms中断
		{
				time.alltask_flag=0;
		}
		if(time.ultrasonic_flag==1)//每10ms超声波触发一次测量
		{
			time.ultrasonic_flag=0;
			Trigger_ultrasonic();//触发一次测量
		}
}

4、HC_RS04.h

#ifndef __HC_SR04_H
#define __HC_SR04_H

#include "main.h"
#include "tim.h"


typedef struct
{
	uint8_t ultrasonic_10ms;//超声波10ms测量计时
	uint32_t upEdge;//上升沿
	uint32_t downEdge;//下降沿
	float distance;//距离
}ultrasonic_Control;

extern ultrasonic_Control ultrasonic;

void delay_us(uint32_t us);
void Trigger_ultrasonic(void);//触发超声波测量
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim);//超声波测量 

#endif

5、HC_RS04.c

#include "HC_SR04.h"

ultrasonic_Control ultrasonic=
{
	.ultrasonic_10ms=0,//超声波10ms测量计时
	.upEdge=0,
	.downEdge=0,
	.distance=0,
};


/* us级延时*/
void delay_us(uint32_t us)
{
	uint16_t i = 0;
	while (us--)
	{
		i = 11;
		while (i--);
	}
}

/* 触发超声波测量 */
void Trigger_ultrasonic(void)
{
	 HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_SET);
	//采用I0触发测距,给至少10us的高电平信号,实际40-50uS效果好。
	 delay_us(45);
	 HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_RESET);	
	//为了避免捕获完上升沿后遇见自动重装载,下降沿记录到比下降沿还小的数值,最好在触发测试后,立马将计数器置零
	 __HAL_TIM_SET_COUNTER(&htim3,0);
}

/* 超声波测量 */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if(htim==&htim3&&htim->Channel==HAL_TIM_ACTIVE_CHANNEL_2)//判断进入中断的是定时器3和通道2
	{
			ultrasonic.upEdge=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
		  ultrasonic.downEdge=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2);
		  //当前TIM3使用的总线是72Mhz,经过72分频后,每1us计数加一,
		  //声速340m/s--->1s=1000000 us
      //34000/1000000=0.034
      //340m/s等于___0.034______cm/us
			ultrasonic.distance=((ultrasonic.downEdge-ultrasonic.upEdge)*0.034)/2;
	}
}

四、完整工程链接

http://链接: https://pan.baidu.com/s/1OFdlNWjku85mWDJ7nfMOgw?pwd=tqyw 提取码: tqyw

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值