Как настроить таймер STM32 для запуска прерывания при каждом увеличении / уменьшении? - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь связать поворотный энкодер с STM32F7.Таймер (TIM1) должен считать значение от 0 до 100 и инициировать прерывание каждый раз, когда значение увеличивается или уменьшается.

Подсчет работает, но я могу настроить прерывание только для каждого события обновления.(если счетчик переполнен / потерян)

Как настроить такой таймер?

enter image description here

static void MX_TIM1_Init(void)
{

  TIM_Encoder_InitTypeDef sConfig;
  TIM_MasterConfigTypeDef sMasterConfig;

  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 0;
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 99;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  sConfig.EncoderMode = TIM_ENCODERMODE_TI1;
  sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
  sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
  sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
  sConfig.IC1Filter = 0;
  sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
  sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
  sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
  sConfig.IC2Filter = 0;
  if (HAL_TIM_Encoder_Init(&htim1, &sConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

Ответы [ 3 ]

0 голосов
/ 19 апреля 2019

Это невозможно напрямую - но вы можете установить ШИМ с помощью, а затем установить прерывание EXTI на этой линии.

0 голосов
/ 22 апреля 2019

Я считаю, что механизм прерывания захвата будет работать в режиме кодера, поэтому настройка TIM1->DIER |= TIM_DIER_CC1IE должна генерировать прерывание каждый раз, когда меняется счетчик.

Если вышеприведенное не работает, тогда установите прерывание EXTI на другом входном выводе , то есть на том, который привязан к каналу 2, который не изменяет счетчик напрямую. Таким образом, вы получите стабильное значение счетчика.

0 голосов
/ 18 апреля 2019

Настройте компаратор, затем при каждом прерывании компартмента увеличивайте порог компаратора (TIMx_CCRx).Таймер должен считать достаточно медленным, чтобы процессор мог выйти из прерывания до того, как будет достигнут новый порог.Также может быть разумно ввести в пороговое значение (TIMx_CNT + 1), чтобы убедиться, что прерывание было выполнено во времени (иначе вы могли бы подождать весь период таймера до следующего прерывания)

Дамиано

...