打印

2相步进电机PWM控制研究和分享

[复制链接]
18037|31
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mugenwon|  楼主 | 2011-10-6 10:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人做步进电机的控制,只有2个月左右。没有任何代码和完整资料可以参考,但因为市场不等人,必须做出来。可以说是想破头白发都多了很多根。最后还是勉强做出来了,但感觉不够好,这里分享一下,也希望有经验的高手能分享一下自己的经验甚至指点一下小弟。

控制芯片AVRMEGA168
电机 2相步进电机1.8度,200步,4线制
驱动芯片,保密。(原因不是因为什么,是不想被某些人知道在什么行业工作甚至知道是什么厂家的,他们挺小心不愿透漏技术)

芯片性能,主要是有8位PWM定时器0,16位PWM定时器1,8位PWM定时器2.每个定时器都有2个脚能直接输出PWM波形。正好能控制3个步进电机。步进电机每组一头接一个pwm的脚,另一个脚用普通IO口。这样通过控制普通IO的高低,还有PWM的脚,就能控制电机运行。

目前,我只需要控制2个电机。用了定时器0和1,定时器2刚好用来定时用。有些设备3个都用上,要用普通定时功能的话,计数到顶,就进入中断,也可以做到定时。当然这样就不能非常精确的定时,但一般来说也没问题。

//======================================
//以上是例汤,以下才是主盘
//======================================
void main(void)
{    帖子2();

}

相关帖子

沙发
mugenwon|  楼主 | 2011-10-6 11:22 | 只看该作者
步进电机,太基础的就不说了,反正一个脉冲就是一步。这样是我没法用的。必须用细分。没有细分驱动器,全靠cpu搞定。用256细分。正好8位PWM都用上了。在直角坐标系,画一个圆圈。x轴和y轴分别代表电机两个线圈,把一个象限的1/4圆,分成256等份。每一条等分线和圈相交的点,对应的xy坐标,就是这些细分角度对应的力大小,还有方向。也就是,圆半径乘以正弦,余弦。这样自己做个excel表格,就能算出256细分对应的pwm电流数据,要改变力大小,改圆半径即可。

有了细分表,事情就解决了一半。那么说说电机运行的要求:
要从转很慢(目前最慢是0.026圈/秒)到3.4圈/秒,开环控制,不能丢步,要平滑加减速不震荡,而且反应要很快,要在2秒内从0加速到最高,或者减速到0,或者掉头。当然不是只有电机自己在转,他带动一个比较重的东西。

控制电机转速,只能控制每步走的间隔。时间间隔,或者每次走步数不同(256细分,一次可以走任意步,但不能超过256)
搞了很久终于有2套方案:
第一个就是,每次都走一细分步,每步之间通过修改时间来产生加减速的效果
第二个就是,每次走的时间一样,但每次走的步数不同,也能达到加减速效果
还有个方案,两个同时修改,太复杂没认真想过算法。
还有个更变态的,时间,步数,连电流也即时改变,更复杂从没想过要去研究。

方案1的优点是,容易控制,但是,要控制时间,必须用定时器,如果只有一个定时器,就很难同时控制2个甚至3个电机。定时器可以把定时值搞很小,通过累加的办法,同时控制3个电机。但这样做也有问题。当定时值很小的时候,运动曲线会很硬,电机很容易丢步.而且电机速度达不到要求.3.4圈每秒,256细分。等于174080步每秒,一步之间只有5.74微妙。还是2个电机。而且mcu不是只处理电机转动那么简单,还有通讯接收。这个方案花了几乎一个月时间,否决了。

方案2,控制步数。固定定时器值。这样就能一个定时器同时控制很多个电机。但也有个问题,因为每次走的步数不同,必须算每次走多少步。加速,匀速,减速,要对加速部分进行积分(累加),达到最高速时就匀速运动,即将到达就要减速。问题就是,快到时,减速距离不一定等于加速距离。于是造成不能到达目标位置马上停下,有一点来回震荡。这方法速度有了,反应也OK,就是不够平顺。于是我把减速距离变成加速距离的3倍,加速很快,减速较慢,勉强能通过应用。但是也有一个严重缺陷,就是当速度很慢的时候,会抖得厉害。
//=====================================
//帖子3继续
//=====================================

使用特权

评论回复
板凳
mugenwon|  楼主 | 2011-10-6 11:46 | 只看该作者
本帖最后由 mugenwon 于 2011-10-6 11:57 编辑

我发现一个问题,转得慢,用手模着电机,觉得他有一下一下的振(很微弱的,就像用针撞击一块铁的感觉)。那种卡很奇怪。按道理做到256细分,电机应该很平顺才对。转的快看不出,转很慢,就有这感觉。但从细分的原理来看,应该是没错的。运行几天也没有丢步。我怀疑这是和电机本身结构有关。电机很慢时,究竟和细分表格里面的数据对得上吗?因为细分实在太小,很难用什么东西测出来。(反正距离长了,例如半步一步的,绝对没有错)这是一个请高手指教的地方

//======================================
还有个就是,驱动算法,只用修改走步数,不变定时间隔的办法,够不够?另外就算是这么做,那么每次走的步数,如何控制才是上策?目前我用的方法是长斜坡。就是每次都是加1步。但要走很多步才加1。这方法简单,但是马达反应比较慢。最好就是每次通过计算来得出走多少步。问题又没有这样的计算公式。有人说是指数,就是说要算乘法。我的思想是单片机尽量不用乘法,于是没有用公式。如果用查表,也可以用公式套上生成表格。问题是,这个步数表格,能不能应用在整个从1步到128步的范围?而且刹车距离,还是要对加速步数积分(加),如果距离太长,超过65535,就要用到32位运算,对于avr这8位单片机来说,会不会负担太重?毕竟速度快了,pwm的周期也短。这些都是我的疑虑。

//=====================================
pwm目前我只用到8位,其实定时器1能做到16位。我用过10位,发现马达会叫了。电流变化刚好能让电机线圈变成喇叭的音圈了。这是不允许的。。。也想问问,如果用更高位的pwm来做,细分表有无必要更多,目前我用8位,表格数据是8位的,要用9位以上,自然就要用16位数据,运算速度的问题又来了

//=====================================
然后,假如只修改步数不足够,要连每一步时间也修改,应该怎么做?有没有这样做的高手分享一下我感激不尽。还有没有更NB的,不用步数表格,只用公式,连总体电流也能平滑变化,速度平滑变化,低速不震荡的。我自问也有点基础,数学物理还算过关,也找了很多次资料,没有一个靠谱或实际点的。别说芯片资源不够,人家就是用这么简单的东西,做出很复杂很成功的产品。问题是算法,你不知道。如果有这方面的高手,分享一下经验,相信很多人会感谢你的!

使用特权

评论回复
地板
mugenwon|  楼主 | 2011-10-6 14:03 | 只看该作者
这里具体写一下算法,还有程序。
用256细分,(更低细分不行,抖得厉害)每个细分当是一微步。假设750微秒处理一次电机的运动状态。我是这样的:每处理6次,调整一个微步。例如第一步走1微步,一直走到第6步还是走1微步,但是第7~12步,就是2微步,13~18走3微步,如此类推。为什么不是每次都加1微步?因为电机从停止到运动反应不过来,他无法在500us内从1微步到2微步。这条运动曲线是什么?我也说不上,不是匀加速。是变加速的。速度越高,加速度越低。达到一定速度就不能再加了,变成匀速。如果最高速是用120微步,速度是多少?3.125圈每秒。勉强达标。最慢速度为0.026圈每秒。
因为要做加速和减速运动,减速距离和加速距离一致(或更长,后面再说),所以什么时候开始减速?必须知道这个刹车距离。假设等于加速距离,那么加速的时候你必须算出这个距离。只要把每一步的距离加起来就是了。但我为了节省运算时间,做了个速度表格,从0到120,运算的结果都出来了(数值不是0~120,而是第一个是0,第二个是1,第三个是1+2,第四个是1+2+3.。。),因为我是6次才加一步的,所以我连乘以6都算进去了,结果就变成0,6,18,。。。最大那个是4万多。后来因为电机电流太大烧电机,电流降低了,6次加1步变成7次,最大那个数变成接近16位的65535,不敢再加了,不然变成32位处理,怕影响运算速度。
后来发现运行没事,就是停止时抖得厉害(停的太快),于是把刹车距离加长。怎么加?本来可以用表格的,但为了省事,我采用加速距离的三倍算,直接用加速距离表格乘以3.这样做,电机加速很快,减速比较慢。基本能达到要求。

问题是慢时会抖。假设最慢要变得更慢,那自然就要把定时器改的更慢。假如定时器改慢了,最高速度就提不上去,要提,可以把一步步数加大,比如说加到160,那么加减速距离表格很容易就变成32位运算,我就是不想这么做。最理想的情况就是,能同时修改定时器。假如要750us处理一次,但也要1000us处理一次,那么定时器必须为最大公约数,250us,才能这么办。定时器分级越多,定时器值肯定要越小。还有就是衔接问题,如何变化?估计不能直接从750us一步,一下子变成1000us一步。这样会抖。假设要750,800,850,这样变化,那惨了,定时器要变成50us一中断。这个地方想来想去觉得不可行,于是没有下手。

使用特权

评论回复
5
mugenwon|  楼主 | 2011-10-6 14:19 | 只看该作者
这算法还有个问题,就是即使现在位置和目标位置不变,从0加速,匀速,减速后,速度变为0时,也不一定落在目标位置,我觉得这是个致命缺陷,举个例子。速度只要1,2,3,4,步四级。就是说,最高速时,刹车距离有10步,加速距离也是10步。假设现在位置为0,目标位置为30,加速走10步,减速走10步,中间只有10步,但速度是4,剩下2步合不上。结果是这样走的,1,2,3,4,4,4,4,3,2,1,1,1,这样还好,假如是1,2,3,4,4,4,4,4,3,2,1,-1,-1,这样就跑回去了,就出现震荡。实际是怎么走的呢?连这样也不是,减速时,有时候因为这个问题,判断出有需要加速的情况,加了后马上再减速。后面也有可能再有加速和减速,甚至跑回去的。现象很不明显,但我感觉抖就是因为这个原因。这算法还是有缺陷。

使用特权

评论回复
6
eydj2008| | 2011-10-6 18:58 | 只看该作者
够劲 够胆 又一个闭门造车的人 :lol

使用特权

评论回复
7
谈的元| | 2011-10-6 22:09 | 只看该作者
记号

使用特权

评论回复
8
highgear| | 2011-10-6 22:20 | 只看该作者

使用特权

评论回复
9
Cortex-M0| | 2011-10-7 07:50 | 只看该作者
够劲 够胆 又一个闭门造车的人 :lol
eydj2008 发表于 2011-10-6 18:58



一个闭门造车之人,能有此心德,本身能力就不差~~~

墙裂帮顶~~~

使用特权

评论回复
10
ocon| | 2011-10-7 08:53 | 只看该作者
步进电机加减速了解不多,帮顶。

使用特权

评论回复
11
wisology| | 2011-10-7 09:28 | 只看该作者
楼主强悍啊,一个步进电机研究这么深入

使用特权

评论回复
12
hdp7891000| | 2011-10-7 10:48 | 只看该作者
mark

使用特权

评论回复
13
eydj2008| | 2011-10-7 11:15 | 只看该作者
别说那么多啊 简单的讲 就是控制线圈中的电流(先微分再积分) 去控制磁场 产生旋转  步进电机属于同步电机一类

使用特权

评论回复
14
mugenwon|  楼主 | 2011-10-7 11:21 | 只看该作者
够劲 够胆 又一个闭门造车的人 :lol
eydj2008 发表于 2011-10-6 18:58

应该不算了,因为以前用过自带细分驱动的IC,稍微懂点细分的皮毛。但这次是不能用这种IC的,更不能用细分驱动器。也找了很多资料,原理都是采用方案1的,修改时间间隔。这种方法对一个电机而言,而且要求不高是没问题的。现在我一个mcu要驱动3个电机,而且要求很高,并不只看点对点的运动,是要看整个运动过程的平滑度。这方面的资料,别说程序,连算法都没有,就算是原理也泛泛而谈。
这算法,其实除了步进电机,还能用在LED亮度控制方面,或者任何电压电流控制要求十分严格的场合。只要是对过程变化要求很高的场合,都适用。本来看过很多pid算法的资料以为能用在上面,结果看的不是太明白。
有一点我非常不解,步进电机的控制模型和函数应该如何建立。目前能控制的,是每一步之间的时间,还有步幅。但电机的运动条件,例如速度,力矩,电流,控制电压(pwm)之间的关系是什么?最好能有个数学模型,输入负载,最高加速度,最高速度,电机最大力矩等参数,还有当前速度,当前位置和目标位置,就能算出当前应该走多少步幅,这就最完美了!

使用特权

评论回复
15
eydj2008| | 2011-10-7 19:56 | 只看该作者
对啊  你能想到这里你就开始入了,打开门造车吧  (力矩,电流,速度的数学模型)

使用特权

评论回复
16
eydj2008| | 2011-10-7 19:58 | 只看该作者
出来之后,才有速度,位置和时间的关系

使用特权

评论回复
17
mugenwon|  楼主 | 2011-10-8 07:56 | 只看该作者
楼上的大哥,能否具体说说步进电机的数学模型?我实在找不到。

使用特权

评论回复
18
eydj2008| | 2011-10-8 16:22 | 只看该作者
模型不是找的啊 是算的啊   你将他们分开,力矩和电流的关系,这个式子列出来,与速度相关的反向电动势算出来,就出来了。

使用特权

评论回复
19
eydj2008| | 2011-10-8 16:26 | 只看该作者
转起来,控制速度是很简单的事。你想控制得好,就复杂了。

使用特权

评论回复
20
DownCloud| | 2011-10-9 17:03 | 只看该作者
哎,步进电机,我恨它。
其中各种缘由就不想说了,影响我今后的五年的。
楼主所述内容我在当时只是听说过,居然一点不懂,最后我竟然很创新的失败了。
回头再看楼主的帖。

使用特权

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

本版积分规则

96

主题

430

帖子

3

粉丝