amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
楼主: chenyuqiu

STC11F16XE驱动4个步进电机(软件实现16细分)

  [复制链接]
发表于 2011-12-28 10:51:26 | 显示全部楼层
mark下
发表于 2011-12-28 10:58:31 | 显示全部楼层
给力的程序,mark!
发表于 2011-12-28 11:00:19 | 显示全部楼层
如果使用大功率的步进电机,ULN2003不能用,那就换L298吧
发表于 2011-12-28 20:24:54 | 显示全部楼层
学习了,不错
发表于 2012-1-2 14:27:46 | 显示全部楼层
mark  步进电机
发表于 2012-1-15 11:52:50 | 显示全部楼层
mark
发表于 2012-2-7 09:53:03 | 显示全部楼层
mark
发表于 2012-2-7 12:25:22 | 显示全部楼层
好东西啊!
发表于 2012-2-8 17:29:36 | 显示全部楼层
如此猛料居然没看到,为时未晚,收藏学习
发表于 2012-2-8 20:48:15 | 显示全部楼层
MARK
发表于 2012-2-10 20:48:56 | 显示全部楼层
回复【280楼】wpnx
-----------------------------------------------------------------------

MARK
发表于 2012-2-10 21:43:51 | 显示全部楼层
不知道在这个论坛中有多少人能完全看明白你的程序
发表于 2012-2-12 08:32:26 | 显示全部楼层
很有兴趣···望楼主也给一份,tianfe.g@163.com   谢谢!!!
顺便问下直接用2路PWM该怎么样改的
发表于 2012-2-13 17:21:57 | 显示全部楼层
留下我的痕迹
发表于 2012-2-14 06:13:55 | 显示全部楼层
MARK
发表于 2012-2-14 08:18:04 | 显示全部楼层
mark
发表于 2012-2-14 12:05:51 | 显示全部楼层
有空玩玩
发表于 2012-3-1 08:20:16 | 显示全部楼层
他那个加减速是多少细分的
发表于 2012-3-4 10:51:02 | 显示全部楼层
【239楼】 chenyuqiu 小陈


大家都知道我的硬件电路接法只能跑单四拍? 是双四季拍吧
发表于 2012-3-4 17:06:50 | 显示全部楼层
不错呀,看看stc驱动步进细分
发表于 2012-3-11 18:01:08 | 显示全部楼层
这个加减速,没看懂
发表于 2012-3-25 09:33:17 | 显示全部楼层
好东西啊!
发表于 2012-4-9 20:32:14 | 显示全部楼层
本帖最后由 txzfw 于 2012-4-9 20:35 编辑

请问楼主:
unsigned int code wTableUnl2803DriveValue[] =
{0x0000, 0x0080, 0x0820, 0x1110, 0x2244, 0x2492, 0x4a52, 0x5554, 0xaaaa, 0xabaa, 0xbaae, 0xbbba, 0xeeee, 0xeefe, 0xf7f7, 0x7fff,};
这个数据表是逐渐增加 下一相数据出现的频率(b'1次数从0到15);以wTableUnl2803DriveValue[5] (0x2244)可不可以改为0x1111或者其它的数据(只要有4个bit为1,以均分bit 1为原则插入bit 0)还请楼主不惜赐教!
发表于 2012-4-17 17:36:13 | 显示全部楼层
楼主,有个项目看看能不能合作。+Q 378301943
发表于 2012-4-24 11:51:30 | 显示全部楼层
细分驱动实现比较巧妙,想请教小陈这电流保护部分是否有做?是怎样实现的?
发表于 2012-4-27 20:44:21 | 显示全部楼层
QQ:836582587
发表于 2012-4-28 14:09:24 | 显示全部楼层
学习!!!
发表于 2012-4-30 09:34:58 | 显示全部楼层
果然不错哦
发表于 2012-4-30 10:37:30 来自手机 | 显示全部楼层
楼主是IT雷锋
发表于 2012-5-7 15:53:38 | 显示全部楼层
首先很佩服楼主,其次希望能与您合作,QQ:360483758。
不知道MPC82G516AE+MA8032AE2+TLC7226N+LM324+L6129的108颗3W LED摇头灯控制系统是你做的不?
发表于 2012-5-23 00:04:24 | 显示全部楼层
楼主你好,我刚开始弄舞台灯的电机。最近有个项目类似楼主的作品,需要对电机进行16细分。按我的理解是,速度上升到正常速度时,就把细分数变为2细分或不细分,这样就可以快速转动。不知道这样理解对不对?还望赐教,如果可以的话,希望楼主把你的资料发我一份,hyc07209@163.com 在此先谢过!!
发表于 2012-5-27 00:07:52 | 显示全部楼层
貌似楼主很久没到这里来了哦,我还想参考一下楼主的程序呢。!根据楼主在贴里的提示,我写了段伪代码,希望楼主和各位大侠帮我看看:

/*
最小细分数=|设定位置和现在位置的绝对值|÷255×速度设定值;
switch(State)
{
        case 空闲:
                时间片计数器=0;
                象限计数器  =0;
                开始细分数初始=16;
                if(有位置差)State=启动;
                break;
        case 启动:
                if((时间片计数器==0)||(时间片计数器==现在细分数))
                {
                        象限计数器++;
                        if(象限计数器==3)
                        {
                                象限计数器=0;
                                距离差--;
                        }

                        if(现在细分数!=最小细分数)
                        {
                                现在细分数--;
                                if(象限计数器&0x01)//如果象限值是单数,sin值从90°开始取
                                        时间片计数器=现在细分数;
                                else 时间片计数器=0;
                        }
                        else
                                State=匀速;       
                }
                if(象限计数器&0x01)时间片计数器--;
                else 时间片计数器++;
                正弦值=tab[现在细分数][时间片计数器];
                余弦值=tab[现在细分数][现在细分数-时间片计数器];
                break;
        case 匀速:
                if((时间片计数器==0)||(时间片计数器==现在细分数))
                {
                        象限计数器++;
                        if(象限计数器==3)
                        {
                                象限计数器=0;
                                距离差--;
                                if(距离差剩下不多了)//留一点距离用来减速
                                        State=减速;
                        }

       
                        if(象限计数器&0x01)//如果象限值是单数,sin值从90°开始取
                                时间片计数器=现在细分数;
                        else 时间片计数器=0;
                }
                if(象限计数器&0x01)时间片计数器--;
                else 时间片计数器++;
                正弦值=tab[现在细分数][时间片计数器];
                余弦值=tab[现在细分数][现在细分数-时间片计数器];
                break;
        case 减速;
                if((时间片计数器==0)||(时间片计数器==现在细分数))
                {
                        象限计数器++;
                        if(象限计数器==3)
                                象限计数器=0;

                        if(现在细分数!=16)
                        {
                                现在细分数++;
                                if(象限计数器&0x01)//如果象限值是单数,sin值从90°开始取
                                        时间片计数器=现在细分数;
                                else 时间片计数器=0;
                        }
                }
                if(象限计数器&0x01)时间片计数器--;
                else 时间片计数器++;
                正弦值=tab[现在细分数][时间片计数器];
                余弦值=tab[现在细分数][现在细分数-时间片计数器];
                break;
        default:
                break;
}//end switch(State)
*/
很晚了,没来得及细查,欢迎各位拍砖
发表于 2012-5-29 22:25:23 | 显示全部楼层
本帖最后由 hyc07209 于 2012-5-29 22:29 编辑

这个帖子就这样沉了吗,哈哈,可惜啊

我在一块比较成熟的步进电机控制板上,用示波器捕获了一些电压值,如下面图片:
D:\motor.bmp
图片中的前面 3 个波形是成熟的步进电机控制板上捕获的波形。3个波形的周期是一样的,可以看出即使是相同周期的波形,相邻波形上面的电压值也是不一样的。在测量时发现,在触发后的第一个电压值有时是0,有时是-1,有时是-11,按一定的规律变化。。
不知道楼主的程序是不是也是这样子的,是怎么做到的,还希望指点一下。

图片中的第四个波形是我按照上一楼的伪代码写出的程序所捕获的波形,波形完全对称。但是实际应用发觉效果并不是很好。
所以如果楼主能指点一下就太好了
发表于 2012-5-29 22:28:00 | 显示全部楼层
怎么图片不见了啊
发表于 2012-5-31 00:24:10 | 显示全部楼层
顶一下!
发表于 2012-6-7 22:01:27 | 显示全部楼层
hyc07209 发表于 2012-5-29 22:28
怎么图片不见了啊

你的图片没传上来啊
发表于 2012-7-17 09:47:12 | 显示全部楼层
楼主好人,我最近在弄电机的程序,想交流一下QQ1342954356,谢谢
发表于 2012-7-17 09:56:18 | 显示全部楼层
电机加减速是有一个软件可以自动计算的,只需要调整S型线,自动出数据,看到别人用过,但是他们不给。强烈请求楼主共享,谢谢
发表于 2012-7-17 10:38:13 | 显示全部楼层
马克思密达
发表于 2012-7-17 12:02:07 | 显示全部楼层
很好的帖子,不能沉下去。
发表于 2012-7-18 16:32:49 | 显示全部楼层
mark~回去仔细研究研究~~
发表于 2012-7-30 00:09:34 | 显示全部楼层
楼主能不能赐教,正准备研究电机方面的东西,QQ:120850991,公司不能上QQ,只能晚上上网,非常谢谢!
发表于 2012-7-30 15:50:13 | 显示全部楼层
看到这里就没了..晕死
发表于 2012-8-2 14:51:41 | 显示全部楼层
楼主怎么都不出来指点下的呀
发表于 2012-8-14 00:02:43 | 显示全部楼层
mark-----------
发表于 2012-9-21 09:24:49 | 显示全部楼层
236719016 发表于 2012-7-17 09:56
电机加减速是有一个软件可以自动计算的,只需要调整S型线,自动出数据,看到别人用过,但是他们不给。强烈 ...

你好,想问下你现在有那个电机的加减速软件吗?有的话能给一份吗?
发表于 2012-11-19 22:59:07 | 显示全部楼层
陈工,高风亮节
发表于 2013-1-18 14:21:54 | 显示全部楼层
不错
发表于 2013-1-18 16:37:36 | 显示全部楼层
mark
发表于 2013-1-18 18:44:11 | 显示全部楼层
看看,慢慢理解!
发表于 2013-3-23 18:29:10 | 显示全部楼层
学习,学习!
发表于 2013-3-23 18:37:10 | 显示全部楼层
带梯形增减速不
发表于 2013-3-23 20:59:21 | 显示全部楼层
MARK一下
发表于 2013-3-23 22:43:44 | 显示全部楼层
收藏了,慢慢研究~
发表于 2013-5-21 15:33:36 | 显示全部楼层
步进电机在很慢转动时(大概是一分钟一圈),为什么会出现一抖一抖的现象呢?请问楼主这该如何解决呢?
若楼主能给思路不胜感激。
发表于 2013-5-27 14:38:45 | 显示全部楼层
Sir:

Can you upload the all source code.

Thank you.
发表于 2013-6-4 21:57:46 | 显示全部楼层
MARK,顶帖
发表于 2013-7-13 19:41:56 | 显示全部楼层
不错,谢谢分享
发表于 2013-7-15 21:28:41 | 显示全部楼层
你可以参考一下
发表于 2013-8-6 14:56:35 | 显示全部楼层
chenyuqiu 发表于 2011-11-20 20:26
回复【284楼】liyuguang
-----------------------------------------------------------------------

楼主 这么久了 还有在阿莫吗?能否加我qq 240623125 小弟刚开始学习步进电机
发表于 2013-8-17 21:31:22 | 显示全部楼层
mark!!!
发表于 2013-9-8 05:06:22 | 显示全部楼层
学习步进电机
发表于 2013-12-9 13:30:37 | 显示全部楼层
好东西啊
发表于 2013-12-10 15:39:24 | 显示全部楼层
重新看了一下楼主的程序,没有算法说明,也没个注释,真的很难看懂,还不如给一个流程图来的实在
头像被屏蔽
发表于 2013-12-10 21:31:09 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2013-12-15 22:01:00 | 显示全部楼层
                                                         
发表于 2014-5-14 21:01:19 来自手机 | 显示全部楼层
谢谢楼主的无私奉献!!
发表于 2014-5-22 13:01:52 | 显示全部楼层
很久没见楼主了,感谢楼主的付出。
发表于 2014-5-28 17:00:46 | 显示全部楼层
多謝分享,讚一個
发表于 2014-5-28 22:53:00 | 显示全部楼层
支持,学习了!
发表于 2014-8-10 19:09:17 | 显示全部楼层
非常好的贴子,就是LZ 好久没上线了。
发表于 2014-8-31 20:59:19 | 显示全部楼层
帖子看完了,还是没搞懂,哎。
发表于 2014-8-31 21:07:28 | 显示全部楼层
步进驱动16细分,MARK
发表于 2014-8-31 22:21:33 来自手机 | 显示全部楼层
步进电机细分控制
发表于 2014-9-16 09:26:56 | 显示全部楼层
本帖最后由 didadida 于 2014-9-16 09:28 编辑

传一个纯软件的“仿真”,就是看一下楼主的程序输出是什么样子的,还有简单的分析,供参考。其中只有第一列和第二列有数据是因为只选中了其中的一路,楼主的程序可以支持四路输出,四路的信号形式是一致的。
simulate.zip (3.31 KB, 下载次数: 252)
发表于 2014-11-15 08:37:07 | 显示全部楼层
谢谢分享!
发表于 2014-11-15 17:25:49 | 显示全部楼层
不错,先留个记号。
发表于 2014-11-20 15:11:40 | 显示全部楼层
感觉这个不能叫细分吧,没有电流反馈的做不了两细分以上的吧?
发表于 2014-11-21 10:03:34 | 显示全部楼层
brumby 发表于 2014-11-20 15:11
感觉这个不能叫细分吧,没有电流反馈的做不了两细分以上的吧?

我之前不知道有这个帖子,你翻出来,我认真看了一下,参考了“didadida”的解释,终于看明白了:)

就是在两个位置之间按照比例高速的来回运动,由于电动机转子的惯性,所以会比较稳定的在2个位置之间。
发表于 2014-11-21 11:51:47 | 显示全部楼层
linbin250 发表于 2014-11-21 10:03
我之前不知道有这个帖子,你翻出来,我认真看了一下,参考了“didadida”的解释,终于看明白了:)

就是 ...

如果是高速切换相邻的两拍,造成转子来回摆,这样电机很难提速呀,效果应该不好的。
发表于 2014-11-21 11:55:59 | 显示全部楼层
如果来回摆,两拍之间应该这样: 01 01 10     01 01 10   01 01 10   01 01 10 ... ,这样卷子停在 两个齿1/3位置,但楼主插入的是 11。
发表于 2014-11-21 12:23:31 | 显示全部楼层
brumby 发表于 2014-11-21 11:55
如果来回摆,两拍之间应该这样: 01 01 10     01 01 10   01 01 10   01 01 10 ... ,这样卷子停在 两个齿 ...

看来你没有完全看懂:)
LZ的电动机是用2个线控制,被非门扩展成4线。
A,B 线直接控制
C,D 线是 A,B 线的反向。
“didadida”的分析结果是
A B C D 只有4中组合
1100
0110
0011
1001

你看到的拿一串是表示如何运动。引用楼主的数据表
unsigned int wTableUnl2803DriveValue[] =
{
    0x0000, 0x0080, 0x0820, 0x1110, 0x2244, 0x2492, 0x4a52, 0x5554,
        0xaaaa, 0xabaa, 0xbaae, 0xbbba, 0xeeee, 0xeefe, 0xf7f7, 0x7fff,
};

也就是说
0x0000,  表示停在 0/16 的位置
0x0080,  表示停在 1/16 的位置
0x0820,  表示停在 2/16 的位置
......

举例来说,假定我们需要停到 5/16的位置,那么对应的数是 0x2492 -> b 0010 0100 1001 0010
这里的 0 表示电动机的当前位置。也就是 ABCD 组合(4种组合之一),假定当前的 ABCD 输出是 0110。
这里的 1 表示电动机的下一个位置。也是 ABCD 组合(4种组合之一),假定当前是正转 ABCD 输出应该是 0011(如果是反转 ABCD 应该是 1100)。

LZ 的 0x2492 -> b 0010 0100 1001 0010 是从右向左使用。
将 b 0010 0100 1001 0010 倒转 为 0100 1001 0010 0100
对应的 ABCD 输出是
0  -> 0110
1  -> 0011
0  -> 0110
0  -> 0110
1  -> 0011
0  -> 0110
0  -> 0110
1  -> 0011
0  -> 0110
0  -> 0110
1  -> 0110
0  -> 0110
0  -> 0110
1  -> 0011
0  -> 0110
0  -> 0110
按照这个序列循环输出,电动机就停到了 5/16 的位置。
发表于 2014-11-21 13:54:56 | 显示全部楼层
linbin250 发表于 2014-11-21 12:23
看来你没有完全看懂:)
LZ的电动机是用2个线控制,被非门扩展成4线。
A,B 线直接控制

感谢你的详细分析,这种用法在调速应用中见过,我画块电路板验证一下。
发表于 2014-11-24 16:18:32 | 显示全部楼层
学习一下.
发表于 2015-1-3 11:49:32 | 显示全部楼层
学习了,这种细分思路很新颖,画块板子验证一下。
发表于 2015-1-14 21:45:31 | 显示全部楼层
楼主  给我个完整版的吧!我需求求教的啊。很想学电机。1270444098@qq.com
发表于 2015-4-17 09:32:46 | 显示全部楼层
这个不错,就是看不懂,楼主给我全部代码让我学习学习好吗?先谢了,zwcled@163.com
发表于 2015-4-17 22:40:26 | 显示全部楼层
步进电机驱动,记号一个
发表于 2016-1-8 17:01:21 | 显示全部楼层
chenyuqiu 发表于 2010-12-11 12:08
呵呵,没有啦。想要的话可以留下联系方式

楼主 麻烦也发我一份吧! 感激感激
发表于 2016-1-17 17:03:50 | 显示全部楼层
本帖最后由 myqiang1990 于 2016-1-17 20:46 编辑

时隔4年,我来给大家解释一下楼主的代码是怎么加速的吧~其实楼主的加速方式是:定频率,变细分(改变步距角)的方式加速的~也就是说~楼的细分是在1-16细分之间变化,最高速是1细分,最低速是16细分,变速的方式是通过改变步距角方式实现的~那个表,只是楼主判断减速点的位置,就是减速的步数~并非是加速表!楼主根本没有通过改变定时器频率的方式进行加速,而是定频率,变步进角的方式实现加速的~

楼主判断升一个频率点或者将一个频率点的方法是:每当当前位置转过了一个步进角(1.8度,即16细分,即16微步后,会变一次速度~)代码如下,下面这句代码就是干这事的 >> 4 等于/16,即对16求正:
c = wPanMotorNowPosition >> 4;
                if (c != cPanDriveValue)
                {
                        cPanDriveValue = c;                        
                        Uln2803Drive(0, -c);
                }
   cPosition       &= 0x3f;//这句话是保证速度在16细分4周期内变化,16*4=64,因为一整完整的正弦波是4周期,16细分的话,就是64
wTemp            = wTableUnl2803DriveValue[cPosition & 0x0f];  //这句话是判断电机细分点在4周期中的,哪一个周期里~

后面的代码我也不理解,不过不太重要了~其他的代码都好理解~~
不是研究舞台灯光的,可能对楼主的加速方式不太了解,因为舞台灯光应用中,一个MCU要控制多路的步进电机,而且还得控制成本,所以一般MCU的得控制多达10几路的电机进行各自的加减速~所以~大家都去找一些另类的加速方式,其中定频率,变步距角的方式,是最简单,最有效,最省MCU时间,省MCU空间的,的一种梯形加速方式~~
发表于 2016-4-29 21:39:13 | 显示全部楼层
这代码学习不错!
发表于 2016-4-29 22:30:30 | 显示全部楼层
学习   
发表于 2016-10-18 10:26:12 | 显示全部楼层
本帖最后由 tj00498 于 2016-10-18 10:27 编辑

总算是看懂了楼主的细分思路,还是有个问题,unsigned int code wTableUnl2803DriveValue[],这个细分的数据不是一定要按楼主的数据,只要能达到16等分就行吧,比如最后的0x7fff,换成0xf7ff
发表于 2016-10-23 15:23:11 | 显示全部楼层
发表于 2016-12-28 16:45:33 | 显示全部楼层
陈大哥现在应该有新的方法了吧,有空要带带小弟啊
发表于 2016-12-30 13:15:32 | 显示全部楼层
谢谢楼主分享
学习了一下收货很大
发表于 2018-7-12 08:38:40 | 显示全部楼层
其实楼主讲的不咋地,姿态很高,但是评论的人却道出了真相,感谢楼主给评论的人机会去教大家
发表于 2018-7-12 09:40:53 | 显示全部楼层
一时还看不明白,收藏起来有空抽时间看看
发表于 2018-12-19 14:08:44 | 显示全部楼层
谢谢楼主
发表于 2019-4-18 10:27:22 | 显示全部楼层
学习ING!!!!!!!!!
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2019-10-23 09:20

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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