1
0
forked from EN/Car
Car/Core/Src/hcsr04.c

86 lines
2.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "hcsr04.h"
#include "tim.h"
// time 的单位是 μs
uint64_t time; // 声明变量,用来计时
uint64_t time_end; // 声明变量,存储回波信号时间
uint8_t state = 1;
// HACK 临时的 delay 解决方法
void delay_us(uint16_t us);
int16_t sonar_mm(void) // 测距并返回单位为毫米的距离结果
{
uint32_t distance, distance_mm = 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) // 判断是否小于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;
}
void delay_us(uint16_t us)
{
HAL_TIM_Base_Start_IT(&htim2);
time = 0;
while (time < us)
;
HAL_TIM_Base_Stop_IT(&htim2);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim == &htim2)
++time;
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == SDA_C_EXTI12_Pin)
{
if (HAL_GPIO_ReadPin(SDA_C_EXTI12_GPIO_Port, SDA_C_EXTI12_Pin))
{
HAL_TIM_Base_Start_IT(&htim2);
time = 0;
}
else
{
time_end = time;
HAL_TIM_Base_Stop_IT(&htim2);
state = 0;
}
}
}