/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim1); // Запуск метронома выстрелов (1 мс)
// Запуск двух каналов для ПРАВОГО датчика (TIM4, пин PB6)
HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_2);
// Запуск двух каналов для ЛЕВОГО датчика (TIM2, пин PA1)
// (Обычно для PA1 прямой канал - это CH2, а косвенный - CH1)
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);
/* USER CODE END 2 */
/* USER CODE BEGIN 4 */
// 1. Будильник 1 мс (Стреляет общим пином PB5 каждые 50 мс)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM1)
{
if (SonarTimeoutCnt == 0) {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
}
if (SonarTimeoutCnt >= SonarTimeout)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
SonarTimeoutCnt = 0;
}
else {
SonarTimeoutCnt++;
}
}
}
// 2. Универсальный обработчик захвата (сразу для обоих датчиков)
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
// ================= ПРАВЫЙ ДАТЧИК (TIM4, пин PB6) =================
// Допустим, Channel 2 ловит конец эха (спад)
if (htim->Instance == TIM4 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
{
// Читаем время старта (с 1-го канала) и время финиша (со 2-го канала)
uint32_t rise_time = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
uint32_t fall_time = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
uint32_t diff = 0;
if (fall_time >= rise_time) {
diff = fall_time - rise_time;
} else {
diff = (0xFFFF - rise_time) + fall_time; // TIM4 - 16 бит (максимум 0xFFFF)
}
dist_right_cm = diff / 58;
}
// ================= ЛЕВЫЙ ДАТЧИК (TIM2, пин PA1) =================
// Пин PA1 жестко привязан к TIM2_CH2. Значит прямой (подъем) - это CH2, а косвенный (спад) - это CH1.
if (htim->Instance == TIM2 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
// Читаем время старта (с 2-го канала) и время финиша (с 1-го канала)
uint32_t rise_time = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
uint32_t fall_time = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
uint32_t diff = 0;
if (fall_time >= rise_time) {
diff = fall_time - rise_time;
} else {
diff = (0xFFFFFFFF - rise_time) + fall_time; // TIM2 - 32 бит (максимум 0xFFFFFFFF)
}
dist_left_cm = diff / 58;
}
}
/* USER CODE END 4 */