求助诸位大神!鄙人采用STM32F407VET6的TIM2,3,4,5的CH1和CH2来对用于电机的增量光电编码器进行测速。每次芯片复位初始化之后,在定时器中断未发生的时候(向上向下均未溢出过的情况下),TIMX->CNT的数值都还算正常。在发生中断之后,原本转一圈计数2000次变成了转好几圈计数也不过100次的情况,非常奇怪!四个定时器的效果都是这样。
以下是鄙人的初始化程序,以TIM2为例:
[mw_shl_code=c,true]RCC->APB1ENR|=1<<0;
RCC->AHB1ENR|=1<<0;
RCC->AHB1ENR|=1<<1;
GPIO_Set(GPIOA,PIN15,
GPIO_MODE_AF,GPIO_OTYPE_OD,
GPIO_SPEED_50M,GPIO_PUPD_NONE);
GPIO_AF_Set(GPIOA,15,1);
GPIO_Set(GPIOB,PIN3,
GPIO_MODE_AF,GPIO_OTYPE_OD,
GPIO_SPEED_50M,GPIO_PUPD_NONE);
GPIO_AF_Set(GPIOB,3,1);//Set CH1 CH2
TIM2->DIER|=1<<0; //Enable Interrupt
TIM2->DIER|=1<<6; //Tigger Interrupt
TIM2->ARR=1999;
TIM2->PSC=41;
TIM2->CR1&=~(3<<8); //Keep Original Frequency
TIM2->CR1&=~(3<<5); //Align to Sides
TIM2->CCMR1|=1<<0; //CC1S Project IC1 to TI1
TIM2->CCMR1|=1<<8; //CC2S Project IC2 to TI2
TIM2->CCER&=0XFF55; //Trigger at Upper Impulse
TIM2->CCMR1|=3<<4; //IC1F FILTER MODE 0011
TIM2->CCMR1|=3<<12; //IC2F FILTER MODE 0011
TIM2->SMCR|=3<<0; //Encoder Mode
TIM2->CNT=1000; //Start to Count from the number
TIM2->CR1|=1<<0; //Enable Timer
MY_NVIC_Init(0,2,TIM2_IRQn,2);[/mw_shl_code]
然后这是中断函数:
[mw_shl_code=c,true]void TIM2_IRQHandler(void)//Encoder 1
{
if(TIM2->SR&0X0001)
{
if (Encoder_Status&(1<<0))
{
if (TIM2->CNT>=Encoder_Start[0])
{
Encoder_Cycle_Raw[0]--;
}
else
{
Encoder_Cycle_Raw[0]++;
}
}
}
TIM2->SR&=~(1<<0);
}[/mw_shl_code]
由于项目急着要用,时间相对较为紧急,恳请诸位大神求助!另如果有高人有寄存器版本的亲测可用的F4的编码器模式初始话函数能够分享,鄙人将不胜感激!
另如果有其他要补充的信息,请随时留言!
谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>