文章目录
- 一、SR-04基本原理
- 二、CubeMx配置
- 1.配置RCC、SYS、时钟树
- 2.配置GPIO
- 3.配置串口1
- 4.配置定时器
- 5.开启定时器中断
- 三、keil代码
- 四、运行效果
- 接线
- 效果
- 参考:
一、SR-04基本原理
HC-SR04超声波测距模块提供2cm~400cm的测距功能,精度达3mm。
以下图片截取自深圳市捷深科技有限公司的《HC-SR04超声波测距模块说明书》
通过时序图我们可以知道,我们给HC-SR04发送长达10us的TTL脉冲,然后模块就会进行测距,测距的结果通过回响信号传达,回响的TTL电平信号时间即是超声波从HC-SR04模块发出,触碰到障碍物后返回到HC-SR04模块的时间总和。
TTL是逻辑电平标准,当电压达到2.4V5V之间,那么为逻辑1(高电平),电压在0V0.4V之间,那么为逻辑0(低电平)。所以我们可以直接通过GPIO口来输出以及输入时序所需的电平信号。
总所周知,声音的速度为340m/s,因此我们将回响电平的时间除340再除2之后得到的就是单位为米的测距结果。
二、CubeMx配置
1.配置RCC、SYS、时钟树
2.配置GPIO
3.配置串口1
4.配置定时器
5.开启定时器中断
三、keil代码
1.勾选Use MicroLIB
2.SR04.c和SR04.h代码
#SR04.h
#ifndef __SR04_H
#define __SR04_H
#include "main.h"
#include "tim.h"
#include "stdio.h"#define TRIG_H HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_SET)
#define TRIG_L HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_RESET)void delay_us(uint32_t us);
void SR04_GetData(void);#endif
#SR04.c
#include "SR04.h"float distant; //测量距离
uint32_t measure_Buf[3] = {0}; //存放定时器计数值的数组
uint8_t measure_Cnt = 0; //状态标志位
uint32_t high_time; //超声波模块返回的高电平时间//===============================================读取距离
void SR04_GetData(void)
{
switch (measure_Cnt){case 0:TRIG_H;delay_us(30);TRIG_L;measure_Cnt++;__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); //启动输入捕获 或者: __HAL_TIM_ENABLE(&htim5); break;case 3:high_time = measure_Buf[1]- measure_Buf[0]; //高电平时间printf("\r\n----高电平时间-%d-us----\r\n",high_time); distant=(high_time*0.034)/2; //单位cmprintf("\r\n-检测距离为-%.2f-cm-\r\n",distant); measure_Cnt = 0; //清空标志位TIM2->CNT=0; //清空计时器计数break;}
}//===============================================us延时函数void delay_us(uint32_t us)//主频72M
{uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);while (delay--){;}
}//===============================================中断回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//
{if(TIM2 == htim->Instance)// 判断触发的中断的定时器为TIM2{switch(measure_Cnt){case 1:measure_Buf[0] = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);//获取当前的捕获值.__HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING); //设置为下降沿捕获measure_Cnt++; break; case 2:measure_Buf[1] = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);//获取当前的捕获值.HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_1); //停止捕获 或者: __HAL_TIM_DISABLE(&htim5);measure_Cnt++; }}}
3.usrat.c代码添加
/* USER CODE BEGIN 0 */
#include "stdio.h"
/* USER CODE END 0 *//* USER CODE BEGIN 1 */
/*********************************************************
*
*重定义 fputc 函数
*
*********************************************************/
int fputc(int ch,FILE *f)
{HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );return ch;
}
/* USER 4CODE END 1 */
4.main函数
#include "SR04.h"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();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM2_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){SR04_GetData( );HAL_Delay(1500);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
四、运行效果
接线
效果
参考:
https://blog.csdn.net/lwb450921/article/details/123670786
https://www.cnblogs.com/soliang/p/17870635.html