//////////////////////////////////////////////////
/* 3Fase Motor Driver */
// Fujisekk LTD
// MGG03420@nifty.ne.jp
// http://www.d1.dion.ne.jp/~fujisekk
// http://homepage3.nifty.com/fujisekk/
//
/* 2013/6 Witten By FujiOomagari */
/* StateMot=0~7  0 stop 1 start 2~7 fase */
/* 2013/8 UPPER LOWRE Sepalate Drive ハード変更*/
//////////////////////////////////////////////////
#include "PE_Types.h"
#include "IO_Map.h"
#include "3Fase120degdriver.h"
 
/* GLOVAL */
char StateMot;
unsigned int Timer_int ,Max;
/* PWM not witten */
char motor_driver_init(unsigned char max_speed){
    threefase120deggen();
    Timer_int=      START_SPEED;
    Max= max_speed;
    StateMot=0;
    //ptcinit
}
/* stop */
char motor_driver_end(void){
StateMot=0;
}
/* Speed Control */
char motor_speed(char speed){
  if(speed>=Max){
    Timer_int=speed;
  }else{
     Timer_int=Max;
  }
  return(speed);
}
 
/* 3Fase 120Deg Drive Table */
/*11Z00Z 出力*/
/*111000 極性 180Deg*/
/*001001 3ST*/

#define DriveA  0x0038
#define Newtral 0x0009
/*11Z00Z 出力*/

/* Ap 11ZZZZ 出力*/
#define DriveAp  0x003C
/* An ZZZ11z */
#define DriveAn  0x0018

/* 60度ごとのパターンを作る Pattern[a]を一度にポート出すことでタイミングの狂いをなくす */
unsigned char Pattern[6];

void threefase120deggen(void){
    unsigned int wk;
    int a,b;
    for (a=0;a<6;a++){

        wk=DriveAp;
            wk =wk<<6;
        wk=wk | DriveAp;
        wk=wk>>a;
//        printf("wk %1d =%X \n",a,wk     );
        Pattern[a]=0;
        for(b=0;b<3;b++){/*Upper 3Fase */
            Pattern[a]=Pattern[a] | wk&0x01;
            wk=wk>>2;//次の相は120度ずれている
            Pattern[a]=Pattern[a]<<1;
//        printf("wk %1d =%X \n",b,Pattern[a] );

        }
        wk=DriveAn;
                wk =wk<<6;
            wk=wk | DriveAn;
            wk=wk>>a;
//        printf("wkN %1d =%X \n",a,wk);
        for(b=0;b<3;b++){/*Lower 3Fase */

            Pattern[a]=Pattern[a] | wk&0x01;
            wk=wk>>2;
            Pattern[a]=Pattern[a]<<1;
        }
        Pattern[a]=Pattern[a]<<1; // Bit7~2
    }
}


/* StateMot 0で終了 */
char motor_driver( void){
    char a,fase;
    StateMot=1;
    PTAD=0x0;
    tslp_tsk(Timer_int);
    while(StateMot){
            PTBD=Pattern[StateMot-2];
           __RESET_WATCHDOG(); /* feeds the dog */

            tslp_tsk(Timer_int);
            StateMot=StateMot+1;
            if( StateMot>7){
              StateMot=2;

            }
             
    }
}

"3Fase120degdriver.h"
char motor_driver_init(unsigned char max_speed);
char motor_driver(void);
void threefase120deggen(void);
char motor_driver_end(void);
//#define START_SPEED   7
#define START_SPEED   60