一、硬件连接
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