/* USER CODE BEGIN 4 */
// 1. Улучшенный выстрел (как просил препод: без while)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM1) // Тик 1 мс
{
// Если счетчик равен 0, выключаем сигнал Trig (PA3)
if (SonarTimeoutCnt == 0) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
}
if (SonarTimeoutCnt >= SonarTimeout)
{
// Настало время выстрела (раз в 50 мс)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
SonarTimeoutCnt = 0; // Сброс, на следующем тике (через 1мс) Trig выключится
}
else {
SonarTimeoutCnt++;
}
}
}
// 2. Новая логика Эхо (Input Capture)
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM2 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)
{
if (is_first_edge) // Поймали начало импульса (Rising Edge)
{
capture_start = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3);
// Сразу перенастраиваем железо ловить спад (Falling Edge)
__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_FALLING);
is_first_edge = 0;
}
else // Поймали конец импульса (Falling Edge)
{
capture_end = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3);
uint32_t diff = 0;
if (capture_end > capture_start) {
diff = capture_end - capture_start;
} else {
// Обработка переполнения таймера
diff = (0xFFFFFFFF - capture_start) + capture_end;
}
distance_cm = diff / 58; [span_3](start_span)// Итоговые сантиметры[span_3](end_span)
// Возвращаем полярность на начало (Rising Edge) для следующего раза
__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_RISING);
is_first_edge = 1;
}
}
}
/* USER CODE END 4 */