目录
1. HC-SR04超声波模块
说明:以下截图均来自HC-SR04用户手册。
1.1 概述
1.2 性能参数
1.3 接口定义
1.4 模式选择
从用户手册可以知道,HCSR04超声波模块支持多种工作方式,默认工作在GPIO模式。
2. 编程思路
- 利用定时器输入捕获功能测量Echo引脚输出的高脉冲信号时间;
- 接线: HCSR04的Trig引脚连接到STM32F103C8T6 PA0引脚(可以是其他引脚),Echo连接定时器TIM3的通道1(其他定时器均可),对应引脚为PA6;
- PA0配置为推挽输出;
- 定时器TIM3配置:IC1映射到TI1,上升沿检测,IC2映射到TI1,下降沿检测,从模式触发选择滤波后的定时器输入1(TI1FP1),复位模式。
3. 具体步骤
- 初始化定时器以及用到的IO口;
- MCU 给模块 Trig 脚一个大于 10uS 的高电平脉冲;
- 等待定时器通道2输入捕获事件;
- 读取CCR2寄存器的值,即为要检测的高脉冲信号时间;
- 计算距离:距离 = 高电平脉冲信号时间*声速 / 2。
4. 代码实现
4.1 头文件
//tim.h
#ifndef __TIM_H
#define __TIM_H
#include "stm32f1xx_hal.h"
extern TIM_HandleTypeDef htim3;
void TIM3_Init(uint16_t psc, uint16_t arr);
uint8_t TIM3_GetIcFlag(void);
void TIM3_ClearIcFlag(void);
#endif
//hcsr04.h
#ifndef __HCSR04_H
#define __HCSR04_H
#include "stm32f1xx_hal.h"
static void HCSR04_Start(void);
void HCSR04_Init(void);
int HCSR04_GetDistance(float * const dis);
#endif
4.2 源文件
//tim.c
#include "tim.h"
TIM_HandleTypeDef htim3;
/**
* @brief TIM3_Init初始化函数
* @param psc:预分频值,arr:自动重装载值
* @retval 无
*/
void TIM3_Init(uint16_t psc, uint16_t arr)
{
TIM_IC_InitTypeDef tim3_ic_chxConfig = {
0};
TIM_SlaveConfigTypeDef tim3_slaveConfig = {
0};
htim3.Instance = TIM3; //外设基地址
htim3.Init.CounterMode = TIM_COUNTERMODE_UP; //向上计数模式
htim3.Init.Period = arr; //自动重装载值
htim3.Init.Prescaler = psc; //预分频值
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; //不分频
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;