せっかくなので回転数を変化させるようにしてみた。
とりあえずのテストは
そんなに速く回さないので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;
}
}
動かした様子がこちら
学校では教えてくれないモータの動かし方...その2
— しん (@shinichi_nin) 2023年3月18日
速度を変化させて回してみた。
モータドライバを使わず3レベルインバータ方式にて
ポート2つだけ使って回す。
鏡(太陽電池)は背面の中性点LEDの様子確認用#M5stack #ATOMS3 #STEPPER_MOTOR#3Level_Inverter #Arduino #ステッピングモータ pic.twitter.com/6YawRdsDai