1. 程式人生 > 其它 >4相5線步進電機驅動原理

4相5線步進電機驅動原理

技術標籤:IC元件

步進電機驅動原理

步進電機是將電脈衝訊號轉變為角位移或線位移的開環控制元件。在非超載的情況下,電機的轉速、停止的位置只取決於脈衝訊號的頻率和脈衝數,而不受負載變化的影響,即給電機加一個脈衝訊號,電機則轉過一個步距角。這一線性關係的存在,加上步進電機只有週期性的誤差而無累積誤差等特點。使得在速度、位置等控制領域用步進電機來控制變的非常的簡單。
步進電機的主要特性:
1、 步進電機必須加驅動才可以運轉, 驅動訊號必須為脈衝訊號,沒有脈衝的時候,步進電機靜止, 如果加入適當的脈衝訊號, 就會以一定的角度(稱為步角)轉動。轉動的速度和脈衝的頻率成正比。
2、 黑金剛配套的是 28BYJ48 5V 驅動的 4 相 5 線的步進電機,而且是減速步進電機,減速比為 1:64,步進角為 5.625/64 度。如果需要轉動 1 圈,那麼需要360/5.625*64=4096 個脈衝訊號。

3、 步進電機具有瞬間啟動和急速停止的優越特性。
4、 改變脈衝的順序, 可以方便的改變轉動的方向。
在這裡插入圖片描述
步進電機公共端為高電平,各個相位給低電平則有電流通過產生磁場驅動電機轉動。

程式編寫

#define STEP_MOTOR_A_PIN          P12     /*橙色*/
#define STEP_MOTOR_B_PIN          P13     /*黃色*/
#define STEP_MOTOR_C_PIN          P14     /*粉色*/
#define STEP_MOTOR_D_PIN          P15     /*藍色*/

#define STEP_MOTOR_SPEED          2
#define STEP_MOTOR_DIRE_FOREWARD 1 #define STEP_MOTOR_DIRE_ROLLBACK 2 static uint8 MotorStepCount = 0; /*函式宣告*/ static void step_motor_a_output(void); static void step_motor_ab_output(void); static void step_motor_b_output(void); static void step_motor_bc_output(void); static void step_motor_c_output
(void); static void step_motor_cd_output(void); static void step_motor_d_output(void); static void step_motor_da_output(void); static void step_motor_foreward_output(uint8 step); static void step_motor_rollback_output(uint8 step); static void step_motor_foreward(uint8 speed); static void step_motor_rollback(uint8 speed); //======================================================================== // 簡述: 步進電機驅動 // 引數: dire:步進電機方向 speed:步進電機轉速 // 返回: 無 // 詳述: //======================================================================== void step_motor_drive(uint8 dire,uint8 speed) { switch(dire) { case STEP_MOTOR_DIRE_FOREWARD: { step_motor_foreward(speed); break; } case STEP_MOTOR_DIRE_ROLLBACK: { step_motor_rollback(speed); break; } default: break; } } //======================================================================== // 簡述: 步進電機停止 // 引數: 無 // 返回: 無 // 詳述: (ULN2003有反向功能) //======================================================================== void step_motor_stop(void) { STEP_MOTOR_A_PIN = 0; STEP_MOTOR_B_PIN = 0; STEP_MOTOR_C_PIN = 0; STEP_MOTOR_D_PIN = 0; } //======================================================================== // 簡述: 步進電機正轉 // 引數: 無 // 返回: 無 // 詳述: //======================================================================== static void step_motor_foreward(uint8 speed) { if((MotorStepCount++) > 7) MotorStepCount = 0; step_motor_foreward_output(MotorStepCount); delay_ms(speed); } //======================================================================== // 簡述: 步進電機反轉 // 引數: 無 // 返回: 無 // 詳述: //======================================================================== static void step_motor_rollback(uint8 speed) { if((MotorStepCount++) > 7) MotorStepCount = 0; step_motor_rollback_output(MotorStepCount); delay_ms(speed); } //======================================================================== // 簡述: 步進電機正向輸出 // 引數: 無 // 返回: 無 // 詳述: //======================================================================== static void step_motor_foreward_output(uint8 step) { switch(step) { case 0: { step_motor_a_output(); break; } case 1: { step_motor_ab_output(); break; } case 2: { step_motor_b_output(); break; } case 3: { step_motor_bc_output(); break; } case 4: { step_motor_c_output(); break; } case 5: { step_motor_cd_output(); break; } case 6: { step_motor_d_output(); break; } case 7: { step_motor_da_output(); break; } default: break; } } //======================================================================== // 簡述: 步進電機反向輸出 // 引數: 無 // 返回: 無 // 詳述: //======================================================================== static void step_motor_rollback_output(uint8 step) { switch(step) { case 0: { step_motor_a_output(); break; } case 1: { step_motor_da_output(); break; } case 2: { step_motor_d_output(); break; } case 3: { step_motor_cd_output(); break; } case 4: { step_motor_c_output(); break; } case 5: { step_motor_bc_output(); break; } case 6: { step_motor_b_output(); break; } case 7: { step_motor_ab_output(); break; } default: break; } } //======================================================================== // 簡述: 步進電機引腳控制 // 引數: 無 // 返回: 無 // 詳述: 步進電機A相輸出(ULN2003有反向功能) //======================================================================== static void step_motor_a_output(void) { STEP_MOTOR_A_PIN = 1; STEP_MOTOR_B_PIN = 0; STEP_MOTOR_C_PIN = 0; STEP_MOTOR_D_PIN = 0; } //======================================================================== // 簡述: 步進電機引腳控制 // 引數: 無 // 返回: 無 // 詳述: 步進電機AB相輸出(ULN2003有反向功能) //======================================================================== static void step_motor_ab_output(void) { STEP_MOTOR_A_PIN = 1; STEP_MOTOR_B_PIN = 1; STEP_MOTOR_C_PIN = 0; STEP_MOTOR_D_PIN = 0; } //======================================================================== // 簡述: 步進電機引腳控制 // 引數: 無 // 返回: 無 // 詳述: 步進電機B相輸出(ULN2003有反向功能) //======================================================================== static void step_motor_b_output(void) { STEP_MOTOR_A_PIN = 0; STEP_MOTOR_B_PIN = 1; STEP_MOTOR_C_PIN = 0; STEP_MOTOR_D_PIN = 0; } //======================================================================== // 簡述: 步進電機引腳控制 // 引數: 無 // 返回: 無 // 詳述: 步進電機BC相輸出(ULN2003有反向功能) //======================================================================== static void step_motor_bc_output(void) { STEP_MOTOR_A_PIN = 0; STEP_MOTOR_B_PIN = 1; STEP_MOTOR_C_PIN = 1; STEP_MOTOR_D_PIN = 0; } //======================================================================== // 簡述: 步進電機引腳控制 // 引數: 無 // 返回: 無 // 詳述: 步進電機C相輸出(ULN2003有反向功能) //======================================================================== static void step_motor_c_output(void) { STEP_MOTOR_A_PIN = 0; STEP_MOTOR_B_PIN = 0; STEP_MOTOR_C_PIN = 1; STEP_MOTOR_D_PIN = 0; } //======================================================================== // 簡述: 步進電機引腳控制 // 引數: 無 // 返回: 無 // 詳述: 步進電機CD相輸出(ULN2003有反向功能) //======================================================================== static void step_motor_cd_output(void) { STEP_MOTOR_A_PIN = 0; STEP_MOTOR_B_PIN = 0; STEP_MOTOR_C_PIN = 1; STEP_MOTOR_D_PIN = 1; } //======================================================================== // 簡述: 步進電機引腳控制 // 引數: 無 // 返回: 無 // 詳述: 步進電機D相輸出(ULN2003有反向功能) //======================================================================== static void step_motor_d_output(void) { STEP_MOTOR_A_PIN = 0; STEP_MOTOR_B_PIN = 0; STEP_MOTOR_C_PIN = 0; STEP_MOTOR_D_PIN = 1; } //======================================================================== // 簡述: 步進電機引腳控制 // 引數: 無 // 返回: 無 // 詳述: 步進電機DA相輸出(ULN2003有反向功能) //======================================================================== static void step_motor_da_output(void) { STEP_MOTOR_A_PIN = 1; STEP_MOTOR_B_PIN = 0; STEP_MOTOR_C_PIN = 0; STEP_MOTOR_D_PIN = 1; }

注意事項

步進電機停止後需要使四個相位引腳都為高電平,否則步進電機會發熱。因為不進電機公共端為高電平,所有引腳都為高電平就不會產生電流,就不會發熱。

//========================================================================
// 簡述: 步進電機停止
// 引數: 無
// 返回: 無
// 詳述: (ULN2003有反向功能)
//========================================================================
void step_motor_stop(void)
{
	STEP_MOTOR_A_PIN = 0;
	STEP_MOTOR_B_PIN = 0;
	STEP_MOTOR_C_PIN = 0;
	STEP_MOTOR_D_PIN = 0;
}