1

我尝试将旋转编码器与 STM32F7 连接。计时器 (TIM1) 应在 0-100 之间计数一个值,并在每次增加或减少该值时触发中断。

计数有效,但我只能在每个更新事件上配置一个中断。(如果计数器上溢/下溢)

如何配置这样的计时器?

在此处输入图像描述

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__);
  }

}
4

3 回答 3

0

您可以使用STM32F030F4P6 的边沿检测器触发器 TI1F_ED 示例:

/* Trigger Edge Detector */
/* 100: TI1 Edge Detector (TI1F_ED) */
TIM3->SMCR &= ~(TIM_SMCR_TS_0 | TIM_SMCR_TS_1);
TIM3->SMCR |= TIM_SMCR_TS_2;
/* 1: Trigger interrupt enabled. */
TIM3->DIER |= TIM_DIER_TIE;
NVIC_EnableIRQ(TIM3_IRQn);

void TIM3_IRQHandler(void){
    if(TIM3->SR & TIM_SR_TIF){
        
    /* Here code */
    
        /* Interrupt enabled */
        TIM3->SR &= ~TIM_SR_TIF;
    }
}

更多信息:https: //www.youtube.com/watch ?v=1CPk9UD4440 https://cxemka.com/71-podklyuchenie-enkodera-dupa-k-stm32-cmsis-i-hal.html

于 2020-12-01T14:05:57.960 回答
-1

我相信捕获中断机制可以在编码器模式下工作,因此TIM1->DIER |= TIM_DIER_CC1IE每次计数器变化时设置都应该产生一个中断。

如果上述方法不起作用,则在另一个输入引脚上设置一个 EXTI 中断,即映射到通道 2 的那个,它不会直接改变计数器。这样,您将获得计数器值的稳定读数。

于 2019-04-22T13:47:30.193 回答
-2

不可能直接 - 但您可以设置 PWM,然后在该线上设置 EXTI 中断。

于 2019-04-19T18:12:49.947 回答