2017-12-19 22 views
0

28BYJ-48ステッパーモーターを1回転の1/4回転させて停止させようとしていますが、コードでそれを実装するのに問題があります。私が見つけたのは、コード内の数字をどれだけ小さくしても、それが正しく動作すると思うように変更しても、回転を止めることはできません。以下はコードの役に立つ部分です。ステッパーモーターの回転が停止しない

#define STEPPER (*((volatile uint32_t *)0x4000703C)) 

// Move 1.8 degrees clockwise, delay is the time to wait after each step 
void Stepper_CW(uint32_t delay) { 
    Pt = Pt->Next[clockwise];  // circular 
    STEPPER = Pt->Out; // step motor 

    if(Pos==199) {  // shaft angle 
    Pos = 0;   // reset 
    } 
    else { 
    Pos--; // CW 
    } 
SysTick_Wait(delay); 
} 

// Move 1.8 degrees counterclockwise, delay is wait after each step 
void Stepper_CCW(uint32_t delay) { 
    Pt = Pt->Next[counterclockwise]; // circular 
    STEPPER = Pt->Out; // step motor 
    if(Pos==0) {  // shaft angle 
    Pos = 199;   // reset 
    } 
    else { 
    Pos++; // CCW 
    } 
SysTick_Wait(delay); // blind-cycle wait 
} 

// Initialize Stepper interface 
void Stepper_Init(void) { 
    SYSCTL_RCGCGPIO_R |= 0x08; // 1) activate port D 
    SysTick_Init(); 
    Pos = 0;     
    Pt = &fsm[0]; 
           // 2) no need to unlock PD3-0 
    GPIO_PORTD_AMSEL_R &= ~0x0F;  // 3) disable analog functionality on PD3-0 
    GPIO_PORTD_PCTL_R &= ~0x0000FFFF; // 4) GPIO configure PD3-0 as GPIO 
    GPIO_PORTD_DIR_R |= 0x0F;    // 5) make PD3-0 out 
    GPIO_PORTD_AFSEL_R &= ~0x0F;   // 6) disable alt funct on PD3-0 
    GPIO_PORTD_DR8R_R |= 0x0F;   // enable 8 mA drive 
    GPIO_PORTD_DEN_R |= 0x0F;   // 7) enable digital I/O on PD3-0 
} 

// Turn stepper motor to desired position 
// (0 <= desired <= 199) 
// time is the number of bus cycles to wait after each step 
void Stepper_Seek(uint8_t desired, uint32_t time) { 
short CWsteps; 
    if((CWsteps = (desired-Pos))<0) { 
    CWsteps+=200; 
    } 

// CW steps is > 100 
if(CWsteps > 100) { 
    while(desired != Pos) { 
    Stepper_CCW(time); 
    } 
} 
else { 
    while(desired != Pos) { 
    Stepper_CW(time); 
    } 
} 
} 

Stepper_Seekが

#include <stdint.h> 
#include "stepper.h" 
#define T1ms 16000 // assumes using 16 MHz PIOSC (default setting for clock source) 
int main(void) { 
    Stepper_Init(); 
    Stepper_CW(T1ms); // Pos=1; GPIO_PORTD_DATA_R=9 
    Stepper_CW(T1ms); // Pos=2; GPIO_PORTD_DATA_R=5 
    Stepper_CW(T1ms); // Pos=3; GPIO_PORTD_DATA_R=6 
    Stepper_CW(T1ms); // Pos=4; GPIO_PORTD_DATA_R=10 
    Stepper_CW(T1ms); // Pos=5; GPIO_PORTD_DATA_R=9 
    Stepper_CW(T1ms); // Pos=6; GPIO_PORTD_DATA_R=5 
    Stepper_CW(T1ms); // Pos=7; GPIO_PORTD_DATA_R=6 
    Stepper_CW(T1ms); // Pos=8; GPIO_PORTD_DATA_R=10 
    Stepper_CW(T1ms); // Pos=9; GPIO_PORTD_DATA_R=9 
    Stepper_CCW(T1ms); // Pos=8; GPIO_PORTD_DATA_R=10 
    Stepper_CCW(T1ms); // Pos=7; GPIO_PORTD_DATA_R=6 
    Stepper_CCW(T1ms); // Pos=6; GPIO_PORTD_DATA_R=5 
    Stepper_CCW(T1ms); // Pos=5; GPIO_PORTD_DATA_R=9 
    Stepper_CCW(T1ms); // Pos=4; GPIO_PORTD_DATA_R=10 
    Stepper_Seek(8,T1ms);// Pos=8; GPIO_PORTD_DATA_R=10 
    Stepper_Seek(0,T1ms);// Pos=0; GPIO_PORTD_DATA_R=10 
    while(1) { 
    Stepper_CW(10*T1ms); // output every 10ms 
    } 
} 

...ここに呼び出され、私はそれはそれはリセット後、その位置をリセットして、再起動ままそれでも行をコメントアウトした後に、それはないだろうということだったかもしれないと思いました修正する。

ありがとうございます!

+0

これらのステッパー機能をどのように使用しているかを示すコード(「Stepper_Seek」が呼び出される場所など)を投稿できますか? – DigitalNinja

+0

'Pos'を更新し、' desired'と比較する出力/デバッグ文を追加します。 'CW steps is 0 to 199'というコメントがあり、次の行は 'CWsteps'を100に比較します。ちょうど赤いフラグ...... – KevinDTimm

+0

ロールオーバロジックは後方にあります。 Pos - 0に到達するためのチェックに一致する必要があり、Pos ++は199に到達するためにチェックする必要があります。 –

答えて

1

あなたのラップアラウンドロジックは、Stepper_CW()Stepper_CCW()の両方で後方にあります。例として前者を取る。あなたが198に到達しようとしていると仮定し、Posは、最初は1:

  1. 最初の呼び出しでは、Posが0これまでデクリメントさ198に等しくないので、関数が再び呼び出されます。
  2. 2番目の呼び出しでは、Posが199にデクリメントされます。これは198と等しくないため、関数が再度呼び出されます。ステップ後の状態が(3)と同じである....

第コールで

  • は、ラップアラウンドケースがトリガされ、そして Posこれは198に等しくない0に設定されます。ステップ(1)の後の状態 - 無限ループ。

    関連する問題