搜索
bottom↓
回复: 59

【请教】关于STM32 + L6225 驱动步进电机

[复制链接]

出0入0汤圆

发表于 2013-7-7 16:53:12 | 显示全部楼层 |阅读模式
请问诸位电机驱动高手,使用STM32+ L6225 驱动步进电机,实现64细分。具体的驱动思路应该是怎样的?

L6225跟L6019不一样,没有Vref。那就只能在INA、INB、EN这些引脚上想办法了

那具体的时序应该是怎样的呢?请诸位指点~~~

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2013-7-7 21:48:49 | 显示全部楼层
本帖最后由 myqiang1990 于 2013-7-7 21:50 编辑

PWM驱动,,   l6225使用PWM驱动的,这个帖子有驱动电路,目前的步进电机驱动IC我接触到得就两种驱动方式,一种是DA参考电压驱动的,比如L6219还有8812或者其他,还有一种就是PWM驱动的,L6225就是用PWM驱动的,,在选择PWM频率的时候一定要注意,高了不行,低了也不行,经过我无数次试验,这类PWM驱动的IC,17.57KHZ是最好的,你可以像这个帖子这样用一个反相器接,这样用2路PWM就可以驱动,也可以用4路PWM驱动。。。EN管脚可以直接连接VC使能,不用控制~~http://www.amobbs.com/forum.php? ... 9%E7%A6%8F%E4%BA%86

出0入0汤圆

发表于 2013-7-7 21:54:02 | 显示全部楼层
本帖最后由 myqiang1990 于 2013-7-7 22:01 编辑

2箱电机,按照双拍方式驱动,比如AB,BA-,A-B-,B-A来做细分,如果你理解了旋转磁场是怎么产生的,很容易对两厢电机进行细分~~下面代码是我11年的一个L6225驱动,4路PWM。。如果反向,就把细分表反着寻表,下面的XPH1,XPH2或者XPH3,XPH41就是INA1_INA2,和INB1_INB2
switch(XDivStruct.DivID >> 6)//相位0-3 做64细分没64细分点换相
     {
          case 0:
                 XPH1 = XDivStruct.PHONE;//控制A  通SIN表或者 通COS表  (那项先通COS表或者SIN表是不一样的,区别就是电机的转向~~)
                 XPH2 = 0;//控制A-
                 XPH3 = XDivStruct.PHTWO;//控制B 通COS表或者通SIN表
                 XPH4 = 0;//控制B-
           break;
           case 1:
                 XPH1 = XDivStruct.PHONE; 通SIN表或者 通COS表
                 XPH2 = 0;
                 XPH3 = 0;
                 XPH4 = XDivStruct.PHTWO; 通COS表或者通SIN表
           break;
           case 2:
                 XPH1 = 0;
                 XPH2 = XDivStruct.PHONE; 通SIN表或者 通COS表
                 XPH3 = 0;
                 XPH4 = XDivStruct.PHTWO; 通COS表或者通SIN表
           break;
           case 3:
                 XPH1 = 0;
                 XPH2 = XDivStruct.PHONE;通SIN表或者 通COS表
                 XPH3 = XDivStruct.PHTWO;//通COS表或者通SIN表
                 XPH4 = 0;
           break;
           default:break;                  
      }

出0入0汤圆

发表于 2013-7-7 22:05:21 | 显示全部楼层
本帖最后由 myqiang1990 于 2013-7-7 22:08 编辑

话说L6225效果其实挺好的,对得起他的价格~~~我发现用参考电压驱动的IC效果都不比PWM驱动的效果好~~

出0入0汤圆

 楼主| 发表于 2013-7-7 22:31:58 | 显示全部楼层
myqiang1990 发表于 2013-7-7 21:48
PWM驱动,,   l6225使用PWM驱动的,这个帖子有驱动电路,目前的步进电机驱动IC我接触到得就两种驱动方式, ...

非常感谢 myqiang1990 指点~~

基本的概念我了解了。不用PWM,单纯IO控制,一步走四拍,这个很好理解。用了PWM以后

switch(XDivStruct.DivID >> 6)//相位0-3 做64细分没64细分点换相
     {
          case 0:
                 XPH1 = XDivStruct.PHONE;//控制A  通SIN表或者 通COS表  (那项先通COS表或者SIN表是不一样的,区别就是电机的转向~~)
                 XPH2 = 0;//控制A-
                 XPH3 = XDivStruct.PHTWO;//控制B 通COS表或者通SIN表
                 XPH4 = 0;//控制B-
           break;
           case 1:
                 XPH1 = XDivStruct.PHONE; 通SIN表或者 通COS表
                 XPH2 = 0;
                 XPH3 = 0;
                 XPH4 = XDivStruct.PHTWO; 通COS表或者通SIN表
           break;
           case 2:
                 XPH1 = 0;
                 XPH2 = XDivStruct.PHONE; 通SIN表或者 通COS表
                 XPH3 = 0;
                 XPH4 = XDivStruct.PHTWO; 通COS表或者通SIN表
           break;
           case 3:
                 XPH1 = 0;
                 XPH2 = XDivStruct.PHONE;通SIN表或者 通COS表
                 XPH3 = XDivStruct.PHTWO;//通COS表或者通SIN表
                 XPH4 = 0;
           break;
           default:break;                  
      }

第一象限的时候,XPH1 是占空比从0~100变化,sin表。XPH3 是占空比从100~0变化,cos表。两个PWM的频率都是17.5Khz,其他象限以此类推。

是这样吗?

出0入0汤圆

发表于 2013-7-7 22:34:40 | 显示全部楼层
STM32_Study 发表于 2013-7-7 22:31
非常感谢 myqiang1990 指点~~

基本的概念我了解了。不用PWM,单纯IO控制,一步走四拍,这个很好理解。用 ...

对对,聪明,其实你就把PWM的一个占空比当中1或者0就很容易了,既然对INA,INB通0和1驱动,你那个就是4拍方式嘛~~,PWM只不过吧1到0或者0到1的状态分成很多阶梯来逼近嘛~~这样就是细分啦~~

出0入0汤圆

 楼主| 发表于 2013-7-7 22:34:50 | 显示全部楼层
myqiang1990 发表于 2013-7-7 22:05
话说L6225效果其实挺好的,对得起他的价格~~~我发现用参考电压驱动的IC效果都不比PWM驱动的效果好~~ ...

我现在做的项目,类似舞台灯光的应用。对噪音和振动要求很高,我买了几块集成驱动IC的板子,THB7128、TB6560之类的,测试效果不太理想

根据你的经验,有比L6225更好的芯片推荐吗?

出0入0汤圆

发表于 2013-7-7 22:35:03 | 显示全部楼层
果断关注下

出0入0汤圆

发表于 2013-7-7 22:35:44 | 显示全部楼层
STM32_Study 发表于 2013-7-7 22:31
非常感谢 myqiang1990 指点~~

基本的概念我了解了。不用PWM,单纯IO控制,一步走四拍,这个很好理解。用 ...

对对,聪明,其实你就把PWM的一个占空比当中1或者0就很容易了,既然对INA,INB通0和1驱动,你那个就是4拍方式嘛~~,PWM只不过吧1到0或者0到1的状态分成很多阶梯来逼近嘛~~这样就是细分啦~~当PWM占空比是0%的时候就低电平0,如占空比是100%那就是1嘛~~

出0入0汤圆

 楼主| 发表于 2013-7-7 22:39:38 | 显示全部楼层
myqiang1990 发表于 2013-7-7 22:34
对对,聪明,其实你就把PWM的一个占空比当中1或者0就很容易了,既然对INA,INB通0和1驱动,你那个就是4拍 ...

呵呵,主要是大师的指点一针见血。之前我看了很多资料都没弄明白

128细分,就是每个象限走128个PWM,是吧?

根据你的经验,要达到低噪音、低振动,还有哪些方面需要注意和处理的呢?

出0入0汤圆

发表于 2013-7-7 22:40:41 | 显示全部楼层
本帖最后由 myqiang1990 于 2013-7-7 22:51 编辑
STM32_Study 发表于 2013-7-7 22:34
我现在做的项目,类似舞台灯光的应用。对噪音和振动要求很高,我买了几块集成驱动IC的板子,THB7128、TB6 ...


对,舞台灯没有其他人想象那么简单,其实要求更高,而且很难控制~~噪音,平稳,精度,响应,平滑,速度都要求很高,如果随便做做也可以,当我没说,去看看外国那些高端产品,有时候你控制的伺服电机都没比他控制步进电机好~~你可以去看TI的驱动,有ST的更好的~~具体不说了,你去看看了解一下~~

出0入0汤圆

发表于 2013-7-7 22:47:07 | 显示全部楼层
STM32_Study 发表于 2013-7-7 22:39
呵呵,主要是大师的指点一针见血。之前我看了很多资料都没弄明白

128细分,就是每个象限走128个PWM,是 ...

低噪声不仅跟驱动有关,还有你的五金件结构有很大关系的,除五金件外,说说软件,低噪声肯定要选好的驱动IC啦,然后就是电流控制,低速要低电流,如果不用低电流,会抖,而且噪音很大,高速用大电流,因为高速后,因为电机是感性的,所以电流达不到预期的电流,力气会变得很小,这就是电机的钜频特性,还有一点就是共振点的控制,如果遇到共振点,出了做细分外,还有一个重要的手段就是将电流,关于抖动,就要做细分,还有就是低速控制电流~~~如果你的系统要求低速到高速的跨度很大,那么要做变细分,低速高细分,高速低细分,否则如果你的MCU不给力,很难做到高速,

出0入0汤圆

 楼主| 发表于 2013-7-7 22:57:51 | 显示全部楼层
myqiang1990 发表于 2013-7-7 22:40
对,舞台灯没有其他人想象那么简单,其实要求更高,而且很难控制~~噪音,平稳,精度,响应,平滑,速度都 ...

是的。步进电机看似简单,实际控制起来才发现,里面水很深啊

关于PWM频率,我有一点疑问

假设步进电机最高速度运行到300转每分钟,那么就是每秒5转

对应1.8度的步进,相当于每秒要走1000步

如果是128细分,那就相当于每秒变化128000个PWM。

按照这样算,17.5Khz的速度不够啊?应该至少128Khz的速度?


出0入0汤圆

发表于 2013-7-7 23:02:15 | 显示全部楼层
STM32_Study 发表于 2013-7-7 22:57
是的。步进电机看似简单,实际控制起来才发现,里面水很深啊

关于PWM频率,我有一点疑问

PWM频率跟电机速度没关系,跟你发PWM脉冲的频率有关系~~~比如现在占空比是0%,那么过5秒后发1%占空比,和过100秒后发1%占空比的PWM,电机速度就不一样了~~前者电机会块,后者会慢~~PWM频率只跟IC内部驱动电路有关系~~跟电机速度没关系。。。

出0入0汤圆

 楼主| 发表于 2013-7-7 23:06:01 | 显示全部楼层
myqiang1990 发表于 2013-7-7 22:47
低噪声不仅跟驱动有关,还有你的五金件结构有很大关系的,除五金件外,说说软件,低噪声肯定要选好的驱动 ...

非常给力的经验之谈啊~~

低速小电流,高速大电流。这个问题,我这两天实验感受比较深

我是用成品驱动,用拨动开关设置电流的。电流设小了,静止和低速的时候,电机振动小,声音小,但速度高了就没力,要失步

电流设大了,电机力矩是足够了。但是静止和低速的时候,声音就大很多了。而且有抖动的现象。

如果要实现低速小电流,高速大电流。用L6225怎么实现呢?

我想,用成品驱动IC来实现的话,可以考虑用DAC输出给电流控制端的方式。但L6225的话,感觉就很复杂了。限制最高占空比吗?

出0入0汤圆

发表于 2013-7-7 23:09:43 | 显示全部楼层
STM32_Study 发表于 2013-7-7 23:06
非常给力的经验之谈啊~~

低速小电流,高速大电流。这个问题,我这两天实验感受比较深

对!!!!!!!!限制PWM的最大占空比!就可以控制最大电流!!聪明~~~

出0入0汤圆

 楼主| 发表于 2013-7-7 23:11:05 | 显示全部楼层
myqiang1990 发表于 2013-7-7 23:02
PWM频率跟电机速度没关系,跟你发PWM脉冲的频率有关系~~~比如现在占空比是0%,那么过5秒后发1%占空比,和 ...

但是如果电机速度快了以后,PWM的占空比都还没完成,就要求输出下一个PWM了。不是这样吗?

假设128细分,最高每分钟300转的速度。

那走完整的一步(1.8度),需要1ms的时间。

那在这1ms的时间里面,需要走四个象限,一共是更新输出几个PWM占空比?不是128*4=512个吗?

出0入0汤圆

发表于 2013-7-7 23:14:10 | 显示全部楼层
看看下面两个图~~~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-7-7 23:18:57 | 显示全部楼层
你不要考虑PWM频率,你只要按照不同的频率,吧细分表走,速度就不一样~~~PWM频率不要和电机速度混在一起,只要吧细分表的数据按照一定的频率放到PWM计数器,让他产生不同的占空比就行了~~~PWM频率只跟IC内部电路有关,记得电机速度和PWM速度一点关系都没用~~~

出0入0汤圆

 楼主| 发表于 2013-7-7 23:22:33 | 显示全部楼层
myqiang1990 发表于 2013-7-7 23:14
看看下面两个图~~~

明白了~~就是通过控制占空比的比例来控制电流。

那低速到高速或高速到低速转换的时候,应该是要走完完整一个步进,在第一象限的时候才能切换吧?

这个软件功能很强啊?是公开的吗?

出0入0汤圆

发表于 2013-7-7 23:26:10 | 显示全部楼层
本帖最后由 myqiang1990 于 2013-7-7 23:30 编辑
STM32_Study 发表于 2013-7-7 23:22
明白了~~就是通过控制占空比的比例来控制电流。

那低速到高速或高速到低速转换的时候,应该是要走完完整 ...


走完一项就可以切换,或者任何时候切换都可以,但是你的电机会有个毛病,如果你的将的电流跨度很大,电机会卡的一下,所以做电流控制,最好把降电流跨度变小一点。比如这次是1的电流,那么我下次变成1.001的电流,如果你一下变到2的电流,因为细分波形会产生会在某个地方产生一个很大的变化,导致电流变化很大,而导致电机会卡一下响~~~所以不能平凡的变换电流~~比如我再0--100HZ是%1的电流,100-300HZ是2%的电流,一次类推,不要0-10HZ  1% 的电流,10--20HZ 2%的电流,这样电流切换太平凡了~~~具体哪些频段要多少电流,要通过实验得到得~~~

出0入0汤圆

发表于 2013-7-7 23:26:32 | 显示全部楼层
软件不是公开的,我自己写的~~

出0入0汤圆

 楼主| 发表于 2013-7-7 23:34:50 | 显示全部楼层
myqiang1990 发表于 2013-7-7 23:26
软件不是公开的,我自己写的~~

太强了!

真正软硬通吃啊。跨平台高手!

PWM频率跟电机速度没有关系。这个我是理解的。

电机的速度其实就是换相的速度,是吗?

但不管速度是高还是低,每个象限都是要走完细分数的吧?

比如刚刚的例子,1ms走一步,相当于每个象限的时间只有0.25ms。那0.25ms里面不需要完全走完细分表吗?如果PWM频率太低的话,走不完啊




出0入0汤圆

发表于 2013-7-7 23:47:13 | 显示全部楼层
PWM频率和你走细分表的频率有关系吗??你走细分表的速度才是决定你电机速度的。。和PWM频率一点关系都没用~~。。不需要每个象限都要走完细分数,任何时候都可以在当前细分点反着走或者往前走,但是你一定要记住一定要要走完64细分才能换相,所以你有一个时时刻刻记住当前细分点的变量,如果电机往前走,那么这个变量++,反着就--,只要你这个变量不乱,只要走了64细分,我上面的那个驱动程序都会在正确的点换相~~~你要理解一下~~~64细分的话,那么如果你的细分表是4周期波,这个变量++当大于64*4的时候就要清0从头在走,反着的话,就是小于0就从 64*4-1开始反着寻~~~

出0入0汤圆

发表于 2013-7-7 23:56:05 | 显示全部楼层
记住,PWM频率和速度一点关系,和驱动IC内部电路有关系~~只跟你寻细分表速度有关系~~~

出0入0汤圆

发表于 2013-7-8 00:04:45 | 显示全部楼层
举个例子,我有两个模块,都是64细分,现在我一个模块用1HZ的速度来寻细分表,那么当1/1HZ就是1秒就会去寻一次细分数据,然后放到PWM模块,让他产生对应占空比的PWM,那么电机就走了1/64步,那么我另外一个模块用2HZ的速度来寻细分表,那么当1/2HZ就是0.5秒就会去寻一次细分数据,然后产生脉冲,那么电机走1/64步,那么你说谁先走到整步点的位置??肯定2HZ那个,所以2HZ那个比1HZ那个速度快了1倍~~~

出0入0汤圆

 楼主| 发表于 2013-7-8 00:05:57 | 显示全部楼层
myqiang1990 发表于 2013-7-7 23:56
记住,PWM频率和速度一点关系,和驱动IC内部电路有关系~~只跟你寻细分表速度有关系~~~ ...

是的。这个我明白的

我仔细体会一下。明天再来向大侠请教~~


非常感谢你的耐心指点~~

出0入0汤圆

发表于 2013-7-8 17:55:41 | 显示全部楼层
L6205三相电机如何驱动

出0入0汤圆

发表于 2013-9-3 17:59:26 | 显示全部楼层
好东西,谢谢myqiang1990 很耐心的讲解。

出0入0汤圆

发表于 2013-9-26 18:19:05 | 显示全部楼层
标记玩睡觉。

出0入76汤圆

发表于 2013-11-8 15:29:53 | 显示全部楼层
本帖最后由 foxpro2005 于 2013-11-8 15:32 编辑
myqiang1990 发表于 2013-7-8 00:04
举个例子,我有两个模块,都是64细分,现在我一个模块用1HZ的速度来寻细分表,那么当1/1HZ就是1秒就会去寻 ...


大侠你好,以前一直对细分比较模糊,看了你的帖子及讲解感觉受益非浅, 现借别人的宝地来向您请教几个问题。

今天终于弄清了细分的实质,我的理解如下,您看正确么:
1.说穿了就是控制Ia, Ib的电流,从而改变了定子绕组的合成磁力。

原本(没有细分前)从第1步(拍) 走到 第2步(拍),步距角假设是60度, 当相脉冲来的时候, 一下子就跨过去了(走了1拍),但这个步子比较大,会导致电机运行不平稳,有抖动,并且精度也达不到要求。

所以,就有了细分的出现,把原本跨一大步, 变成由走N(如:64 等)小步来完成, 也就是 60度/64=0.9375度。这样每次走的步子小了,电机运行平稳了,精度也有所提高了。

为了使细分的步距角均匀等分,定子合成磁力必须按照某一规律递增或递减变化,然后定子合成磁力的变化跟定子绕组的驱动电流并非成线性关系, 而是成正(余)弦规律变化的。

2. 步进电机驱动芯片的控制
由于大多数驱动芯片驱动电流的控制是通过:参考电压(Vref)(如L6219)或直接PWM方式(如L6225)。
参考电压->说白了,也相当于是PWM(配上DAC)。

有了上以的原理,就可以知道细分表,正弦表、余弦表是怎么来的了。
比如:步距角: 从0 ~ 60度, 64细分, 那么就是以0.9375度为步进值 进行递增,然后分别算出正弦值、余弦值。
在Excel算很方便的,要注意了Excel中计算的是弧度,记得要把它换算成弧度的再计算sin哦!!
另外,还要把60度按90度计算方式来计算。 = sin( 实际角度 * (90/60) * PI()/180)
最后,再将正、余弦值 乘上 你的 PWM(占空比控制寄存器) 最大幅值,这个正、余弦细分表就得到了。
-----------------------------------------------------------------------------------------------

在应用中,控制读取细分表来更新PWM寄存器的间隔时间长短,也就改变了电机的速度。
在这里我有几个问题:
1. 如果更新的间隔时间稍微偏长, 电机运行可能会一走一停(电机一旦执行完成微步后就会停下来),就不能连续运行。 是吧?
2. 如果更新的间隔时间的最快时间,应该是PWM周期 时间吧?每个PWM周期都会变化。这个更新间隔的时间最快是不是有什么要求?

出0入76汤圆

发表于 2013-11-16 19:34:04 | 显示全部楼层
最近也在玩步进电机, 看了一下, 其实感觉L6227比L6225更好一些, 它带有参考电压设定Vref(0~1V)与带电流(Isensor)反馈控制,这样就可以控制电机的最大驱动电流。 如果在非PWM驱动的情况下, 对要控制驱动电流还是比较好的(可以减小功耗)。

出0入0汤圆

发表于 2013-11-18 00:14:11 来自手机 | 显示全部楼层
好东西,正学习步进电机,mark!

出0入0汤圆

发表于 2013-11-18 08:32:11 | 显示全部楼层
精度不高的控制,加个普通减速机就好了,很多问题不光在电上面想办法,还要在机上面想办法

出0入10汤圆

发表于 2013-12-6 09:53:59 | 显示全部楼层
myqiang1990 发表于 2013-7-7 23:09
对!!!!!!!!限制PWM的最大占空比!就可以控制最大电流!!聪明~~~ ...

还是没太明白,既然细分运行,那么它的电流波形应该是正余弦,怎么来控制低速小电流,高速大电流,那不是把它的波形改变了??

出0入0汤圆

发表于 2013-12-17 16:23:30 | 显示全部楼层
进来学习了讲的很好

出0入0汤圆

发表于 2014-7-4 15:52:23 | 显示全部楼层
myqiang1990 发表于 2013-7-7 21:48
PWM驱动,,   l6225使用PWM驱动的,这个帖子有驱动电路,目前的步进电机驱动IC我接触到得就两种驱动方式, ...

我想问一下,我把IN1、IN2、IN1、IN4接IO口,通过控制IO口来控制电机的转向及速度,把电流PID后得到的pwm波接L6255的ENA、ENB来实现细分,从而控制电流能行吗。以前没有看到有人把PWM波接到ENA、ENB!

出0入0汤圆

发表于 2014-7-4 15:54:38 | 显示全部楼层
myqiang1990 发表于 2013-7-7 23:09
对!!!!!!!!限制PWM的最大占空比!就可以控制最大电流!!聪明~~~ ...

我想问一下,我把IN1、IN2、IN1、IN4接IO口,通过控制IO口来控制电机的转向及速度,把电流PID后得到的pwm波接L6255的ENA、ENB来实现细分,从而控制电流能行吗。以前没有看到有人把PWM波接到ENA、ENB!

出0入0汤圆

发表于 2014-8-7 13:11:46 | 显示全部楼层
myqiang1990 发表于 2013-7-7 23:09
对!!!!!!!!限制PWM的最大占空比!就可以控制最大电流!!聪明~~~ ...

请问,如果我用单片机控制成品驱动器,单片机脉冲的占空比可以控制步进电机的电流吗?

出0入0汤圆

发表于 2014-9-3 23:51:26 | 显示全部楼层
留下以后慢慢回顾

出0入0汤圆

发表于 2014-10-27 11:02:21 | 显示全部楼层
myqiang1990 发表于 2013-7-7 22:40
对,舞台灯没有其他人想象那么简单,其实要求更高,而且很难控制~~噪音,平稳,精度,响应,平滑,速度都 ...

我看了你的很多帖子,受益匪浅,感谢你在论坛的无私奉献!小弟刚入门步进电机不久,在一个问题上面困扰了很久,不知道前辈是否有时间给指点一下:
void TIM3_IRQHandler(void)
{
        u16 temp;
        temp=TIM3->CNT;
        if (TIM3->SR&0x0002)
        {
                //驱动motor1;
                TIM3->CCR1=temp+Motor1_Value_Timer;
                TIM3->SR&=~(1<<1);//清除中断标志位
        }
        if (TIM3->SR&0x0004)
        {
                //驱动motor2;
                TIM3->CCR2=temp+Motor2_Value_Timer;
                TIM3->SR&=~(1<<2);//清除中断标志位
        }
}
这是我驱动多个电机的方式,我的困扰是用一个定时器的两个通道,一个通道控制一个电机,这样做两个通道间的定时时间相互影响,导致电机失步;可是用两个定时器做中断却没有发现问题。备注:定时器计数频率8M,最高中断频率16K。

出0入0汤圆

发表于 2014-10-27 11:44:34 | 显示全部楼层
本帖最后由 myqiang1990 于 2014-10-27 11:59 编辑
ep02 发表于 2014-10-27 11:02
我看了你的很多帖子,受益匪浅,感谢你在论坛的无私奉献!小弟刚入门步进电机不久,在一个问题上面困扰了 ...


我明白你得意图~请参考http://www.amobbs.com/thread-5560887-1-1.html这个帖子68楼程序~~你就知道你错在哪里了~~工程里面的中断函数程序就是类似你的处理方法,程序在工程的stm32f10x_it.c文件里面,这是他一个定时器控制4路电机的定时计算过程~其实这样做~一个定时器只能控制4个电机,因为只有4个CCRX通道~~我们举一反三,不需要他的硬件CCRX通道,我们用软件自己模拟这个过程~如果对速度要求不是很高~那么我们可以用一个定时器控制无限制个电机~:

出0入0汤圆

发表于 2014-10-27 12:10:59 | 显示全部楼层
myqiang1990 发表于 2014-10-27 11:44
我明白你得意图~请参考http://www.amobbs.com/thread-5560887-1-1.html这个帖子68楼程序~~你就知道你错在 ...

能看到前辈的回复真是欣喜万分!其实,我就是从淘宝上面买的那个卖家的开发板,反复研究了那份代码,然后移植到了公司的一块成熟产品的电路板上面的。前辈指点的思路我现在就去实验一下,万分感谢!!

出0入0汤圆

发表于 2014-10-27 14:43:25 | 显示全部楼层
本帖最后由 myqiang1990 于 2014-10-27 14:58 编辑
ep02 发表于 2014-10-27 12:10
能看到前辈的回复真是欣喜万分!其实,我就是从淘宝上面买的那个卖家的开发板,反复研究了那份代码,然后 ...


原来这样~你用了他的代码还是不对是吧~(我看你是按照他原来的代码自行改过的~~你先原原本本的用他的代码来试试看正不正常~不要修改~等你确认他的代码无问题~再做进一步优化)~我自己也有这种一个定时器控制很多个电机的代码~~原理非常类似你们现在的这种计数原理~~只不过我使用软件模拟这种原理~所以可以控制无限制个电机~~我只能告诉你思路是这样~但是我不能吧代码给你~~

出0入0汤圆

发表于 2014-10-27 15:55:25 | 显示全部楼层
本帖最后由 myqiang1990 于 2014-10-27 17:19 编辑
ep02 发表于 2014-10-27 12:10
能看到前辈的回复真是欣喜万分!其实,我就是从淘宝上面买的那个卖家的开发板,反复研究了那份代码,然后 ...


刚才我大体分析了一下他这个软件控制的架构~~感觉还是有很多不妥当的地方~~大量程序放在了定时器中断中~~而且没有启动电机或停止电机的过程~类似与他的定时器中断是不停止的~~他只是在定时器中断的过程中不断的去判断位置是否发生了变化~如果发生了变化就会对电机进行调整~~但是这个检测位置变化的检测频率是随电机速度变化而变化的~如果电机速度及其缓慢~那么他整个程序响应位置变化就会很慢,因为电机速度很慢的时候~会很久才会进入一次中断~~所以这种方式及其不妥当~~还好他程序使用变细分的~因为当低速用高细分的话~定时器频率执行频率还是比较高的~~还是能保证电机响应DMX位置变化的实时性~~貌似该程序定时器计数处理部分也不妥当~~举个例子TIM1->CCR1通道的例子,没考虑CCR1溢出问题?:

capture = TIM_GetCapture1(TIM1);
TIM_SetCompare1(TIM1, capture + TIM1CCR1_Val);

定时器配置如下:
TIM_TimeBaseStructure.TIM_Period = 0xffff;         //设置自动重载寄存器值为最大值  比较中断中一定要设置为65535
  TIM_TimeBaseStructure.TIM_Prescaler = 35;             //自定义预分频 71  test?
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

ARR是固定的~也就是说定时器周期是固定的等于65535~当CNT寄存器计数到65535的时候会又从零开始计数~~也就是说TIM1->CCR1 = capture + TIM1CCR1_Val不能无限制的往上加~需要在 capture + TIM1CCR1_Val > 65535的时候对TIM1->CCR1通道值进行相应的处理~~这个我没发现该程序有相应的处理程序~~他程序的本意是用比较通道来改变中断频率~就类似改变了PWM占空比~~

出0入0汤圆

发表于 2014-10-29 13:05:14 | 显示全部楼层
myqiang1990 发表于 2014-10-27 14:43
原来这样~你用了他的代码还是不对是吧~(我看你是按照他原来的代码自行改过的~~你先原原本本的用他的代码 ...

是这样的。我用他的代码带两个电机(空载时)没有失步的现象,但是连接到一个小灯上面时电机噪音很大,震动也很大,连接到稍微大一点的灯上面运行就失步了,所以我觉得他的那份代码主要提供一种控制思路,引领新手入门而已。我沿着这种程序结构和思路走下去,经过反复修改判断逻辑和加减速曲线,最终在一个中型灯上面完成了自己的架构。现在唯一的问题就是最初提到的定时器中断问题,只好一个电机使用一个定时器中断了,电机多了就多用几个芯片处理。

出0入0汤圆

发表于 2014-10-29 13:19:58 | 显示全部楼层
myqiang1990 发表于 2014-10-27 15:55
刚才我大体分析了一下他这个软件控制的架构~~感觉还是有很多不妥当的地方~~大量程序放在了定时器中断中~~ ...

这个部分的实验结论是CCR1溢出之后又会从0开始计数,自动处理了(其实这个地方我也有个疑问,溢出的部分去哪里了,会不会是这个原因影响了临近的那个寄存器)。感谢前辈指出这个控制结构的缺陷的部分,我再思考一下一个定时器控制无限个电机的方法。

出0入0汤圆

发表于 2014-10-29 16:09:30 | 显示全部楼层
本帖最后由 myqiang1990 于 2014-10-29 16:23 编辑
ep02 发表于 2014-10-29 13:19
这个部分的实验结论是CCR1溢出之后又会从0开始计数,自动处理了(其实这个地方我也有个疑问,溢出的部分 ...


如果CCR1溢出后变成0~~那么这个绝对是错误!!你需要从新加载一下CCR1的值~不能让其变成0~CCR1是不会计数的~只有CNT会计数~CNT溢出(大于等于65535,因为他定时器设置的是65535)确实会又从零开始计数~~你描述有误~他CCR1溢出情况没有处理好~会有一定的影响~我的程序原理类似这种方式~但是绝对不会有溢出现象~我不是修改CCRX的值~~也没用到CCRX这种比较这种方式~~我是修改CNT的值~就是定时器重装ARR的值~

出0入0汤圆

发表于 2014-10-29 17:09:07 | 显示全部楼层
路过学习了

出0入0汤圆

发表于 2014-10-31 13:01:20 | 显示全部楼层
myqiang1990 发表于 2014-10-29 16:09
如果CCR1溢出后变成0~~那么这个绝对是错误!!你需要从新加载一下CCR1的值~不能让其变成0~CCR1是不会计数 ...

这个确实是我描述的不对,不是计数溢出,而是加上一个数之后才会溢出。对于CCR1溢出变成0的问题我做过验证,确实是65534,65535,0,1……并且不会对别的寄存器产生影响,对于清零的问题应该是不需要做处理的。
http://www.openedv.com/posts/list/2396.htm
http://www.openedv.com/posts/list/2475.htm
这两个帖子在输出比较的问题上很有参考意义,我的问题可能出在中断频率过高

出0入0汤圆

发表于 2014-10-31 14:55:09 | 显示全部楼层
本帖最后由 myqiang1990 于 2014-10-31 15:14 编辑
ep02 发表于 2014-10-31 13:01
这个确实是我描述的不对,不是计数溢出,而是加上一个数之后才会溢出。对于CCR1溢出变成0的问题我做过验 ...


你认真想象这种情况~~当CCR1的计数个数,注意我说是个数~跨越65535与0~举个简单的例子:就以CNT最大计数10为例,假如CCR1 = 4 ,那么第一次CCR1 + 4 = 8, 第二次CCR1 + 4 = 12~那么CCR1 > 10 就变成了0~当CNT计数到10后就变成了0~那么CNT马上就和CCR1匹配发生了中断~~~即使在0的时候不发生匹配中断~那么计数器也会在计数了2 + 4 = 6次计数后才会发生中断~那么 12 - 10 = 2~ CNT已经漏掉了两次计数~明白我的意思吗?虽然影响不大~~我说了影响不大~~这是一个小瑕疵~主要是CCRX的值并非都是CNT = 65535的公约数~明白我的意思了吧~

出0入0汤圆

发表于 2014-11-2 11:06:59 | 显示全部楼层
myqiang1990 发表于 2014-10-31 14:55
你认真想象这种情况~~当CCR1的计数个数,注意我说是个数~跨越65535与0~举个简单的例子:就以CNT最大计数1 ...

思维缜密啊,不过,我明白你错在哪了

出0入0汤圆

发表于 2014-11-2 15:07:30 | 显示全部楼层
ep02 发表于 2014-11-2 11:06
思维缜密啊,不过,我明白你错在哪了

恩~~说说看~~我认为这样应该会有点影响~~

出0入0汤圆

发表于 2014-11-3 14:54:09 | 显示全部楼层
myqiang1990 发表于 2014-11-2 15:07
恩~~说说看~~我认为这样应该会有点影响~~

就以CNT最大计数10为例,假如CCR1 = 4 ,那么第一次CCR1 + 4 = 8, 第二次CCR1 + 4 = 12~那么CCR1 > 10 就变成了0~,此处我的实验结论不是这样的,寄存器的存储方式跟角度类似,当出现溢出的时候并不是直接赋值为0,而是把溢出的那一位去掉,后面的数不变,这样去掉的部分刚好是一个周期。我的实验结果是:65530+6=0;65530+7=1;65530+8=2;即所得到的数学结果如果大于65535就减去65536,刚好是抹去溢出的那一位。所以CCR1 + 4 = 12~那么CCR1 > 10 就变成了0~,这个就不对了

出0入0汤圆

发表于 2014-11-3 16:07:13 | 显示全部楼层
ep02 发表于 2014-11-3 14:54
就以CNT最大计数10为例,假如CCR1 = 4 ,那么第一次CCR1 + 4 = 8, 第二次CCR1 + 4 = 12~那么CCR1 > 10  ...

哦~~我明白你的意思了~~那这样问题就没有了~~

出0入0汤圆

发表于 2014-11-29 17:11:03 | 显示全部楼层
路过学习了,收益非浅

出0入0汤圆

发表于 2014-12-1 14:09:18 | 显示全部楼层
MARK================

出0入0汤圆

发表于 2014-12-1 14:16:16 | 显示全部楼层
STM32_Study 发表于 2013-7-7 22:34
我现在做的项目,类似舞台灯光的应用。对噪音和振动要求很高,我买了几块集成驱动IC的板子,THB7128、TB6 ...

一年过去了,现在你用什么片子啊,最近也是要找大电流的步进芯片;是否有合适的片子推荐一下;
TB660和TB6660之类能用吗?或者THB7128之类;

出0入0汤圆

发表于 2014-12-3 02:49:39 | 显示全部楼层
本帖最后由 gy54321 于 2014-12-3 02:51 编辑
ep02 发表于 2014-10-29 13:05
是这样的。我用他的代码带两个电机(空载时)没有失步的现象,但是连接到一个小灯上面时电机噪音很大,震 ...


我也买过他的开发板, 按他的思路做过摇头灯产品, 效果也还算可以!
对于速度和噪音问题,有一个值得注意的是L6225的过流保护功能。
在电机长时间低速走动的时候, 如果电机阻值很小。  24V时, 10多欧的电机, 电机和L6225都会很热的, 然后电机转的时候就可能会出现抖的情况,我觉得那是L6225过温保护造成。

出0入0汤圆

发表于 2014-12-5 15:53:57 | 显示全部楼层
gy54321 发表于 2014-12-3 02:49
我也买过他的开发板, 按他的思路做过摇头灯产品, 效果也还算可以!
对于速度和噪音问题,有一个值得注 ...

看样子,这位兄弟也是做舞台灯的啊,我刚才发了一个帖子,讨论LED驱动的,有没有兴趣帮忙分析一下?
http://www.amobbs.com/forum.php? ... page%3D1#pid8222432
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 07:04

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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