バイポーラステッピングモータのハーフステップ励磁

モータードライバICにはTA7774Pを2個使った。
(励磁しないときは遮断しないといけないので2個必要)


コード

500μ secの遅延までいけた。(ふつうの2相励磁では2m secが限界なので、限界が4倍になった)
もっと早くしたいので、マイクロステップ励磁を試すことにする。

int EN_A = 10;
int EN_B = 11;
int SA = 12;
int SB = 13;

int status = 1;

int t_delay = 1;
int t_micro = 500;


void setup(){
  pinMode(EN_A,OUTPUT);//STAND BY FOR A
  pinMode(EN_B,OUTPUT);//STAND BY FOR B
  pinMode(SA,OUTPUT);//SIGNAL FOR A
  pinMode(SB,OUTPUT);//SIGNAL FOR B
}

void loop(){
rotate();
/*  
for(int i=0;i<10000;i++){
  rotate();
}  
for(int i=0;i<10000;i++){
  r_rotate();
}  
*/

}

void rotate(){
  
switch(status){
//HALF STEP EXCITATION
  case 1:
    //STEP1
    digitalWrite(EN_A,HIGH);
    digitalWrite(EN_B,LOW);
    digitalWrite(SA,HIGH);
    delayMicroseconds(t_micro);
    status = 2;
    break;
  case 2:
    //STEP2
    digitalWrite(EN_A,HIGH);
    digitalWrite(EN_B,HIGH);
    digitalWrite(SA,HIGH);
    digitalWrite(SB,HIGH);
    status = 3;
    delayMicroseconds(t_micro);
    break;
  case 3:
    //STEP3
    digitalWrite(EN_A,LOW);
    digitalWrite(EN_B,HIGH);
    digitalWrite(SB,HIGH);
    status = 4;
    delayMicroseconds(t_micro);
    break;
  case 4:
    //STEP4
    digitalWrite(EN_A,HIGH);
    digitalWrite(EN_B,HIGH);
    digitalWrite(SA,LOW);
    digitalWrite(SB,HIGH);
    delayMicroseconds(t_micro);
    status = 5;
    break;   
  case 5:
    //STEP5
    digitalWrite(EN_A,HIGH);
    digitalWrite(EN_B,LOW);
    digitalWrite(SA,LOW);
    delayMicroseconds(t_micro);
    status = 6;
    break;
  case 6:
    //STEP6
    digitalWrite(EN_A,HIGH);
    digitalWrite(EN_B,HIGH);
    digitalWrite(SA,LOW);
    digitalWrite(SB,LOW);
    delayMicroseconds(t_micro);
    status = 7;
    break;
  case 7:
    //STEP7
    digitalWrite(EN_A,LOW);
    digitalWrite(EN_B,HIGH);
    digitalWrite(SB,LOW);
    delayMicroseconds(t_micro);
    status = 8;
    break;
  case 8:
    //STEP8
    digitalWrite(EN_A,HIGH);
    digitalWrite(EN_B,HIGH);
    digitalWrite(SA,HIGH);
    digitalWrite(SB,LOW);
    delayMicroseconds(t_micro);
    status = 1;
    break;   
  }
}


void r_rotate(){
switch(status){
//HALF STEP EXCITATION
  case 1:
    //STEP1
    digitalWrite(EN_A,HIGH);
    digitalWrite(EN_B,LOW);
    digitalWrite(SA,HIGH);
    delayMicroseconds(t_micro);
    status = 8;
    break;
  case 2:
    //STEP2
    digitalWrite(EN_A,HIGH);
    digitalWrite(EN_B,HIGH);
    digitalWrite(SA,HIGH);
    digitalWrite(SB,HIGH);
    status = 1;
    delayMicroseconds(t_micro);
    break;
  case 3:
    //STEP3
    digitalWrite(EN_A,LOW);
    digitalWrite(EN_B,HIGH);
    digitalWrite(SB,HIGH);
    status = 2;
    delayMicroseconds(t_micro);
    break;
  case 4:
    //STEP4
    digitalWrite(EN_A,HIGH);
    digitalWrite(EN_B,HIGH);
    digitalWrite(SA,LOW);
    digitalWrite(SB,HIGH);
    delayMicroseconds(t_micro);
    status = 3;
    break;   
  case 5:
    //STEP5
    digitalWrite(EN_A,HIGH);
    digitalWrite(EN_B,LOW);
    digitalWrite(SA,LOW);
    delayMicroseconds(t_micro);
    status = 4;
    break;
  case 6:
    //STEP6
    digitalWrite(EN_A,HIGH);
    digitalWrite(EN_B,HIGH);
    digitalWrite(SA,LOW);
    digitalWrite(SB,LOW);
    delayMicroseconds(t_micro);
    status = 5;
    break;
  case 7:
    //STEP7
    digitalWrite(EN_A,LOW);
    digitalWrite(EN_B,HIGH);
    digitalWrite(SB,LOW);
    delayMicroseconds(t_micro);
    status = 6;
    break;
  case 8:
    //STEP8
    digitalWrite(EN_A,HIGH);
    digitalWrite(EN_B,HIGH);
    digitalWrite(SA,HIGH);
    digitalWrite(SB,LOW);
    delayMicroseconds(t_micro);
    status = 7;
    break;   
  }
}