打印

步进电机细分控制加减速算法专贴(永久讨论)

[复制链接]
65845|205
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主





1、为什么要PWM细分呢?因为这样可以是步进电机运行平稳、减小噪音、增大转速(MAX的)、增加力矩……
游客,如果您要查看本帖隐藏内容请回复
      
2、为什么要强调是51单片机呢?因为51单片机没有硬件PWM模块,所以只能软件模拟了(软件模拟才能了解底层的玩意)……
3、研究这玩意儿,我走了许多弯路,看了许多文献,最后发现,尽信书不如无书……
就用28系列4相5线电机来说吧。
整步驱动(四相四拍)时序为:
      A相    B相    C相    D相
1拍   1       0       0       0
2拍   0       1       0       0
3拍   0       0       1       0
4拍   0       0       0       1
我想没人用这样的方式来驱动吧,这震动也太大了。
2细分驱动(四相八拍)时序为:
      A相    B相    C相    D相
1拍   1       0       0       0
2拍   1       1       0       0
3拍   0       1       0       0
4拍   0       1       1       0
5拍   0       0       1       0
6拍   0       0       1       1
7拍   0       0       0       1
8拍   1       0       0       1
不需要PWM,我想用着方式驱动的人最多吧。
PWM6细分驱动(四相24拍)时序为:
游客,如果您要查看本帖隐藏内容请回复

根据我参看的那些专门研究步进电机的大佬们的论文,他们说步进电机中所有线圈中同一时间电流和为0,就是说我上面的那个时序图中凡是数值为0的地方,其实是应该有相应的负值或零值存在的,使得每一拍四相线圈数值加起来为0,但我就想不通了,要是这样,那怎么使得每相线圈中电流既能正着流,又能反着流?好像我的ULN2003驱动板没这功能吧!所以我采用笨办法,把凡是负数的地方全改为了0,管他的!可能这也是使我用此时序驱动电机不理想的原因吧……最后通过不断试验发现,以此时序驱动电机,震动大、噪音强、转速慢还外加力矩小,一无是处,连4相8拍都不如,真是欲哭无泪……
通过分析4相24拍和4相8拍的时序图,我发现,4相8拍方式下磁力矩的大小的和最小为1,最大为1.414,在半步处!而4相24拍的磁力矩的大小的和最小为1,最大为1.183,也在半步处,难怪了,半步时,转子的小齿离两通电线圈是最远的,此时磁力矩大小和不如4相8拍,那么力矩肯定也就没4相8拍的大了 ……
所以我重新更新后的时序为:
游客,如果您要查看本帖隐藏内容请回复

在PWM的每个周期中,肯定是时序图中数值大的线圈先通电,然后才是小的,一个周期结束后,
所有线圈断电。所以得建立一个描述每拍中是哪一个相(线圈)先通电,哪一个相后通电的数组,以上面的时序图为准,建立的数组为:
djsx[2][24]={0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,0,0,3,1,1,1,0,0,0,2,2,2,1,1,1,3,3,3,2,2,2,0,0,0,3,3};   
//djsx[2][24]中的第一维储存的的就是先通电的线圈的相数,第二维是拍数
时序图中每一相后的众多数字,可以看成是其在某一拍中需要通电的时间,
分析发现,其是有规律的,每隔6拍重复出现一次,由于先通电的都是在每一拍中要一直通电,
所以用数组表式剩下某相在某一拍中通电起始时间和通电的时间:
ys[2][5]={1-0.27,1-0.57,1-1,1-0.57,1-0.
27,0.27,0.57,1,0.57,0.27}={0.73,0.43,0,0.43,0.73,0.27,0.57,1,0.57,0.27};
当51单片机工作在65.536MHz时,每微秒5.461个机器周期,PWM频率为5000Hz时,每周期200微秒,也就是说每周期1092个机器周期,所以ys数组变换为:
ys[2][5]={797,470,0,470,797,295,622,1092,622,295};//通电时间
由于51的定时器分为TH和TL,并且是每机器周期加1,直到溢出中断,所以ys数组得再加一维,分别用来贮存TL和TH,所以变换为:
ys[2][5][2]={224,252,47,254,255,255,47,254,224,252,218,254,137,253,187,251,137,253,218,254};
程序源代码为:
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
uchar code djsx[2][24]={0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,0,0,3,1,1,1,0,0,0,2,2,2,1,1,1,3,3,3,2,2,2,0,0,0,3,3};
uchar code ys[2][5][2]={224,252,47,254,255,255,47,254,224,252,218,254,137,253,187,251,137,253,218,254};
uchar code pout[4]={1,2,4,8};
char count,count_x,count_b,bs=0;
char xzbs=1;       //正转为1,倒转为-1
uchar xzsd=6;     //我的28电机测试最小为6,此数值越小,转速越快

void Time0_Init()
{
        TMOD=0x01;
        IE=0x82;
        TH0=0xff;
        TL0=0xbd;        
        TR0=1;
}

void Time0_Int() interrupt 1
{
        switch(bs)
        {
                case 0:
                if(count_x==0)
                {
                        TL0=187;
                        TH0=251;
                        P1=pout[djsx[0][count_b*6]];
                        count++;
                        break;
                }
                if(count_x!=3)
                {
                        TL0=ys[0][count_x-1][0];                        
                        TH0=ys[0][count_x-1][1];
                        P1=pout[djsx[0][count_b*6+count_x]];
                        bs=1;
                        break;
                }
                P1=pout[djsx[0][count_b*6+3]];
                case 1:
                TL0=ys[1][count_x-1][0];
                TH0=ys[1][count_x-1][1];
                P1=P1+pout[djsx[1][count_b*6+count_x]];
                bs=0;
                count++;
        }
        if(bs==0)
        {
                if(count==xzsd)
                {
                        count=0;
                        count_x=count_x+xzbs;
                }
                if(count_x==6)
                {
                        count_x=0;
                        count_b++;
                }
                if(count_x==-1)
                {
                        count_x=5;
                        count_b--;
                }
                if(count_b==4)count_b=0;
                if(count_b==-1)count_b=3;
        }
}


void main()
{
        P1=0;
        Time0_Init();
        while(1);
}   
                                                                                                                                              (整理于网络)







733325b6ae960e0e84.png (55.71 KB )

733325b6ae960e0e84.png
评论
liuzhiyong92388 2018-12-22 13:25 回复TA
;klkjl 

相关帖子

沙发
山东电子小菜鸟|  楼主 | 2017-9-6 20:58 | 只看该作者
本帖最后由 山东电子小菜鸟 于 2017-9-6 21:14 编辑

欢迎讨论

使用特权

评论回复
板凳
hairo| | 2017-9-7 15:55 | 只看该作者
进来看看。。

使用特权

评论回复
地板
菜鸟同学| | 2017-9-9 18:55 | 只看该作者
怎么讨论,,细分只是步进电机控制的第一个起步阶段。为什么细分,利用PWM模拟模拟信号,实现 几个力可以 细调,实现平滑控制。

使用特权

评论回复
5
suxindg| | 2017-9-12 11:09 | 只看该作者
谢谢分享

使用特权

评论回复
6
caijie001| | 2017-9-12 23:34 | 只看该作者
看看

使用特权

评论回复
7
刘冰024| | 2017-9-14 22:40 | 只看该作者
非常好

使用特权

评论回复
8
ipoemcsw| | 2017-10-5 22:09 | 只看该作者
学习一下,谢谢楼主分享!

使用特权

评论回复
9
mjhhn| | 2017-10-10 01:10 | 只看该作者
研究一下

使用特权

评论回复
10
wzq666| | 2017-10-12 09:09 | 只看该作者
谢谢分享

使用特权

评论回复
11
baicaibang| | 2017-10-18 17:14 | 只看该作者
谢谢分享

使用特权

评论回复
12
六零| | 2017-10-23 15:23 | 只看该作者
感谢分享

使用特权

评论回复
13
lisingch| | 2017-10-23 15:30 | 只看该作者
学习学习!

使用特权

评论回复
14
cqrg| | 2017-10-25 19:55 | 只看该作者
不管东西咋样 还是先谢谢了

使用特权

评论回复
15
ddcchh168| | 2017-10-30 23:27 | 只看该作者
看看学习一下

使用特权

评论回复
16
zxs2888| | 2017-11-8 20:12 | 只看该作者
谢谢分享

使用特权

评论回复
17
victries| | 2017-11-12 11:15 | 只看该作者
看一看,看一看,学习一下

使用特权

评论回复
18
2010小老虎2010| | 2017-11-13 22:14 | 只看该作者
谢谢分享

使用特权

评论回复
19
chen158333| | 2017-11-14 11:02 | 只看该作者
谢谢楼主的分享

使用特权

评论回复
20
wangzheshuren| | 2017-11-15 12:57 | 只看该作者
看看吧!

使用特权

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

本版积分规则

个人签名:qq:641208111;技术交流群:377640799 大学电子竞赛预热赛开赛啦~千元大奖等你来拿火热进行中!!点击参加活动 欢迎加个人QQ:641208111一起交流合作

140

主题

3082

帖子

23

粉丝