Загрузка данных


  /* 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 */