F407定时器的编码器模式测电机转速,求助,急急急!

2019-07-20 21:10发布

本人用407的板子驱动1524电机转动,由于其内部自带的编码器,所有用TIM4的编码器模式捕获脉冲,来计算速度,我估计在定时器、IO口初始化部分都没有错,应该是在采集脉冲时候的处理出错了,
我是用定时器14产生PWM波驱动电机,连接了一个L298N的驱动模块,,这样可以很方便的驱动电机正转,反转,停止,加速减速
用定时器4的编码器模式来捕获编码器产生的脉冲个数Num,然后用定时器3定时100MS,速度就可以算出了,speed = (Num*600)/(4*512)  (r/min)  1524电机转一圈,编码器会产生512个脉冲

我贴出来,我的定时器3的中断处理函数,也就是检测100ms内计数脉冲个数,里面的错误还希望各位大神给我指出
void TIM3_IRQHandler(void)  
{
        if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)
        {       
                curCount = TIM_GetCounter(TIM4);
                if(curCount >= lastCount)
                {
                                speed = curCount - lastCount;
                }
                else  //如果定时器4计数溢出
                {
                                speed = curCount + 65535 - lastCount;
                }
                lastCount = curCount;
                TIM4_CAP_STA = 0x80;
        }
                TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}


//主函数
u8 TIM4_CAP_STA;
u16 Num;
int main(void)
{
        u32 temp = 0;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        delay_init(168);
        uart_init(115200);
       
        TIM14_PWM_Init(500-1,84-1);       
        OUT_Init();  
        TIM4_ENcoder_Init();
        TIM3_Int_Init(1000-1,8400-1); //定时100ms
       
        TIM_SetCompare1(TIM14,100);               
        GPIO_SetBits(GPIOF,GPIO_Pin_10);           //IN1 = 0
        GPIO_ResetBits(GPIOF,GPIO_Pin_12);        //IN2=0
   while(1)
        {       
                if(TIM4_CAP_STA&0x80)
                {       
                        temp = Num/(4*512);
                        temp *= 600;
                        printf("速度:%d r/min ",temp);
                        delay_ms(50);
                }

        }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。