STM32F4使用增量式编码器的电机速度问题

2019-07-20 01:37发布



              各位朋友,今天遇到个很奇怪的问题,我用的直流电机带增量式编码器,使用TIM5配置为编码器模式,在电机低速情况下,编码器值读取正确,正反转正确,但是当我提高电机的PWM占空比超过50%,编码器的读数值开始出现严重的丢失现象,比如本来电机转一圈读取到4096脉冲数,现在提高速度以后,只能读取到三千多 个脉冲数,不明白为什么电机速度提高会导致编码器丢失脉冲,编码器频响上限是875HZ,电机转速不可能突破这个上限,好着急啊,求大神指点一二,后天要验收了,突然遇到这个问题,心都碎了。编码器配置代码如下:

         void Encoder_Init_TIM5(void)
{
        GPIO_InitTypeDef            GPIO_Initstruc;
        TIM_TimeBaseInitTypeDef     TIM_TimeBaseInit_Struc;
        TIM_ICInitTypeDef           TIM_ICInit_Struc;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);// TIM5时钟使能
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//  GPIOA时钟使能
       
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5);
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_TIM5);//设置PA0和PA1为复用模式
       
        GPIO_Initstruc.GPIO_Mode=GPIO_Mode_AF;
        GPIO_Initstruc.GPIO_OType=GPIO_OType_OD;
        GPIO_Initstruc.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
        GPIO_Initstruc.GPIO_PuPd=GPIO_PuPd_UP;
        GPIO_Initstruc.GPIO_Speed=GPIO_Speed_100MHz;
       
        GPIO_Init(GPIOA,&GPIO_Initstruc);

        TIM_TimeBaseStructInit(&TIM_TimeBaseInit_Struc);
       
        TIM_TimeBaseInit_Struc.TIM_Prescaler=0x00;                  //定时器预分频
        TIM_TimeBaseInit_Struc.TIM_Period=0xffffffff;                     //设定计数器自动重装值
        TIM_TimeBaseInit_Struc.TIM_ClockDivision=TIM_CKD_DIV1;
        TIM_TimeBaseInit_Struc.TIM_CounterMode=TIM_CounterMode_Up;
       
        TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInit_Struc);
       
        TIM_EncoderInterfaceConfig(TIM5,TIM_EncoderMode_TI1,
        TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);          //初始化编码器Tim5为TI1边沿计数
       
        TIM_ICStructInit(&TIM_ICInit_Struc);                         //?????????
        TIM_ICInit_Struc.TIM_ICFilter=10;                            //输入滤波器
       
        TIM_ICInit(TIM5,&TIM_ICInit_Struc);
       
        TIM_ClearFlag(TIM5,TIM_FLAG_Update);
        TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);
        TIM5->CNT=0;
        TIM_Cmd(TIM5,ENABLE);//启动定时器5
}
/******************************************
单位时间读取编码器计数,返回位置值
********************************************/
int Read_Position(u8 TIMX)
{   
    Encoder_TIM= TIM5 -> CNT;
                return Encoder_TIM;
}
/******************************************
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。