51单片机PWM细分控制步进电机的研究初稿.docx

上传人:b****8 文档编号:10031982 上传时间:2023-02-08 格式:DOCX 页数:6 大小:79.11KB
下载 相关 举报
51单片机PWM细分控制步进电机的研究初稿.docx_第1页
第1页 / 共6页
51单片机PWM细分控制步进电机的研究初稿.docx_第2页
第2页 / 共6页
51单片机PWM细分控制步进电机的研究初稿.docx_第3页
第3页 / 共6页
51单片机PWM细分控制步进电机的研究初稿.docx_第4页
第4页 / 共6页
51单片机PWM细分控制步进电机的研究初稿.docx_第5页
第5页 / 共6页
点击查看更多>>
下载资源
资源描述

51单片机PWM细分控制步进电机的研究初稿.docx

《51单片机PWM细分控制步进电机的研究初稿.docx》由会员分享,可在线阅读,更多相关《51单片机PWM细分控制步进电机的研究初稿.docx(6页珍藏版)》请在冰豆网上搜索。

51单片机PWM细分控制步进电机的研究初稿.docx

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

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

为什么要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拍)时序为:

其中的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拍的大了……

所以我重新更新后的时序为:

使用这一时序后,终于让我体会到了细分的优越,和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;

#defineucharunsignedchar

#defineuintunsignedint

ucharcodedjsx[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};

ucharcodeys[2][5][2]={224,252,47,254,255,255,47,254,224,252,218,254,137,253,187,251,137,253,218,254};

ucharcodepout[4]={1,2,4,8};

charcount,count_x,count_b,bs=0;

charxzbs=1;//正转为1,倒转为-1

ucharxzsd=6;//我的28电机测试最小为6,此数值越小,转速越快

voidTime0_Init()

{

TMOD=0x01;

IE=0x82;

TH0=0xff;

TL0=0xbd;

TR0=1;

}

voidTime0_Int()interrupt1

{

switch(bs)

{

case0:

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]];

case1:

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;

}

}

voidmain()

{

P1=0;

Time0_Init();

while

(1);

}

完毕!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1