51微控制器按鍵控制步進電機加減速及正反轉
阿新 • • 發佈:2018-12-19
之前嘗試用微控制器控制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一定要串聯電阻,否則可能會燒壞驅動器控制介面電路。
- 接通電源後如果驅動器燈亮,但是無法控制電機旋轉,考慮控制部分驅動能力不足或者驅動器所設定的驅動電流不夠(我就遇到過這種情況,後來通過調高驅動器限制電流解決的此問題)。
- 判斷步進電機四條線的定義:將任意兩條線接在一起,用手旋轉電機,如果有阻力,則兩條線是同一相。用相同方法測試另外兩條線是否是同一相。確定同相的兩條線任意接入兩相介面,如果旋轉方向相反只需換相即可。