myqiang1990 发表于 2012-12-9 21:02:05

大家来讨论一下步进电机加速方式...

本帖最后由 myqiang1990 于 2012-12-9 21:40 编辑

不是讨论加速曲线(比如直线,S,指数,梯形,不是讨论这类加速曲线),而是加速方式。。。

一般的加速方法就是:按照某种加速曲线公式算出一个加速频率表,然后程序里面按照这张表不断更新定时器初值产生不同的定时中断,在定时中断发脉冲以达到电机加速的目的。
而且这种方式还分两种(据我观察和研究{:smile:} ):
    一种就是分段式加速(特点是:除了有一个频率加速表外,还会有一个每个频点内的步数表):
    分段加速就是把整个加速曲线分段,既分成N个频率点逼近曲线,然后每个频点内会有相应的步数,当走完当前频点步数后才会加或者减到下一个频点。以我的经验,因为我接触到得就是这种加速方式。这种加速方式有个缺点就是在加速得时候计步数容易出错。一些资料说,在某个频点让电机多走几步可以防止电机失步,其实我试验了那么久,确实如此,特别是带动大负载,转动惯量大的。但是我一直就觉得这种方式计步数比较容易出错,特别是在舞台灯这种电机状态变化多端的东西上,感觉计步容易出错。我目前的产品就是用这种分段加速方式的,跑起来好是好,但是感觉控制起来比较复杂,容易出错。下面的资料就是一个典型的分段式加速的全过程。


还有一种我具体不清楚大家是怎么加速的(这种方式的特点就是只有一个加速表,没有频点内步数表),我发现很多人都用这种加速方式。比如下面这些朋友的:
http://www.amobbs.com/thread-4719105-1-1.html
http://www.amobbs.com/forum.php?mod=viewthread&tid=4440711

如果只是按照这上面这两位朋友的加速表加速,虽然能加速,但是感觉不怎么好,我试验过了,只要加上重一点的负载就启动不了。因为加速太快了。我不知道他们怎么就用这么一张表就能加速?不再每个频点多走几步来缓冲,如果电机是转动惯量大的,而且有一定重量得负载,就这么短的加速过程,能启动吗???按照第一个朋友的加速表,对应2细分来加速,貌似还可以,他的加速表是180个频点,如果按照每发一个脉冲(微步脉冲,不是整步脉冲),也就是发了180个微步脉冲就会到最高速,按照2细分,1.8度的步进角算的话,那么就是单片机发了180 / 2 = 90这个整步脉冲后(注意是整步脉冲)也就是电机转过90 * 1.8 = 162度,电机就会达到最高速。貌似还可以用,但是对于大负载来说,貌似有点快了。但是如果把这种表跑128细分,表内每个频点初值按比例缩小1/64..保持加速过程不变...那么当单片机发出180个微步脉冲后电机就会达到最高速,按照128细分算的话,180 / 128 = 1.4个整步..也就是说电机才走了一个整步,也就是电机走了1.4 * 1.8 =2.52度,电机就加到了最高速!!!!电机明显是不能启动的,因为启动时间太短,太快了。才走了1.4个整步(电机转过2.52度)整个加速表就走完了。电机是不可能会动的,严重失步!!!!所以我实在搞不懂用这种方式的朋友是怎么加速,怎么让电机加速过程变得平滑的。难道不能简单的按照这种表来发微步脉冲,软件里面还要做什么特殊处理吗?


除了定时加速外,还有什么加速方法吗??我现在用的是分段式加速,加速过程还可以,很不错,但是控制起来比较麻烦,特别是刚刚写的时候,很容易记错步数。我现在想研究研究其他的加速方式,比如上面那两位朋友的,或者其他的加速方式

shinehjx 发表于 2012-12-9 21:24:55

查表要根据细分数不同作相应调速,不管多少细分,我经验是从起步加速到最高速大约是1/2转完成,轻载1500rpm不掉步

myqiang1990 发表于 2012-12-9 21:33:36

本帖最后由 myqiang1990 于 2012-12-9 21:34 编辑

shinehjx 发表于 2012-12-9 21:24 static/image/common/back.gif
查表要根据细分数不同作相应调速,不管多少细分,我经验是从起步加速到最高速大约是1/2转完成,轻载1500rpm ...

恩。。。但是问题是,比如啊,就第一个连接的网友的加速表,一共180个频点,假如这个表是按照128细分生成的,如果按照一个微步脉冲加速一个频点,那么按照这种表,发出180个微步脉冲后就会达到最高速,也就是电机才走了1.4个整步(180 / 128 = 1.4..按步进角1.8度算)只走了1.4 * 1.8 = 2.5度这样电机就会加到最高速,电机貌似是不会动的,因为太快了,是不是要把表的频点在多加一点?:
曲线表=   
{
    32000,27352,21959,17755,14987,13241,12003,11065,10321, 9711,/*10*/
    9200, 8762, 8383, 8049, 7753, 7488, 7248, 7031, 6832, 6649,/*20*/
    6480, 6324, 6179, 6043, 5917, 5798, 5686, 5580, 5480, 5386,/*30*/
    5296, 5211, 5129, 5052, 4978, 4907, 4840, 4775, 4712, 4653,/*40*/
    4595, 4540, 4486, 4435, 4385, 4337, 4291, 4246, 4203, 4161,/*50*/
    4120, 4080, 4042, 4005, 3969, 3933, 3899, 3866, 3834, 3802,/*60*/
    3771, 3741, 3712, 3684, 3656, 3629, 3602, 3576, 3551, 3526,/*70*/
    3502, 3478, 3455, 3432, 3410, 3388, 3367, 3346, 3326, 3306,/*80*/
    3286, 3267, 3248, 3229, 3211, 3193, 3176, 3159, 3142, 3125,/*90*/
    3109, 3093, 3077, 3061, 3046, 3031, 3016, 3002, 2988, 2974,/*100*/
    2960, 2946, 2933, 2919, 2906, 2894, 2881, 2869, 2856, 2844,/*110*/
    2832, 2821, 2809, 2798, 2786, 2775, 2764, 2754, 2743, 2733,/*120*/
    2722, 2712, 2702, 2692, 2682, 2672, 2663, 2653, 2644, 2635,/*130*/
    2626, 2617, 2608, 2599, 2591, 2582, 2574, 2565, 2557, 2549,/*140*/
    2541, 2533, 2525, 2517, 2509, 2502, 2494, 2487, 2479, 2472,/*150*/
    2465, 2458, 2451, 2444, 2437, 2430, 2423, 2417, 2410, 2403,/*160*/
    2397, 2391, 2384, 2378, 2372, 2366, 2360, 2354, 2348, 2342,/*170*/
    2336, 2330, 2324, 2319, 2313, 2307, 2302, 2296, 2291, 2286,/*180*/
}

shinehjx 发表于 2012-12-9 21:42:46

可以走数步再更新一次频点,也可以将频点加多些,理论上后者更平稳些,我没实际对比过

qwerttt 发表于 2012-12-9 21:43:15

项目原因我习惯用的梯形加速
参考下面文章的算法,好像和LZ的差不多

myqiang1990 发表于 2012-12-9 21:49:16

本帖最后由 myqiang1990 于 2012-12-9 21:50 编辑

shinehjx 发表于 2012-12-9 21:42 static/image/common/back.gif
可以走数步再更新一次频点,也可以将频点加多些,理论上后者更平稳些,我没实际对比过 ...

恩。。从事多年电机控制的朋友跟我说,他说后面那种会比较平稳。。。所以我想换其他加速方式试试。。。不才用分段加速。。

Flyback 发表于 2012-12-9 21:52:30

我现在用脉冲控制伺服也是分段梯形加速的,但是伺服自己是闭环的,只要不让伺服加速度过大就行

预先算好分段表,运行的时候还要根据外部负载做微调,达到在规定的时间内发规定的脉冲数

准备改进方法,边跑变算,负载响应更快

myqiang1990 发表于 2012-12-9 21:54:11

Flyback 发表于 2012-12-9 21:52 static/image/common/back.gif
我现在用脉冲控制伺服也是分段梯形加速的,但是伺服自己是闭环的,只要不让伺服加速度过大就行

预先算好分 ...

这样说你的程序里面除了一张加速表外,还会有一张步数表咯。。呵呵。。。

Flyback 发表于 2012-12-9 22:01:31

myqiang1990 发表于 2012-12-9 21:54 static/image/common/back.gif
这样说你的程序里面除了一张加速表外,还会有一张步数表咯。。呵呵。。。 ...

原本想一步一个频率,使用s曲线加上去,无奈要控制多路伺服,中断太频繁,只能放弃

正在升级的是用stm32做的,103暂时已经很吃紧,不行就上407,哈哈

myqiang1990 发表于 2012-12-9 22:02:40

本帖最后由 myqiang1990 于 2012-12-9 22:03 编辑

Flyback 发表于 2012-12-9 22:01 static/image/common/back.gif
原本想一步一个频率,使用s曲线加上去,无奈要控制多路伺服,中断太频繁,只能放弃

正在升级的是用stm32 ...

你说的一步一个频率,一步指的是一个细分微步,还是一个整步。。。单片机吃紧的话的可以考虑变细分。。。

Flyback 发表于 2012-12-9 22:08:36

myqiang1990 发表于 2012-12-9 22:02 static/image/common/back.gif
你说的一步一个频率,一步指的是一个细分微步,还是一个整步。。。单片机吃紧的话的可以考虑变细分。。。 ...

楼主误会了,我这使用脉冲控制伺服控制器,脉冲比由伺服提供

难度比驱动步进电机小

myqiang1990 发表于 2012-12-9 22:09:49

Flyback 发表于 2012-12-9 22:08 static/image/common/back.gif
楼主误会了,我这使用脉冲控制伺服控制器,脉冲比由伺服提供

难度比驱动步进电机小 ...

哦。。原来如此。。我没控制过伺服电机。。

xxoo14 发表于 2012-12-13 17:34:44

看过很多人做的加速表,一般才255个点,好多的不解

xxoo14 发表于 2012-12-13 17:36:46

myqiang1990 发表于 2012-12-9 22:02 static/image/common/back.gif
你说的一步一个频率,一步指的是一个细分微步,还是一个整步。。。单片机吃紧的话的可以考虑变细分。。。 ...

为什么我做的好S加速表,转速跑到800RPM。在32 和64细分下丢步了,8 4 2 细分下都没丢步,每一个频点保持的都在100个脉冲了

error_dan 发表于 2012-12-13 18:12:36

7L用STM32控制伺服用的是定时的方式还是计数的方式?

chen_ym 发表于 2012-12-13 18:26:56

LZ是做球机的?

xivisi 发表于 2012-12-13 18:35:57

S加速有个 时间常数 该常数是和系统的惯性相关的 负载不一样就不一样,选取合适的时间常数,或者说S曲线的丰满程度{:lol:},可以做到不失步的不过步进电机一般是开环 没反馈的话,不太适合需要动态调整时间常数的控制当然你可以取得大一点,但是速度响应就慢了

myqiang1990 发表于 2012-12-14 17:09:30

本帖最后由 myqiang1990 于 2012-12-14 17:14 编辑

xxoo14 发表于 2012-12-13 17:36 static/image/common/back.gif
为什么我做的好S加速表,转速跑到800RPM。在32 和64细分下丢步了,8 4 2 细分下都没丢步,每一个频点保持 ...

不会吧。。低细分倒不对不?高细分倒丢步?800RMP你的是什么电机?有负载吗。。。

myqiang1990 发表于 2012-12-14 17:14:33

xxoo14 发表于 2012-12-13 17:34 static/image/common/back.gif
看过很多人做的加速表,一般才255个点,好多的不解

我觉得他们不太可能就通过255个脉冲来加速(假如这255个脉冲是按照微步脉冲算的话,如果是整步脉冲倒还可以)。。他们肯定在加速的时候做了处理的了,要么就是按照细分多走对于的细分值,比如128细分就多走128微步,假如一个255个加速脉冲表是按照128细分生成的,然后按照每一个微步一个频点,这是不可能加速的了得~~~算算就知道了。。所以我也不解他们是怎么就用这种表加速的,我觉得他们是在发脉冲的时候做了步数处理的了。~~~

xxoo14 发表于 2012-12-18 23:01:21

myqiang1990 发表于 2012-12-14 17:14 static/image/common/back.gif
我觉得他们不太可能就通过255个脉冲来加速(假如这255个脉冲是按照微步脉冲算的话,如果是整步脉冲倒还可 ...

我现在也做加速,也是查表,点有一千个的样子,加速到3000RPM,越到后面的点,保持的步数越多,那样才能不丢步!!3000转内 ,不论在哪个细分都可以精确控制

xxoo14 发表于 2012-12-18 23:04:05

myqiang1990 发表于 2012-12-14 17:09 static/image/common/back.gif
不会吧。。低细分倒不对不?高细分倒丢步?800RMP你的是什么电机?有负载吗。。。 ...

这个问题已经解决,是PWM时钟频率太低,PWM频率 = 时钟频率/PWM计数值,如果要得到相同的频率,PWM计数值变化一个单位,对应的PWM频率变化值变化量就大。。。。对应的速度变化就大,这样就造成丢步了!!当然还有其他的原因

myqiang1990 发表于 2012-12-18 23:49:32

本帖最后由 myqiang1990 于 2012-12-19 00:22 编辑

xxoo14 发表于 2012-12-18 23:01 static/image/common/back.gif
我现在也做加速,也是查表,点有一千个的样子,加速到3000RPM,越到后面的点,保持的步数越多,那样才能 ...

3000RPM。。。不会吧。。什么电机那么厉害~~你用在哪个方面啊~~~

myqiang1990 发表于 2012-12-18 23:56:32

xxoo14 发表于 2012-12-18 23:01 static/image/common/back.gif
我现在也做加速,也是查表,点有一千个的样子,加速到3000RPM,越到后面的点,保持的步数越多,那样才能 ...

是啊。。频率越高,步数也要多一点。。

zhuzhaokun1987 发表于 2013-8-21 15:13:18

好贴,仔细看了一遍收获大大滴

RGB电子 发表于 2013-8-23 10:25:41

{:smile:}顶

hmd420304805 发表于 2013-8-23 21:24:25

欧姆龙的plc是用每4毫秒升一次频,不知道楼主有没有研究过,我用stm32f1做了一下,效果不是很理想,我用的是双定时器内部级连方式发送脉冲。一个产生pwm一个用来计数,这样cpu就解放出来了。但是频率控制却碰到麻烦。希望和楼主交流。

myxiaonia 发表于 2013-10-29 15:30:31

这个问题是说细分模式变了但是表还是那个表,可以这样子,2细分的话,每个数据用2次,4细分用4次,依次类推,不就是一样了啊 呵呵呵

hzpyl 发表于 2013-10-29 17:24:30

本帖最后由 hzpyl 于 2013-10-29 17:26 编辑

我2细分一般用124步从500Hz升到4000Hz。

到是发现频率不稳定,比较影响失步。

sunchaosq122 发表于 2016-10-9 21:56:03

看看,谢谢分享

netawater 发表于 2016-10-10 13:49:31

多谢分享~~~~

tj00498 发表于 2016-10-18 14:18:26

收获颇多

vivi_cq1982 发表于 2016-11-30 15:11:11

收藏,多谢各位楼主的讨论

likin 发表于 2020-8-5 16:14:11

分频段加速有点麻烦啊,把频点加多点应该是可以{:time:}
页: [1]
查看完整版本: 大家来讨论一下步进电机加速方式...