n_shinichi’s blog

日々の備忘録、 趣味のあれこれなど紹介 (すみません、メニュー、リンク、カテゴリー分けがうまくできてません、★記事一覧★で見てください...) NHK魔改造の夜ではDンソーのベテランアドバイザーってことで出ました♪

MENU

M5stack ATOM-S3 で3レベルインバータ駆動で ステッピングモータをポート2つだけ使って回す ・・・ その2、アトムくん

せっかくなので回転数を変化させるようにしてみた。

とりあえずのテストは

そんなに速く回さないのでmax1000rpmくらいなんで

割込みも使わずやることまんまのべた書きで。

 

アトムくんの左上方のはただ背面の中性点LEDの様子を撮影するように

 100キンの太陽電池を鏡代わりに置いてるだけ。

LEDが2個代わる代わる光るのだけど

弱く、強く、弱く光ってる。。。 ここがポイント。

 

この時強く光ってる時は電気角45度で2相通電。

LED2相分の電流が流れVfが大きくなって3.3Vから

Vf引いた残りのコイルにかかる電圧が少し小さくなって、

1相あたりの電流が1相単独の時よりちょいと小さくなる。

これが上手い具合に合成ベクトルの電流値は1相単独と

似たような電流値になって電流ベクトルはハーフステップで

45度づつ回るけどほぼ同じベクトル電流になる。。。

でもっていい感じに滑らかに回る助けになってる。

 

void loop() 
{

    if(ph_No  > 7) ph_No  = 0;   // 0 - 7 
    if( millis() > (plus_t_old  + p_delay  ) ){ 
        ph_drive(ph_No);
        plus_t_old  = millis();
        ph_No++;   
    }

    if (millis() >  ms500){
      
        M5.Lcd.setCursor(30, 0);
        M5.Lcd.printf("%4drpm  ",rpm); 

        if(p_delay > 20 )  p_delay = (float)p_delay*0.95;
        else               p_delay = (float)p_delay*0.99;
        
        if(p_delay < 1 ) p_delay = 100;
        rpm = 60000 / (p_delay*40);
        if(rpm > 999) rpm = 999;
        
    ms500+=500;  
    }

}// loop_end

 

void ph_drive(int ph_No){ // step 0 - 7
    //ハーフステップ駆動 φ6ステピングモータの場合40ステップで1回転
    switch(ph_No){
        case 0:
           {pinMode(6,OUTPUT); digitalWrite(6,HIGH); pinMode(8, INPUT);                      break;}
        case 1:
           {pinMode(6,OUTPUT); digitalWrite(6,HIGH); pinMode(8,OUTPUT); digitalWrite(8, LOW);break;}
        case 2:
           {pinMode(6, INPUT);                       pinMode(8,OUTPUT); digitalWrite(8, LOW);break;}
        case 3:
           {pinMode(6,OUTPUT); digitalWrite(6, LOW); pinMode(8,OUTPUT); digitalWrite(8, LOW);break;}
        case 4:
           {pinMode(6,OUTPUT); digitalWrite(6, LOW); pinMode(8, INPUT);                      break;}
        case 5:
           {pinMode(6,OUTPUT); digitalWrite(6, LOW); pinMode(8,OUTPUT); digitalWrite(8,HIGH);break;}
        case 6:
           {pinMode(6, INPUT);                       pinMode(8,OUTPUT); digitalWrite(8,HIGH);break;}
        case 7:
           {pinMode(6,OUTPUT); digitalWrite(6,HIGH); pinMode(8,OUTPUT); digitalWrite(8,HIGH);break;}
        default: break;
    }

}

 

動かした様子がこちら