打印

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

[复制链接]
707|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
各位朋友,今天遇到个很奇怪的问题,我用的直流电机带增量式编码器,使用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;
}
/******************************************

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

437

主题

437

帖子

0

粉丝