From 0bce1acabd6e77aaa6a770d30e2f24f153639da4 Mon Sep 17 00:00:00 2001 From: EN Date: Fri, 12 Jul 2024 23:00:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=B6=85=E5=A3=B0=E6=B3=A2?= =?UTF-8?q?=E6=B5=8B=E8=B7=9D=E6=A8=A1=E5=9D=97=EF=BC=8C=E4=BB=85=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E6=AF=AB=E7=B1=B3=E8=B7=9D=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Core/Inc/hcsr04.h | 3 +-- Core/Src/hcsr04.c | 54 ++++++++++++----------------------------------- 2 files changed, 15 insertions(+), 42 deletions(-) diff --git a/Core/Inc/hcsr04.h b/Core/Inc/hcsr04.h index 9c00c39..e890867 100644 --- a/Core/Inc/hcsr04.h +++ b/Core/Inc/hcsr04.h @@ -3,7 +3,6 @@ #include "main.h" -int16_t sonar_mm(void); -float sonar(void); +uint16_t sonar(void); #endif diff --git a/Core/Src/hcsr04.c b/Core/Src/hcsr04.c index 95a164e..3cca771 100644 --- a/Core/Src/hcsr04.c +++ b/Core/Src/hcsr04.c @@ -1,54 +1,28 @@ #include "hcsr04.h" #include "tim.h" -// time 的单位是 μs -static uint64_t time; // 声明变量,用来计时 -static uint64_t time_end; // 声明变量,存储回波信号时间 -static uint8_t state = 1; +// time 的单位是 1μs +static volatile uint64_t time; // 声明变量,用来计时 +static uint64_t time_end; // 声明变量,存储回波信号时间 +static uint8_t state = 0; // HACK 临时的 delay 解决方法 void delay_us(uint16_t us); -int16_t sonar_mm(void) // 测距并返回单位为毫米的距离结果 +uint16_t sonar(void) // 测距并返回单位为毫米的距离结果 { - uint32_t distance, distance_mm = 0; + // 超时则返回5m距离 + uint32_t distance = 5000; HAL_GPIO_WritePin(SCL_C_GPIO_Port, SCL_C_Pin, GPIO_PIN_SET); // 输出高电平 delay_us(15); // 延时15微秒 HAL_GPIO_WritePin(SCL_C_GPIO_Port, SCL_C_Pin, GPIO_PIN_RESET); // 输出低电平 - while (state) - ; - state = 1; + // HACK 考虑RTOS优化 + HAL_Delay(15); - // BUG 现在 time 的单位是 1μs - if (time_end / 100 < 38) // 判断是否小于38毫秒,大于38毫秒的就是超时,直接调到下面返回0 - { - distance = (time_end * 346) / 2; // 计算距离,25°C空气中的音速为346m/s - distance_mm = distance / 100; // 因为上面的time_end的单位是10微秒,所以要得出单位为毫米的距离结果,还得除以100 - } - return distance_mm; // 返回测距结果 -} - -float sonar(void) // 测距并返回单位为米的距离结果 -{ - uint32_t distance, distance_mm = 0; - float distance_m = 0; - HAL_GPIO_WritePin(SCL_C_GPIO_Port, SCL_C_Pin, GPIO_PIN_SET); // 输出高电平 - delay_us(15); // 延时15微秒 - HAL_GPIO_WritePin(SCL_C_GPIO_Port, SCL_C_Pin, GPIO_PIN_RESET); // 输出低电平 - - while (state) - ; - state = 1; - - // BUG 现在 time 的单位是 1μs - if (time_end / 100 < 38) - { - distance = (time_end * 346) / 2; - distance_mm = distance / 100; - distance_m = distance_mm / 1000; - } - return distance_m; + if (state) + distance = time_end * 346 / 2000; // 计算距离,25°C空气中的音速为346m/s + return distance; } void delay_us(uint16_t us) @@ -72,14 +46,14 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (HAL_GPIO_ReadPin(SDA_C_EXTI12_GPIO_Port, SDA_C_EXTI12_Pin)) { - HAL_TIM_Base_Start_IT(&htim2); time = 0; + HAL_TIM_Base_Start_IT(&htim2); } else { time_end = time; HAL_TIM_Base_Stop_IT(&htim2); - state = 0; + state = 1; } } }