DC モーターを制御するために、ロータリー エンコーダーの位置を監視する必要があります。ロータリー エンコーダーの変更を見逃さないようにするために、BackgroundWorker を使用しました。
私のアプリケーションは期待どおりに動作しなかったので、デバッグを行って、なぜ目標を達成できないことが多いのかを調べています。
Console.WriteLine を使用してストップウォッチの状態を書き出していますが、スレッドが「スキップ」しているか、ループが欠落していることに気付きました。これは、コンソールへの書き出しの癖でしょうか?
出力の一部を次に示します。190 ミリ秒のギャップがあることがわかります。
Inside Thread. Time: 25, Position: 117, Velocity: 0
Inside Thread. Time: 26, Position: 117, Velocity: 0
Inside Thread. Time: 27, Position: 117, Velocity: 0
Inside Thread. Time: 28, Position: 117, Velocity: 0
Inside Thread. Time: 29, Position: 117, Velocity: 0
Inside Thread. Time: 30, Position: 117, Velocity: 0
Inside Thread. Time: 212, Position: 117, Velocity: 0
Inside Thread. Time: 213, Position: 117, Velocity: 0
Inside Thread. Time: 214, Position: 117, Velocity: 0
Inside Thread. Time: 215, Position: 117, Velocity: 0
Inside Thread. Time: 216, Position: 117, Velocity: 0
Inside Thread. Time: 217, Position: 117, Velocity: 0
バックグラウンドワーカー内で実行しているコードは次のとおりです(現在、デバッグ中にコンソールに書き込んでいることに注意してください。作業中はDCモーターを制御します):
public void dcMotorMove(DCMotorSettings dcMotorSettings)
{
try
{
dcMotorSettings.Moving = true;
Stopwatch dcMotorStopwatch = Stopwatch.StartNew();
dcMotorStopwatch.Restart();
int MoveState = 1;
while (MoveState != 0)
{
Console.WriteLine("Inside Thread. Time: " + dcMotorStopwatch.ElapsedMilliseconds + ", Position: " + dcMotorControl.encoders[0].Position + ", Velocity: " + dcMotorControl.motors[0].Velocity);
Thread.Sleep(dcMotorSettings.SampleRate); // Processor Rest
if (dcMotorStopwatch.ElapsedMilliseconds > dcMotorSettings.Duration) MoveState = 0;
}
dcMotorSettings.Moving = false;
}
catch
{
Console.WriteLine("Problem within dcMotorMove");
}
}