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

2019-08-13 19:53发布

     由于项目对步进电机精度控制的需要,决定引入编码器给步进电机作为反馈。选了一个3600的光栅编码器,用TIM5的编码器模式读取脉冲个数,然后TIM2和TIM4定时器主从模式控制步进电机。发现在从定时器进中断修改主定时器的步数和频率的时候,TIM5读取编码器脉冲个数时会不准。有没有使用过编码器的朋友出来给个建议看看应该怎么控制啊?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
20条回答
Acuity
1楼-- · 2019-08-16 06:52
sanv 发表于 2017-10-14 10:59
是啊,主要是还有16细分,编码器是硬件和结构选的,项目也不在意这些浪费。你这个直接走目标步数的方案应 ...

编码器不要用Z相,用得不好效果更差;我只用到A、B相,固定周期读取寄存器数值;中断不会导致丢失脉冲数 啊,脉冲计算是单片机内部硬件自动计算的,只是你读取其脉冲数的周期决定你的实时性;无须时时刻刻读取,一般根据你电机最大转速来估算一个读取周期,比如10ms或者1ms读取周期即可,保证一个读取周期内单片机定时器计数不溢出(16位定时器);
sanv
2楼-- · 2019-08-16 12:48
Acuity 发表于 2017-10-14 11:09
编码器不要用Z相,用得不好效果更差;我只用到A、B相,固定周期读取寄存器数值;中断不会导致丢失脉冲数  ...

  STM32编码器模式能够设置读取寄存器的时间吗?我以为是固定的呢?请教如何设置谢谢。
sanv
3楼-- · 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的时候是否可以通过设置中断优先级之类的调整读取先后顺序?
Acuity
4楼-- · 2019-08-16 18:21
sanv 发表于 2017-10-14 11:18
STM32编码器模式能够设置读取寄存器的时间吗?我以为是固定的呢?请教如何设置谢谢。

我指的不是这个意思,是你的应用程序定时去获取这个寄存器的的脉冲值,然后处理。
sanv
5楼-- · 2019-08-16 22:28
 精彩回答 2  元偷偷看……
sanv
6楼-- · 2019-08-17 01:26
Acuity 发表于 2017-10-14 11:28
我指的不是这个意思,是你的应用程序定时去获取这个寄存器的的脉冲值,然后处理。

   我是想在步进电机运行相应步数之后去读取这个TIM5->CNT的值和初始化时候的读值进行比较。发现有偏差,经过验证编码器计数应该向你说的一样是硬件读取的,MCU产生中断什么的不影响计数,出现差错应该是其他地方的问题,我找找原因。稍后结贴给悬赏分。谢谢。

一周热门 更多>