OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3847|回复: 20

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

[复制链接]

15

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2015-7-22
在线时间
126 小时
发表于 2017-10-13 15:11:55 | 显示全部楼层 |阅读模式
50金钱
     由于项目对步进电机精度控制的需要,决定引入编码器给步进电机作为反馈。选了一个3600的光栅编码器,用TIM5的编码器模式读取脉冲个数,然后TIM2和TIM4定时器主从模式控制步进电机。发现在从定时器进中断修改主定时器的步数和频率的时候,TIM5读取编码器脉冲个数时会不准。有没有使用过编码器的朋友出来给个建议看看应该怎么控制啊?

最佳答案

查看完整内容[请看2#楼]

后面编码器脉冲式换算为电机步数思路正确;前面的好像有点别扭,我的方式是直接走到目标位置(如200),走完后有误差再修正;ps:这么高线数的编码器得多贵啊?对步进电机来说真的意义不大,选择编码器最多与步进电机的步矩角一致(1.8°),有些驱动IC还带细分,以16细分为例,电机转动一圈脉冲:360/1.8*16=3200;所以选一个最大800线的编码器即可,再大也是浪费的,因为电机转动的分辨率达不到;如果是直流电机就不一样了;从 ...
work is work!!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2017-10-13 15:11:56 | 显示全部楼层
sanv 发表于 2017-10-14 09:27
其实加编码器也没想做成完全闭环的控制。事项实现这样的控制,比如步进电机跑200步能够到达指定位置, ...

后面编码器脉冲式换算为电机步数思路正确;前面的好像有点别扭,我的方式是直接走到目标位置(如200),走完后有误差再修正;ps:这么高线数的编码器得多贵啊?对步进电机来说真的意义不大,选择编码器最多与步进电机的步矩角一致(1.8°),有些驱动IC还带细分,以16细分为例,电机转动一圈脉冲:360/1.8*16=3200;所以选一个最大800线的编码器即可,再大也是浪费的,因为电机转动的分辨率达不到;如果是直流电机就不一样了;从自控控制系统理解,就是执行机构和反馈机构要匹配,只有一方提升性能是不能提升整个系统的性能。
回复

使用道具 举报

1

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2011-12-1
在线时间
110 小时
发表于 2017-10-13 15:53:18 | 显示全部楼层
你这个肯定会有问题的,你如果编码器与步进电机控制在一起的话,定时器进中断,编码器的脉冲数就会丢,而且你的步进电机位置控制与你编码器要高度同步处理,如果一个前一个后的话,你在处理的时候就会出现累积误差。而且一旦你的速度很快就会对单片机的要求很高。一般都是用的FPGA来做精度较高的控制或者用专用的步进电机控制芯片。如果你使用单片机保证编码器读数正确有可能就会造成步进电机控制不准了!
回复

使用道具 举报

15

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2015-7-22
在线时间
126 小时
 楼主| 发表于 2017-10-13 15:59:26 | 显示全部楼层
xlong_06 发表于 2017-10-13 15:53
你这个肯定会有问题的,你如果编码器与步进电机控制在一起的话,定时器进中断,编码器的脉冲数就会丢,而且 ...

那这种方式不能成功吗?因为见网上有人的论文是这么整的,而且用的还是51之类的。编码器+步进电机做成类似闭环控制。
work is work!!!
回复

使用道具 举报

1

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2011-12-1
在线时间
110 小时
发表于 2017-10-13 16:04:05 | 显示全部楼层
sanv 发表于 2017-10-13 15:59
那这种方式不能成功吗?因为见网上有人的论文是这么整的,而且用的还是51之类的。编码器+步进电机做成类 ...

要看你的步进电机速度要求了,如果转的很慢的话,可以处理得过来。如果转的快的话就很难说了。
专业从事软硬件设计,毕业设计,C51/AVR/MSP430/STM32等单片机软硬件制作与定制。有需求的可以联系我。QQ:3436737049淘宝店铺:龙隽电子科技
回复

使用道具 举报

15

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2015-7-22
在线时间
126 小时
 楼主| 发表于 2017-10-13 16:07:57 | 显示全部楼层
xlong_06 发表于 2017-10-13 16:04
要看你的步进电机速度要求了,如果转的很慢的话,可以处理得过来。如果转的快的话就很难说了。

是啊。之前想过这样的方法,就是用一个定时器去输出PWM波控制步进电机转动,然后根据编码器的脉冲数来修改步进电机的步数,但是这样会导致步进电机的转速固定。即使更具步数引入加减速的话,也可能导致不准。
work is work!!!
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2017-10-13 18:08:00 | 显示全部楼层
1、如果按照常规的控制模式控制步进电机,编码器没什么作用;因为步进电机必须有一个加速过程,速度没法突变,否则会失步;也就是说编码器检测到失步,也没法实时修正,只能等待当前动作停止下来再进行修正,当然这样还是有点作用的,实时性差一点而已,目前我就是用这种方式,但产品基本不带编码器,没什么意义;步进电机本来就用于精度要求不高开环场合,要求高的我上直流电机加编码器了,上PID实时性妥妥的;
2、之前有见过一个供应商,做步进电机驱动器,步进电机居然能想伺服电机那样溜,具体什么控制方式我水平有限研究不透;
3、你这个光栅是标准正交编码器吗?如果是正交编码器通过4倍频后,那不得了了;如果不是,那用标准的正交编码器,用stm32定时器的正交编码功能,这样丢脉冲的几率会降低很多;stm32f1定时器很鸡肋只有16位,所以用个100或者400线的正交编码器就可以了,再高stm32f1定时器算不过来,而且高精度编码器比电机贵多了;用正交编码器就简单了,读寄存器值就是编码器脉冲,关键还是算法。
结论:个人觉得步进电机加编码就是浪费(第2点提到的黑科技另外说),要求高精度,那直接用直流电机+编码器(直流伺服电机),速度、力矩、响应时间、控制精度、占用体积都甩步进电机几条街。
回复

使用道具 举报

2

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2013-5-29
在线时间
138 小时
发表于 2017-10-13 18:27:31 | 显示全部楼层
用F4系列32位TIM2,TIM5定时器做正交编码器接口,省了很多事情,只要读取计数器数据就行了.
回复

使用道具 举报

15

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2015-7-22
在线时间
126 小时
 楼主| 发表于 2017-10-14 09:06:39 | 显示全部楼层
eyancool 发表于 2017-10-13 18:27
用F4系列32位TIM2,TIM5定时器做正交编码器接口,省了很多事情,只要读取计数器数据就行了.

是的,通用定时器都有编码器模式,设置一下就能读取数据了。
work is work!!!
回复

使用道具 举报

15

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2015-7-22
在线时间
126 小时
 楼主| 发表于 2017-10-14 09:15:49 | 显示全部楼层
Acuity 发表于 2017-10-13 18:08
1、如果按照常规的控制模式控制步进电机,编码器没什么作用;因为步进电机必须有一个加速过程,速度没法突 ...

  嗯,我们项目精度要求还是蛮高的。然后我们使用的是3600的光栅编码器,四倍频后是14400。16位还是够用的,主要是我们是控制圆盘,计数器的值最大也就14400。步进电机控制是用的TIM2和TIM4,主从定时器模式,主定时器产生PWM,在从定时器中断中修改主定时器的步数和频率,这样来实现加减速的。然后TIM5设置成编码器模式去读光栅的脉冲数。发现,一但步进电机加减速时(其实也就是从定时器进中断了),TIM5读取脉冲数就会丢失。现在考虑TIM5用DMA的方式记录计数值,正在实现中。。。。。
work is work!!!
回复

使用道具 举报

15

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2015-7-22
在线时间
126 小时
 楼主| 发表于 2017-10-14 09:27:01 | 显示全部楼层
Acuity 发表于 2017-10-13 18:08
1、如果按照常规的控制模式控制步进电机,编码器没什么作用;因为步进电机必须有一个加速过程,速度没法突 ...

   其实加编码器也没想做成完全闭环的控制。事项实现这样的控制,比如步进电机跑200步能够到达指定位置,然后我先让步进电机跑198步,然后根据编码器的值来一步一步的让步进电机接近目标位置。编码器的z轴接到外部中断了,当检测到z轴中断来时,编码器计数值被置零。这样编码器的计数值和圆盘360°的每一个角度都有一个固定的对应关系。也是说比如我要让圆盘转动20°,对应的编码器计数值是3000,步进电机步数是200,然后我让步进电机跑198步,编码器计数值是2800,然后步进电机一步一步的跑,对比编码器计数值是不是等于3000,等于3000了就停下来。想法是这样的,不知兄台意下如何?
work is work!!!
回复

使用道具 举报

15

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2015-7-22
在线时间
126 小时
 楼主| 发表于 2017-10-14 09:38:49 | 显示全部楼层
Acuity 发表于 2017-10-13 18:08
1、如果按照常规的控制模式控制步进电机,编码器没什么作用;因为步进电机必须有一个加速过程,速度没法突 ...

   之所以想做成这样的控制是因为圆盘虽然是步进电机带动的,但是是通过皮带把两个齿轮连起来的,然后传动比也不是整数,这样一来,圆盘需要转20°步进电机对应的步数就不是一个对应的固定步数,控制起来很麻烦,然后我们就像到了这种策略。不知兄台是否有更好的建议。谢谢
work is work!!!
回复

使用道具 举报

15

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2015-7-22
在线时间
126 小时
 楼主| 发表于 2017-10-14 10:59:48 | 显示全部楼层
Acuity 发表于 2017-10-14 10:30
后面编码器脉冲式换算为电机步数思路正确;前面的好像有点别扭,我的方式是直接走到目标位置(如200), ...

是啊,主要是还有16细分,编码器是硬件和结构选的,项目也不在意这些浪费。你这个直接走目标步数的方案应该更好。然后我现在很困扰,TIM5使用编码器模式没有办法时时刻刻准确读取编码器的脉冲数,一但MCU去处理中断了,编码器读数肯定会丢失,丢失了就不能根据这个计数值去确定相应的位置了。
work is work!!!
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2017-10-14 11:09:15 | 显示全部楼层
sanv 发表于 2017-10-14 10:59
是啊,主要是还有16细分,编码器是硬件和结构选的,项目也不在意这些浪费。你这个直接走目标步数的方案应 ...

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

使用道具 举报

15

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2015-7-22
在线时间
126 小时
 楼主| 发表于 2017-10-14 11:18:14 | 显示全部楼层
Acuity 发表于 2017-10-14 11:09
编码器不要用Z相,用得不好效果更差;我只用到A、B相,固定周期读取寄存器数值;中断不会导致丢失脉冲数  ...

  STM32编码器模式能够设置读取寄存器的时间吗?我以为是固定的呢?请教如何设置谢谢。
work is work!!!
回复

使用道具 举报

15

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2015-7-22
在线时间
126 小时
 楼主| 发表于 2017-10-14 11:20:55 | 显示全部楼层
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的时候是否可以通过设置中断优先级之类的调整读取先后顺序?
work is work!!!
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2017-10-14 11:28:41 | 显示全部楼层
sanv 发表于 2017-10-14 11:18
STM32编码器模式能够设置读取寄存器的时间吗?我以为是固定的呢?请教如何设置谢谢。

我指的不是这个意思,是你的应用程序定时去获取这个寄存器的的脉冲值,然后处理。
回复

使用道具 举报

15

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2015-7-22
在线时间
126 小时
 楼主| 发表于 2017-10-14 11:34:52 | 显示全部楼层
Acuity 发表于 2017-10-14 11:28
我指的不是这个意思,是你的应用程序定时去获取这个寄存器的的脉冲值,然后处理。

如果是硬件记录的话计数值应该不会不准的吧。就我目前测试的情况,好像是因为中断导致TIM5编码器模式在计数时候TIM5->CNT的计数值变少了。
work is work!!!
回复

使用道具 举报

15

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2015-7-22
在线时间
126 小时
 楼主| 发表于 2017-10-14 11:52:53 | 显示全部楼层
Acuity 发表于 2017-10-14 11:28
我指的不是这个意思,是你的应用程序定时去获取这个寄存器的的脉冲值,然后处理。

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

使用道具 举报

34

主题

322

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1838
金钱
1838
注册时间
2014-12-4
在线时间
717 小时
发表于 2017-10-14 11:58:53 | 显示全部楼层
有可能转速太快编码器的光栅红外检测响应时间不够
回复

使用道具 举报

15

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2015-7-22
在线时间
126 小时
 楼主| 发表于 2017-10-14 12:08:38 | 显示全部楼层
loudianxin 发表于 2017-10-14 11:58
有可能转速太快编码器的光栅红外检测响应时间不够

嗯,也有考虑到这个问题。但是查看编码器的手册之后排除了,因为编码器还算是比较高端一点的了,检测时间是足够的,而且我们的运行速度也不快。
work is work!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 13:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表