1. 程式人生 > >51微控制器按鍵控制步進電機加減速及正反轉

51微控制器按鍵控制步進電機加減速及正反轉

    之前嘗試用微控制器控制42步進電機正反轉,電機連線導軌實現滑臺前進後退,在這裡分享一下測試程式及接線圖,程式部分參考網上找到的,已經實際測試過,可以實現控制功能。

    所用硬體:步進電機及驅動器、STC89C52微控制器、直流電源

1、硬體連線圖

                   

  • 注意:上圖為共陽極接法,實際連線參考總體線路連線。
  • 驅動器訊號端定義:

PUL+:脈衝訊號輸入正。( CP+ )

PUL-:脈衝訊號輸入負。( CP- )

DIR+:電機正、反轉控制正。

DIR-:電機正、反轉控制負。

EN+:電機離線控制正。

EN-:電機離線控制負。

  • 電機繞組連線

A+:連線電機繞組A+相。

A-:連線電機繞組A-相。

B+:連線電機繞組B+相。

B-:連線電機繞組B-相。

  • 電源連線

VCC:電源正端“+”

GND:電源負端“-”

注意:DC直流範圍:9-32V。不可以超過此範圍,否則會無法正常工作甚至損壞驅動器.

  • 總體線路連線

輸入訊號共有三路,它們是:①步進脈衝訊號PUL+,PUL-;②方向電平信 號DIR+,DIR-③離線訊號EN+,EN-。輸入訊號介面有兩種接法,可根據 需要採用共陽極接法或共陰極接法。

在這裡我採用的是共陰極接法:分別將 PUL-,DIR-,EN-連線到控制系統的地端(接入微控制器地端); 脈衝輸入訊號通過PUL+接入微控制器(程式碼中給的P2^6腳),方向訊號通過DIR+接入微控制器(程式碼中給的P2^4腳),使能訊號通過EN+接 入(不接也可,程式碼中未接,置空)。

注意:接線時請斷開電源,電機接線需注意不要錯相,相內相間短路, 以免損壞驅動器。

2、程式碼

#include<reg51.h> 
#define MotorTabNum 5
unsigned char T0_NUM;
sbit K1 = P3^5;        // 啟動
sbit K2 = P3^4;        // 反轉
sbit K3 = P3^3;        // 加速
sbit K4 = P3^2;        // 減速
sbit K5 = P3^1;        //正反轉

sbit FX      = P2^4;     // 方向
//sbit MotorEn = P2^5;     // 使能
sbit CLK     = P2^6;     // 脈衝

int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};           

unsigned char g_MotorSt = 0;     // 
unsigned char g_MotorDir = 0;    // 
unsigned char MotorTab[7] = {12, 10, 8, 6, 4, 2,1};

signed char g_MotorNum = 0;

void delayms(xms);
void mDelay(unsigned int DelayTime);                
void T0_Init();

void KeyScan(void);



void main(void)
{
        T0_Init();            
 //       MotorEn = 0;     // 
        FX = 0;
        while(1)
        {
                KeyScan();              // 
        }


}

void T0_Init()
{
        TMOD = 0x01;
        TH0 = (65535-100)/256;  // 1ms
        TL0 = (65535-100)%256;
        EA = 1;
        ET0 = 1;
//        TR0 = 1; 

}

void T0_time() interrupt 1
{
//        TR0 = 0;
        TH0 = (65535-100)/256;   
        TL0 = (65535-100)%256;
        T0_NUM++;
        if(T0_NUM >= MotorTab[g_MotorNum])        // 
        {
                T0_NUM = 0;
                CLK=CLK^0x01;               //   
        }
//        TR0 = 1;
}         


//-----????---------------------
void KeyScan(void)
{
        if(K1 == 0)
        {
                delayms(10);   
                if(K1 == 0)
                {
                        g_MotorSt = g_MotorSt ^ 0x01;
                      //  MotorEn ^= 1;
                        TR0 = 1; 
						FX ^= 0;   //反轉
                }
        }

        if(K2 == 0)
        {
                delayms(10);   //正轉
                if(K2 == 0)
                {    
                        g_MotorDir = g_MotorDir ^ 0x01;
                        FX ^= 1;    //加速
                }
        }

        if(K3 == 0)  // 
        {
                delayms(5);   //加速
                if(K3 == 0)
                {   
                        g_MotorNum++;
                        if(g_MotorNum > MotorTabNum)
                                g_MotorNum = MotorTabNum;
                }
        }

        if(K4 == 0)  // 
        {
                delayms(5);   // 減速
                if(K4 == 0)
                {       
                    g_MotorNum--;
                    if(g_MotorNum < 0)
                    g_MotorNum = 0;
                }
        }

		if(K5 == 0)  // 
		{
				delayms(10);   // 正反轉
				if(K5 == 0)
				{      
				    g_MotorSt = g_MotorSt ^ 0x01;
					g_MotorDir = g_MotorDir ^ 0x01;
                    MotorEn ^= 1;
                    TR0 = 1;
			        while(1)
					{
                       FX ^= 1;    //													        
                       delayms(90000);
					   FX ^= 0;    //
					   delayms(90000);
					}
				}
		}
}

void delayms(xms)//延時
{
         unsigned int x,y;
         for(x=xms;x>0;x--)
                 for(y=110;y>0;y--);
}

3、常見問題解答

  • 控制訊號高於5v一定要串聯電阻,否則可能會燒壞驅動器控制介面電路。
  • 接通電源後如果驅動器燈亮,但是無法控制電機旋轉,考慮控制部分驅動能力不足或者驅動器所設定的驅動電流不夠(我就遇到過這種情況,後來通過調高驅動器限制電流解決的此問題)。
  • 判斷步進電機四條線的定義:將任意兩條線接在一起,用手旋轉電機,如果有阻力,則兩條線是同一相。用相同方法測試另外兩條線是否是同一相。確定同相的兩條線任意接入兩相介面,如果旋轉方向相反只需換相即可。