步進電機的調速

穿著睡衣到處跑發表於2018-06-07

繼續繼續。

步進電機轉速控制

一、  任務

在SMSpeed.DSN的電路上實現:當KEY2按下時,電機停止轉動,釋放時繼續轉動。當KEY1按下時,電機以60轉/min的轉速正轉,釋放時以120轉/min的轉速反轉。

二、  設計參考:

① 4相步進電機,每順序切換一相(1步),電機旋轉18°,電機轉動1圈共需要20步。

② 用定時實現對電機轉速的控制(當轉速為60轉/min時,步進時間間隔為50ms;當轉速為120轉/min時,步進時間間隔為25ms)。中斷服務程式步驟如下:

If(KEY1按下)

{

     重置定時時間為50ms;

     正轉切換到下一步;

}

Else

{

     重置定時時間為25ms

     反轉切換到下一步;

}

③ 對於TX定時器,若其GATE=1且TRX=1時,則外部訊號(INTX)可直接實現對TX定時器的執行控制(從而實現對電機轉動與停止的控制)。

 

晶片2003不用管可以直接看IO口,長條那個數碼管是用來計數的然後可以看出頻率。

我的設計思路:

驅動步進電機:依次給電機的4根線低電平就可以動了,我用了簡單的位操作,時間關係不多說。

按鍵設計:這裡接在中斷,我設計的可能比較複雜。

                按鍵1:我設定的是低電平觸發,一直按著就一直進去跑中斷的程式碼。出來後主函式還有個判斷就執行另一功能。

               按鍵2:低電平觸發,中斷函式啥也不幹,一直按著就相當於卡在中斷裡,就暫停了嘛。

因為涉及了幾個中斷服務所以設定一下優先順序,不然按著暫停 電機還飛快的跑,將定時器的優先順序設定成最低就行了。

#include  "reg51.h"

char count = 0;                      //計數標誌位
char LED = 0;                        
unsigned char dir = 0;             //第幾步的標誌位
unsigned char sign_num = 50;       //每步時間的標誌位
char num_Switch = 0;               //程式選擇位
sbit key2 = P3^3;
sbit key1 = P3^2;

void delay50ms(void)   //?? 0us
{
    unsigned char a,b;
    for(b=165;b>0;b--)
        for(a=150;a>0;a--);
}

void TIMER_Init()
{
    TMOD = 0x10;                //定時器1,方式1
    TH1 = 0xFC;                 // 初始值1MS進入一次中斷
    TL1 = 0x18;
    TR1= 1;
    ET1 = 1;
    
    IT0 = 0;                    //兩個INT都設定成低電平出發
    EX0 = 1;
    IT1 = 0;
    EX1 = 1;
    EA = 1;
    
    PT1 = 0;                   //設定定時器位最低優先順序
    PX0 = 1;                  //設定INT0為高優先順序,這句可以不要吧嘿嘿
}

void zhengzhuan()                         //正轉函式
{
 LED = ~(0x01<<dir);    P1 = LED;
}

void fanzhuan()                           //反轉函式
{
 LED = ~(0x10>>dir);    P1 = LED;
}

void main()
{
TIMER_Init();
LED = 0xff;              //初始化LED值
while(1)
{
    if(key1==0) num_Switch = 1;                   
    switch(num_Switch)                         //選擇執行的程式
    {
      case 0 : zhengzhuan();break;
      case 1 : fanzhuan();sign_num = 25;break;  
    }
}

}
void int0() interrupt 0    //按鍵1
{    
    while(key1==0)
    {
        zhengzhuan();
        dir++;
       if(dir>3)dir=0;
       delay50ms();         //延時來控制電機轉動速度
    }
}    

void int1() interrupt 2   //按鍵2
{

}    

void PWM() interrupt 3    //定時器中斷
{
    TH1 = 0xFC;
    TL1 = 0x18;
    count++;     
    if(dir>3)dir=0;       //每走4步一個輪迴
    if(count == sign_num) //每走一步的時間
    {
        dir++;
        count = 0;
    }
}

OK寫完了。







相關文章