發問時間: 電腦與網際網路程式設計 · 1 0 年前

用keil c 寫步進馬達進八步退四步的前進功能

控制步進馬達進四步退兩步的前進的STEP2.C程式碼範例 , 2005/02/25,LJY。

//控制步進馬達的STEP2.C程式碼範例 , 2005/02/25,LJY

#include<regadd.h>

#define DISPLAYTIME100 // 將近 100 milliseconds

void delay (int time);

main()

{

char a[8]={0x01,0x02,0x04,0x08,0x04,0x08,0x01,0x02};

char b[4]={0x04,0x02,0x01,0x08};

int p,j;

PORTACFG = 0x00;// 規劃PA為輸出

OEA = 0xFF;

while(1)

{

for(p=0;p<=3;p++)

{

OUTA=a[p];

delay(DISPLAYTIME);

}

for(j=0;j<=1;j++)

{

OUTA=b[j];

delay(DISPLAYTIME);

}

for(p=4;p<=7;p++)

{

OUTA=a[p];

delay(DISPLAYTIME);

}

for(j=2;j<=3;j++)

{

OUTA=b[j];

delay(DISPLAYTIME);

}

}

} int i,k;

void delay (int time)

{

for (k=0; k<time; k++)// 多少 milliseconds

for (i=0; i<400; i++);

}

以上這個是步進馬達進四步退二步的程式範例

不過我現在要改成進八步退四步 卻不知道要改哪邊才比較正確

麻煩各位大大幫幫忙一下!

已更新項目:

Tommy

所以1,2,4,8,1 這邊為前進一個循環 跟8,4,2,1,8 是後退一個循環是嗎@@?

還有while(1)

裡面的程式for(p=0;p<=3;p++); for(j=0;j<=3;j++); for(p=0;p<=7;p++);for(j=0;j<=3;j++)

的迴圈值是要如何去訂?? 麻煩一下嚕ˊˋ

還有請問一下 我之前學過VB 用裡面的格式用來寫KEIL C 行得通嗎??

1 個解答

評分
  • Tommy
    Lv 5
    1 0 年前
    最佳解答

    重點 : 控制步進馬達 PA 輸出 1,2,4,8,1 ... 為前進 , 而 8,4,2,1,8 ... 為後退

    所以你要修改 TABLE 內容, 及輸出次數即可

    我在修改部分都加註解, 你可参考.

    #include

    #define DISPLAYTIME100 // 將近 100 milliseconds

    void delay (int time);

    main()

    {

    char a[8]={0x01,0x02,0x04,0x08,0x01,0x02,0x04,0x08}; // 1,2,4,8,1 ... 為前進

    char b[4]={0x04,0x02,0x01,0x08}; // 8,4,2,1,8 ... 為後退

    int p,j;

    PORTACFG = 0x00;// 規劃PA為輸出

    OEA = 0xFF;

    while(1)

    {

    for(p=0;p<=7;p++)

    {

    OUTA=a[p]; // 1,2,4,8,1 ... 為前進

    delay(DISPLAYTIME);

    } // last output = 0x08

    for(j=0;j<=3;j++)

    {

    OUTA=b[j]; // 8,4,2,1,8 ... 為後退

    delay(DISPLAYTIME);

    } // last output = 0x08

    for(p=0;p<=7;p++)

    {

    OUTA=a[p]; // 1,2,4,8,1 ... 為前進

    delay(DISPLAYTIME);

    } // last output = 0x08

    for(j=0;j<=3;j++)

    {

    OUTA=b[j]; // 8,4,2,1,8 ... 為後退

    delay(DISPLAYTIME);

    } // last output = 0x08

    }

    }

    int i,k;

    void delay (int time)

    {

    for (k=0; k for (i=0; i<400; i++);

    }

    2010-04-20 09:51:36 補充:

    所以1,2,4,8,1 這邊為前進一個循環 跟8,4,2,1,8 是後退一個循環是嗎@@?

    Ans : 步進馬達控制是用相位控制 , 要和前一個內容做比較, 所以會有以下結果 :

    原來輸出 1 後面再輸出 2 就會轉前進

    原來輸出 2 後面再輸出 4 就會轉前進

    原來輸出 4 後面再輸出 8 就會轉前進

    原來輸出 8 後面再輸出 1 就會轉前進

    原來輸出 1 後面再輸出 8 就會轉後退

    原來輸出 2 後面再輸出 1 就會轉後退

    原來輸出 4 後面再輸出 2 就會轉後退

    原來輸出 8 後面再輸出 4 就會轉後退

    a[8] 及 b[8] 就是這樣建立的

    2010-04-20 10:00:49 補充:

    裡面的程式的迴圈值是要如何去訂??

    Ans : 因為你是要8步迴圈值, for (p=0 , p <=7, p++) 剛好可把 a[8] 送出 , 最後內容剛好=8

    4步迴圈值, for (j=0, j<=3, j++) 剛好可把 b[4] 送出 ,最後內容剛好=8

    還有請問一下 我之前學過VB 用裡面的格式用來寫KEIL C 行得通嗎??

    Ans : 不行喔 !

還有問題?馬上發問,尋求解答。