2016-09-10 10 views
-1

機能FirstMotorRotateToLeft()第1モータを作動させ、機能SecondMotorRotateToLeft()エナゲージ第2モータ。主な質問は、同時に2つのモーターを動かす方法です。STM32は非同期機能を実行します

#include "stm32f10x.h" 
#include "stm32f10x_gpio.h" 
#include "stm32f10x_rcc.h" 

void Delay(unsigned int t) 
{ 
    unsigned int i; 
    for (i=0;i<t;i++); 
} 

void GPIOD_Initialize(){ 
    GPIO_InitTypeDef GPIOC_Stepper; 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE); 
    GPIOC_Stepper.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_7; 
    GPIOC_Stepper.GPIO_Mode=GPIO_Mode_Out_PP; 
    GPIOC_Stepper.GPIO_Speed= GPIO_Speed_50MHz; 
    GPIO_Init(GPIOC,&GPIOC_Stepper); 

    GPIO_InitTypeDef GPIOD_Stepper; 
    GPIOD_Stepper.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_7; 
    GPIOD_Stepper.GPIO_Mode=GPIO_Mode_Out_PP; 
    GPIOD_Stepper.GPIO_Speed= GPIO_Speed_50MHz; 
    GPIO_Init(GPIOD,&GPIOD_Stepper); 
} 
void SecondMotorRotateToLeft() 
{ 
GPIO_Write(GPIOD,GPIO_Pin_5); 
     Delay(time); 

     GPIO_Write(GPIOD,GPIO_Pin_5| GPIO_Pin_3); 
     Delay(time); 

     GPIO_Write(GPIOD,GPIO_Pin_3); 
     Delay(time); 

     GPIO_Write(GPIOD,GPIO_Pin_3|GPIO_Pin_7); 
     Delay(time); 

     GPIO_Write(GPIOD,GPIO_Pin_7); 
     Delay(time); 

     GPIO_Write(GPIOD,GPIO_Pin_7|GPIO_Pin_1); 
     Delay(time); 

     GPIO_Write(GPIOD,GPIO_Pin_1); 
     Delay(time); 

     GPIO_Write(GPIOD,GPIO_Pin_1|GPIO_Pin_5); 
     Delay(time); 
} 
void FirstMotorRotateToLeft() 
{ 
GPIO_Write(GPIOC,GPIO_Pin_5); 
     Delay(time); 

     GPIO_Write(GPIOC,GPIO_Pin_5| GPIO_Pin_3); 
     Delay(time); 

     GPIO_Write(GPIOC,GPIO_Pin_3); 
     Delay(time); 

     GPIO_Write(GPIOC,GPIO_Pin_3|GPIO_Pin_7); 
     Delay(time); 

     GPIO_Write(GPIOC,GPIO_Pin_7); 
     Delay(time); 

     GPIO_Write(GPIOC,GPIO_Pin_7|GPIO_Pin_1); 
     Delay(time); 

     GPIO_Write(GPIOC,GPIO_Pin_1); 
     Delay(time); 

     GPIO_Write(GPIOC,GPIO_Pin_1|GPIO_Pin_5); 
     Delay(time); 
} 

int main(void) 
{ 
    const int time = 10000; 
    GPIOD_Initialize(); 
    while(1) 
    { 
     FirstMotorRotateToLeft(); 
     SecondMotorRotateToLeft(); 
    } 
} 
+0

どのようにAVRマイクロコントローラに関連していますか?タグをスパムしないでください! – Olaf

+0

注:Cには記号定数(* enum-constantを除く)はありません。 'time'は変数です。あなたのマクロを使用するには、Cで定数が必要です(そして、あなたのコンパイラはそれを使用していないと不平を言うでしょう)。 – Olaf

答えて

1

この超同期モノリシックデザインでは、同時に実行するのが難しくなります。

私は両方の運動機能を小さなステップに再設計することをお勧めします。それぞれのステップはステートマシンとして表現できます。次に、両方のステートマシンをすぐに互いに実行してください。

行うにはどのようにそれはコードのかなり多くなる傾向があり、おそらくこのような何かがインスピレーションとしての役割を果たす可能性があるので、これは、すぐに表示少し難しいです:

typedef enum { MOTOR_OFF, MOTOR_... } MotorState; 

static MotorState runFirstMotor(MotorState state, uint32_t clock) 
{ 
} 

static MotorState runSecondMotor(MotorState state, uint32_t clock) 
{ 
} 

アイデアは、その2です機能は、2つのモータ用のステートマシンを実装します。各関数は、現在の状態と現在のシステム時刻を受け入れ、新しい状態を返します(ステートマシンが状態遷移を生成した場合とは異なる可能性があります)。

clockは、適切な単位(おそらくミリ秒)で現在の時刻とします。これはシステムタイマーの1つ(おそらくSysTickでも、STM32を使用しているので)から取得できます。ステートマシンはこれを使用して遅延を実装します(図示しないmore ...状態とともに)。

ピンポン​​キングは、2つのモーターが異なるGPIOポートで動作することを除いて同じように見えるので、おそらくそれを考慮に入れることができます。

+0

コード例を投稿できますか? – A191919

関連する問題