QQ登录

只需一步,快速开始

51单片机PWM细分控制步进电机的研究初稿(原创)

  [复制链接]
theurgy 发表于 2010-7-10 17:43 | 显示全部楼层 |阅读模式 来自: 中国–云南–大理白族自治州 联通

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?加入牧夫(请注明天文爱好者,否则无法通过审核,请勿使用gmail/outlook/aol/icloud邮箱注册)

×
为什么要PWM细分呢?因为这样可以是步进电机运行平稳、减小噪音、增大转速(MAX的)、增加力矩……
为什么要强调是51单片机呢?因为51单片机没有硬件PWM模块,所以只能软件模拟了……
研究这玩意儿,我走了许多弯路,看了许多文献,最后发现,尽信书不如无书……
就用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拍)时序为:
        1      2      3      4      5      6      7      8      9     10     11     12     13     14     15     16     17     18     19     20     21     22     23     24
A相   1   0.97  0.87 0.70 0.50 0.26   0      0      0      0       0       0       0       0       0       0       0       0       0    0.26   0.50  0.70  0.87  0.97
B相   0   0.26  0.50 0.70 0.87 0.97   1    0.97 0.87 0.70 0.50  0.26     0       0       0       0       0       0       0       0       0       0       0       0
C相   0      0       0      0     0      0      0    0.26 0.50 0.70 0.87  0.97     1    0.97  0.87  0.70  0.50   0.26    0       0       0       0       0       0
D相   0      0      0       0     0      0      0      0      0      0       0       0       0    0.26  0.50  0.70  0.87   0.97    1    0.97  0.87  0.70   0.50   0.26
其中的0.97、0.87、0.70、0.50、0.26分别是COS15°、COS30°、COS45°、COS60°和COS75°的近似值。
根据我参看的那些专门研究步进电机的大佬们的论文,他们说步进电机中所有线圈中同一时间电流和为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拍的大了 ……
所以我重新更新后的时序为:
        1      2      3      4      5      6      7      8      9     10     11     12     13     14     15     16     17     18     19     20     21     22     23     24
A相   1      1      1      1    0.57 0.27   0      0      0      0       0       0       0       0       0       0       0       0       0    0.27   0.57    1       1       1
B相   0   0.27  0.57   1      1      1      1      1      1      1    0.57  0.27     0       0       0       0       0       0       0       0       0       0       0       0
C相   0      0      0      0      0      0      0    0.27 0.57   1       1       1       1       1       1       1    0.57   0.27    0       0       0       0       0       0
D相   0      0      0      0      0      0      0      0      0      0       0       0       0    0.27  0.57     1       1       1       1       1       1       1    0.57   0.27
使用这一时序后,终于让我体会到了细分的优越,和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);
}
虎子哥 发表于 2010-7-10 18:46 | 显示全部楼层 来自: 中国–上海–上海 东方有线
mark,直流驱动的飘过
回复 顶~ 砸~

使用道具 举报

shiaki 发表于 2010-7-10 19:09 | 显示全部楼层 来自: 中国–天津–天津 教育网/南开大学教育网
用脉宽调制只控制过直流的...
回复 顶~ 砸~

使用道具 举报

夏雾时 发表于 2010-7-10 19:47 | 显示全部楼层 来自: 中国–辽宁–大连–旅顺口区 联通
居然有研究51的,明年我打算进军ARM+DSP了。
回复 顶~ 砸~

使用道具 举报

ddr 发表于 2010-7-11 20:02 | 显示全部楼层 来自: 中国–北京–北京 鹏博士BGP
提示: 作者被禁止或删除 内容自动屏蔽
回复 顶~ 砸~

使用道具 举报

asdf987 发表于 2010-7-11 20:17 | 显示全部楼层 来自: 中国–山东–泰安–泰山区 联通
本帖最后由 asdf987 于 2010-7-11 20:25 编辑

DDR的方法是正解。还是买一片专用的细分芯片吧。
回复 顶~ 砸~

使用道具 举报

asdf987 发表于 2010-7-11 20:24 | 显示全部楼层 来自: 中国–山东–泰安–泰山区 联通
本帖最后由 asdf987 于 2010-7-11 20:29 编辑

回复 4# 夏雾时


    51并不代表水平低技术含量低,AVRDSP并不代表水平高,他们都是一个处理单元,关键是你用它们干什么,采用什么算法,用什么外围器件,只有各方面最合适的,性价比最高的才是最好的。
    现在市场上几十万的医疗器械里面的控制电路用51做核心的依然不少。
回复 顶~ 砸~

使用道具 举报

昘蕡凬錚 发表于 2010-7-11 21:53 | 显示全部楼层 来自: 中国–山西–运城 联通
DDR问你个问题。今天我写了一些程序,结果T/C0不工作,总中断,TIMSK屏蔽,分频都设置了。
回复 顶~ 砸~

使用道具 举报

 楼主| theurgy 发表于 2010-7-12 00:58 | 显示全部楼层 来自: 中国–云南–大理白族自治州 联通
回复 5# ddr


    呵呵,确实51来稿PWM有点吃力呀,不过我现在买了STC12系列,带两个PWM模块,正在练手中……另外,斩波驱动对于PWM不是必须的吧,因为电机线圈和驱动电路构成了一RL电路,他有着阻滞电流变化的特性(这让我想起了高中时物理老师做的那实验,把一开关、线圈和灯泡串联起来然后再并接一电阻最后接上电源,结果闭合开关,灯泡是慢慢亮起来的,而接着再打开开关,小灯泡就猛地一闪……美国国家点火装置用的就是这一原理,不过他们用来蓄能的是电容,跑题了……),通过快速的调节通电与断电的时间(即所谓的调节占空比),使的电流能够波动的保持在某一中间值上。通过查看一些文献,在简单的应用中,可以将占空比与流经线圈的电流关系看作是线性的!不过前提是PWM频率要快,一般都是在20KHz以上,51就算了……
如果是精确控制,现在流行的方法是测量电机绕组的过零电动势,从而间接地判断出电机转子的当前位置,从而得以精确控制。不过这需要外围电路和A/D转换的支持,对CPU的速度也有很高的要求……另外地方法就是需要电机中安装霍尔元件了,这样的电机我还没见到过,所以也不好说……
回复 顶~ 砸~

使用道具 举报

feiyuncai 发表于 2010-7-12 08:47 | 显示全部楼层 来自: 中国–江苏–苏州 电信
楼主会用C语言编程?牛哦,想学,但是学不会
回复 顶~ 砸~

使用道具 举报

asdf987 发表于 2010-7-12 15:57 | 显示全部楼层 来自: 中国–山东–泰安 联通
回复 9# theurgy


    我觉的你的方法理论性太强,不大现实。还是细分芯片的好,我的一个老师做的项目,加细分芯片前和加细分芯片后简直判若两人,效果很明显。
回复 顶~ 砸~

使用道具 举报

 楼主| theurgy 发表于 2010-7-12 16:33 | 显示全部楼层 来自: 中国–云南–大理白族自治州 联通
回复 11# asdf987


    使用专用的驱动芯片,实现了步进电机的闭环控制,控制效果与CPU占用率自然就好,但成本高。使用开环控制,效果虽然没有闭环的好,但是也差强人意,比不细分要强,而且现在的单片机普遍带有硬件PWM模块,所以也不存在CPU占用率问题(51就一边呆着吧……),成本低呀。我的方法用51单片机来实现确实有点不太现实,毕竟初步估算这将占用CPU起码50%以上的资源。不过不是说这开环控制的方法就不现实,网上这样使用开环控制的实例比比皆是,不然硬件产商干吗只往单片机中加PWM模块,而不是加入整个闭环控制模块呢?我并不是学这个的(可以说我学的和这一点关系也没有),搞这个仅仅凭的是兴趣,所以我也不知道我的方法是对是错,但是只要自己搞的高兴,效果不错,我想就没什么问题吧!呵呵
回复 顶~ 砸~

使用道具 举报

夏雾时 发表于 2010-7-13 00:08 | 显示全部楼层 来自: 中国–辽宁–大连–旅顺口区 联通
回复 7# asdf987


   的确,现在51还是最完善的。俗话说好,只买对的不买贵的。不过一些算法还是51力所不及啊,主要是速度和容量。
回复 顶~ 砸~

使用道具 举报

asdf987 发表于 2010-7-13 22:26 | 显示全部楼层 来自: 中国–山东 联通/数据上网公共出口
本帖最后由 asdf987 于 2010-7-13 22:30 编辑

回复 12# theurgy


    驱动芯片只实现细分,不管闭环的事。用步进电机就这个好处,可以数脉冲,知道转过多大的角度。闭环带反馈的话,成本可高了,要加编码器,要不你怎么能准确知道你的电机转了多少,那不成了伺服电机了?
回复 顶~ 砸~

使用道具 举报

AKKA 发表于 2010-7-14 19:39 | 显示全部楼层 来自: 中国–河南 中移铁通
都是牛人啊 这么专业
回复 顶~ 砸~

使用道具 举报

 楼主| theurgy 发表于 2010-7-15 09:24 | 显示全部楼层 来自: 中国–云南–大理白族自治州 联通
回复 14# asdf987


    呵呵,不必太认真呀!这些东西我也就是半瓶子醋,拿出来晃荡晃荡就被人抓了 ……不过譬如斩波驱动这样的方式应该算是闭环了吧,毕竟要检测到流经线圈的电流。等什么时候也买一个L297N+L298N来试试效果!
回复 顶~ 砸~

使用道具 举报

漏勺 发表于 2010-7-15 10:34 | 显示全部楼层 来自: 中国–北京–北京 鹏博士BGP
提示: 作者被禁止或删除 内容自动屏蔽
回复 顶~ 砸~

使用道具 举报

cynosure 发表于 2011-10-27 23:28 | 显示全部楼层 来自: 中国–四川–成都 电信
楼主还在么?????继续讨论吧?
回复 顶~ 砸~

使用道具 举报

本版积分规则

APP下載|手机版|爱牧夫天文淘宝店|牧夫天文网 ( 公安备案号21021102000967 )|网站地图|辽ICP备19018387号

GMT+8, 2024-11-22 20:19 , Processed in 0.078863 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

Copyright © 2001-2020, Tencent Cloud.

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