/* USER CODE BEGIN 4 */
// 1. Будильник 1 мс (Стреляет общим пином PB5)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM1)
{
// Выключаем Trig на PB5, если счетчик на нуле
if (SonarTimeoutCnt == 0) {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
}
if (SonarTimeoutCnt >= SonarTimeout)
{
// Включаем Trig на PB5 (стреляют оба датчика одновременно)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
SonarTimeoutCnt = 0;
}
else {
SonarTimeoutCnt++;
}
}
}
// 2. Input Capture для ПРАВОГО датчика (Ловит эхо на PB6 / TIM4_CH1)
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM4 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
if (is_first_edge) // Поймали старт эха
{
capture_start = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);
is_first_edge = 0;
}
else // Поймали конец эха
{
capture_end = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
uint32_t diff = 0;
if (capture_end > capture_start) {
diff = capture_end - capture_start;
} else {
// Переполнение 16-битного таймера (максимум 0xFFFF)
diff = (0xFFFF - capture_start) + capture_end;
}
dist_right_cm = diff / 58; // Считаем дистанцию
__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
is_first_edge = 1;
}
}
}
/* USER CODE END 4 */