概述
演示單極步進電機的控制。沒有現成的 H 橋模塊,雙極步進電機就不做實驗啦。
這里沒有使用 stepper 庫,用 IO 粗糙地原始地驅動,以加深對步進電機驅動的理解,實際使用的時候當然有庫就用庫啦。
示例程序
整步驅動
// ---------------------------------------------------------------------------- // unipolarStepperTest_fullStep.ino // // Created 2015-06-27 // By seesea <seesea2517#gmail#com> // // 單極步進電機單相勵磁整步驅動方式測試 // // 通過 uln2003 來控制,arduino 每一個 IO 口接一個輸入,對應輸出分別接到電機上,因 uln2003 是集電極開路輸出,所以電機公共端接高電平 // ---------------------------------------------------------------------------- const unsigned char pins[] = { 8, 9, 10, 11 }; const unsigned char pinNum = sizeof(pins) / sizeof(pins[0]); const unsigned char delayMs = 10; // 每步動作間隔,控制速度 const char dir = 1; // 正負一用來控制轉動方向 void setup() { for (unsigned char i = 0; i < pinNum; ++i) { pinMode(pins[i], OUTPUT); digitalWrite(pins[i], LOW); } } // 每次進入函數時輪換引腳,在輪換到的引腳上發出高電平后經 uln2003 反相成低電平給電機上電 void loop() { static unsigned char pulsePin = 0; digitalWrite(pins[pulsePin], HIGH); delay(delayMs); digitalWrite(pins[pulsePin], LOW); pulsePin = (pulsePin + dir + pinNum) % pinNum; }
半步驅動
// ---------------------------------------------------------------------------- // unipolarStepperTest_halfStep.ino // // Created 2015-06-28 // By seesea <seesea2517#gmail#com> // // 單極步進電機單相勵磁半步驅動方式測試 // 使用兩種方式來實現,一種使用數組做控制序列的,一種使用算法來實現 // // 通過 uln2003 來控制,arduino 每一個 IO 口接一個輸入,對應輸出分別接到電機上,因 uln2003 是集電極開路輸出,所以電機公共端接高電平 // ---------------------------------------------------------------------------- const unsigned char pins[] = { 8, 9, 10, 11 }; const unsigned char pinNum = sizeof(pins) / sizeof(pins[0]); const unsigned char delayMs = 10; // 每次動作間隔,控制速度 const char dir = 1; // 正負一用來控制轉動方向 const unsigned char controlSeq[] = { 0x08, 0x0C, 0x04, 0x06, 0x02, 0x03, 0x01, 0x09 }; // 控制序列:以低四位來表示 pins 里的 4 個引腳某一次動作時需要通電的兩引腳 const unsigned char pinMask[] = { 0x01, 0x02, 0x04, 0x08 }; // 引腳對應掩碼 const unsigned char seqNum = sizeof(controlSeq) / sizeof(controlSeq[0]); // 如果把控制序列改成這樣,就變成原來的單相勵磁整步前進的方式:const unsigned char controlSeq[] = { 0x08, 0x04, 0x02, 0x01 }; // 如果把控制序列改成這樣,就變成雙相勵磁整步前進的方式:const unsigned char controlSeq[] = { 0x0C, 0x06, 0x03, 0x09 }; // 使用控制序列的方式來實現的半步驅動 // 對於復雜的沒有什么規律的方式可以選用 void halfStep_controlSeq() { static unsigned char seqIndex = 0; // 當前序列 // 發出高電平后經 uln2003 反相成低電平給電機上電 for (unsigned char i = 0; i < pinNum; ++i) { digitalWrite(pins[i], (controlSeq[seqIndex] & pinMask[i]) ? HIGH : LOW); } seqIndex = (seqIndex + dir + seqNum) % seqNum; delay(delayMs); } // 用算法來實現的半步驅動 // 半步驅動的操作其實也是有一定規律的,所以也可以用一定的算法來實現 void halfStep_algrothm() { static unsigned char pulsePin1 = 0; static unsigned char pulsePin2 = 0; digitalWrite(pins[pulsePin1], HIGH); digitalWrite(pins[pulsePin2], HIGH); delay(delayMs); digitalWrite(pins[pulsePin1], LOW); digitalWrite(pins[pulsePin2], LOW); // 算法實現 // 兩個引腳的索引按規律前進(這里的前進是以 dir 為標准,如果 dir 是負數,把后退方向當成前進): // - 當兩個引腳一樣的時候,pin1 前進 // - 當兩個引腳不一樣的時候,pin2 前進 if (pulsePin1 == pulsePin2) pulsePin1 = (pulsePin1 + dir + pinNum) % pinNum; else pulsePin2 = (pulsePin2 + dir + pinNum) % pinNum; } void setup() { Serial.begin(9600); for (unsigned char i = 0; i < pinNum; ++i) { pinMode(pins[i], OUTPUT); digitalWrite(pins[i], LOW); } } void loop() { halfStep_controlSeq(); // halfStep_algrothm(); }
實驗照片
![]() |