我尝试将旋转编码器与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__);
}
}
答案 0 :(得分:0)
您可以使用边缘检测器触发器 TI1F_ED STM32F030F4P6示例:
/* 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
答案 1 :(得分:-1)
设置一个比较器,然后在每个比较器中断处增加比较器阈值(TIMx_CCRx)。计时器应计数足够慢,以允许CPU在达到新阈值之前退出中断。将阈值(TIMx_CNT + 1)设置为阈值也可以很聪明,以确保中断已及时执行(否则您可以在下一个中断之前等待整个计时器周期)
达米亚诺
答案 2 :(得分:-1)
我相信捕获中断机制将在编码器模式下工作,因此每次计数器更改时,设置TIM1->DIER |= TIM_DIER_CC1IE
都会产生一个中断。
如果上述方法不起作用,则在其他输入引脚上设置一个EXTI中断,即映射到通道2的一个中断,该中断不会直接更改计数器。这样,您将获得稳定的计数器值读数。
答案 3 :(得分:-2)
这不可能直接实现-但是您可以使用设置PWM,然后在该行上设置EXTI中断。