久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

51單片機PWM細分控制步進電機的研究初稿

作者:佚名   來源:本站原創   點擊數:  更新時間:2012年05月20日   【字體:

  為什么要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<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);
}

完畢!

關閉窗口

相關文章

主站蜘蛛池模板: 91成人精品 | 九九色综合 | 成人影院在线 | 亚洲欧美日韩精品久久亚洲区 | 九九精品在线 | 亚洲精品在线免费播放 | 久久精品—区二区三区 | 久操伊人| 午夜小视频免费观看 | 日韩欧美中文字幕在线视频 | 久草成人 | 欧美精品久久久久 | 国产精品久久久久久久久大全 | 噜噜噜噜狠狠狠7777视频 | 久久新视频 | 狠狠草视频| 九九精品在线 | 九色国产 | 久久99一区二区 | 久久久久久免费精品一区二区三区 | 久久国产精品首页 | 成人h视频在线观看 | 欧美激情在线观看一区二区三区 | 久久亚洲国产精品 | 国产精品入口 | 午夜电影网址 | 精品久久久久久亚洲精品 | 久久国产精品无码网站 | 日韩成人精品一区二区三区 | 国产高清视频在线播放 | 国产成人精品高清久久 | 精品国产综合 | 日韩有码一区 | 色婷婷精品久久二区二区蜜臂av | 亚洲国产成人精品女人久久久 | 亚洲午夜精品视频 | h视频免费在线观看 | 中文日韩在线视频 | 色www精品视频在线观看 | 久久国产综合 | 国产精品美女在线观看 |