2013年6月30日 星期日

28BYJ-48 5V四相步進馬達簡單入門


這個文章其實已經有數不清的人分享過了, 所以自己只是做個記錄, 有需要的人也可以參考看看
28BYJ-48是一個5V四相(四條線)的步進馬達, 它的外觀如下


主要參數如下, 比較重要的是它的步距角(5.625/64的意思是360度需要內部電機轉64圈, 所以每轉一圈為360/64=5.625度), 再來是減速比1/64(意思是外部齒輪外一圈, 內部要轉64圈), 其它的參數我也不太能確定

下面的馬達的線路圖, 紅色為電源線, 有人說可以不用接, 好像接不接都沒影嚮

下面是我買的步進馬達模組, 它搭配ULN2003這個驅動板, 可以讓你直接接usb就能驅動步進馬達, 還蠻方便的

下面是ULN2003驅動板的外觀, 很多拍賣都買得到

 下面則是這個步進馬達建議旳驅動方式, 一般分一相激磁, 二相激磁, 一二相激磁, 這顆是用一二相激磁

這要決定好, 因為驅動table表要根據這個來設定

 根據上圖, 我們可以建一個順時針轉的驅動table表如下(把上圖有做"-"記號的地方設為1, 就可以得到)

Forward_Rotation[8]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09};

再來是建一個MotorOneStep的函數, 意思是每呼叫一次, 就轉一個step(也就是5.625度), sample code如下

void MotorOneStep(char direction)               //代表電機內部轉一圈, 因減速比為64, 所以步進角度=360/64=5.625度
{                                                                                          //所以呼叫64次, 就等於外部齒輪轉一圈
    char i,j;
    if(direction==1)                                                    //Direction=1, 代表順時針轉
    {
        for(j=0;j<8;j++)                                                        //8個45度, 等於內部轉一圈, 也等於外部一個步進角度
        {
            for(i=0;i<8;i++)                                                    //內部電機轉45度
                {
                Motor=Forward_Rotation[i];                        //順時針轉或逆時針轉表格, Motor=PORTD
                delay_ms(10);                                    // 延遲可以調整電機速度, 範圍為0~255
                }
        }
    }
    else
    {
        for(j=0;j<8;j++)                                                        //8個45度, 等於內部轉一圈, 也等於外部一個步進角度
        {
            for(i=0;i<8;i++)                                                    //內部電機轉45度
                {
                Motor=Backward_Rotation[i];                        //順時針轉或逆時針轉表格, Motor=PORTD
                delay_ms(10);                                    // 延遲可以調整電機速度, 範圍為0~255
                }
        }
    } 
}

這樣就建立好一個Step的函數, 範例如下, 在main裡呼叫

for(MotorStep=0;MotorStep<64;MotorStep++)
    {
        MotorOneStep(1);         //代表順時針轉一圈
    }

for(MotorStep=0;MotorStep<64;MotorStep++)
    {
        MotorOneStep(0);         //代表逆時針轉一圈
    }

for(MotorStep=0;MotorStep<8;MotorStep++)
    {
        MotorOneStep(1);         //代表順時針轉45度, 5.625*8=45度
    }

就醬子囉~~~

沒有留言:

張貼留言

歡迎大家來討論交流一下~~~