增量编码器在步进电机控制中的使用

2019-08-13 19:53发布

     由于项目对步进电机精度控制的需要,决定引入编码器给步进电机作为反馈。选了一个3600的光栅编码器,用TIM5的编码器模式读取脉冲个数,然后TIM2和TIM4定时器主从模式控制步进电机。发现在从定时器进中断修改主定时器的步数和频率的时候,TIM5读取编码器脉冲个数时会不准。有没有使用过编码器的朋友出来给个建议看看应该怎么控制啊?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
20条回答
sanv
2019-08-16 15:02
Acuity 发表于 2017-10-14 11:09
编码器不要用Z相,用得不好效果更差;我只用到A、B相,固定周期读取寄存器数值;中断不会导致丢失脉冲数  ...

贴上我设置TIM5编码器模式的代码

void TIM5_Encoder_Init(void)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_ICInitTypeDef TIM_ICInitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
        TIM_DeInit(TIM5);

        TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);//时间基数单位初始化为默认值。

        TIM_TimeBaseStructure.TIM_Period = 14396;//3600*4 -4,计数器预装载值。完成一圈时的总计数值。
        TIM_TimeBaseStructure.TIM_Prescaler = 0;//预分频系数为0,即不进行预分频
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//设置时钟分割 T_dts = T_ck_int
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数
        TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);

        TIM_EncoderInterfaceConfig(TIM5, TIM_EncoderMode_TI12, TIM_ICPolarity_BothEdge ,TIM_ICPolarity_BothEdge);//使用编码器模式3,上升下降都计数(4倍频)

        TIM_ICStructInit(&TIM_ICInitStructure);//将结构体中的内容缺省输入

        TIM_ICInitStructure.TIM_ICFilter = 4;//选择输入比较滤波器
        TIM_ICInit(TIM5, &TIM_ICInitStructure);

        TIM5->CNT = 0;
        TIM_Cmd(TIM5,ENABLE);

}

这样设置完TIM5->CNT的读取时间如何设置?还有读取TIM5->CNT的时候是否可以通过设置中断优先级之类的调整读取先后顺序?

一周热门 更多>