提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
stm32使用hal库驱动HC04超声波。
提示:以下是本篇文章正文内容,下面案例可供参考
一、超声波模块简介
1)以上时序图表明只需要给TX提供一个10uS以上脉冲触发信号,一般给定15us的高电平时间,该模块内部将自动发出8个40kHz周期电平并检测回波。
2)一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。公式: uS/58=厘米或者uS/148=英寸;或是:距离=高电平时间*声速(340M/S)
二、使用步骤
1.配置定时器2函数
1)使用定时器2计时,定时1ms,计数1000,(Prescaler=72-1,Period=1000-1)也就是1ms进入一次中断,1个计数为1us,
定时器2初始化代码(示例):
uint16_t overcount; /* USER CODE END 0 */ TIM_HandleTypeDef htim2; /* TIM2 init function */ void MX_TIM2_Init(void) { /* USER CODE BEGIN TIM2_Init 0 */ /* USER CODE END TIM2_Init 0 */ TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; /* USER CODE BEGIN TIM2_Init 1 */ /* USER CODE END TIM2_Init 1 */ htim2.Instance = TIM2; htim2.Init.Prescaler = 71; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 999; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; if (HAL_TIM_Base_Init(&htim2) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM2_Init 2 */ /* USER CODE END TIM2_Init 2 */ }
2)编写中断回调函数void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { static uint16_t count; if(htim == &htim2) { overcount++; } }
2.测距函数
进行5次测距再取平均值以更稳定,代码如下(示例):
#include "main.h"
#include "Delay.h"
#include "tim.h"
extern uint16_t overcount;
float Get_Distance_one(void)
{
float Dis;
int16_t Tim2_count;
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6, GPIO_PIN_SET);
Delay_us(15);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6, GPIO_PIN_RESET);
while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_7) == RESET);
HAL_TIM_Base_Start(&htim2);
while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_7) == SET);
HAL_TIM_Base_Stop(&htim2);
Tim2_count = __HAL_TIM_GET_COUNTER(&htim2);
Dis = (Tim2_count + overcount * 1000)/58.0;
__HAL_TIM_SET_COUNTER(&htim2,0);
overcount = 0;
return Dis;
}
float Get_Distance(void)
{
uint8_t i;
float sum;
for(i =0;i<5;i++)
{
sum = sum + Get_Distance_one();
}
return sum/5.0;
}
3.主函数
int main(void)
{
/* USER CODE BEGIN 1 */
float Distan;
/* 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();
/* USER CODE BEGIN 2 */
Delay_Init();
OLED_Init();
HAL_TIM_Base_Start_IT(&htim2);
HAL_TIM_Base_Stop(&htim2);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
Distan = Get_Distance();
OLED_ShowNum(40,1,Distan,3,OLED_8X16);
OLED_Update();
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
/* USER CODE END 3 */
}