您的位置 首页 FPGA

51单片机PWM细分操控步进电机的研讨初稿

为什么要PWM细分呢?因为这样可以是步进电机运行平稳、减小噪音、增大转速(MAX的)、增加力矩……为什么要强调是51单片机呢?因为51单片机

为什么要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#define uchar unsigned char#define uint  unsigned intuchar 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,倒转为-1uchar 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);}

结束!

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/fpga/255365.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部