Fコード実行誤差について 2005.12.19(月) F50を実現するために必要なステッピングモータの1ステップパルスの幅は、 50[mm/min] ÷ 60[sec/min] = 0.83[mm/sec]・・・毎秒送り速度 0.83[mm/sec] ÷ 1[mm/回転] =0.83[回転/sec]・・・毎秒回転数 0.83[回転/sec] × 96[パルス/回転] = 80[パルス/sec]・・・毎秒パルス数 1 ÷ 80[パルス/sec] = 0.0125[sec/パルス] = 12.5[msec/パルス]・・・1パルス期間 です。 EZ-USBマイコンにパルス出力用のデータを送信するために要する時間は約2msec。 12.5[msec] - 2[msec] = 10.5[msec]・・・次のパルス出力までの待ち時間。 この待ち時間を今回は、2重のforループで実施しました。 //------------------------------------------ // 1m秒倍遅延 //------------------------------------------ public void delay_msec(int t) { int t1, t2; t *= 1000; for (t1 = 0; t1 < t; t1++) { for (t2 = 0; t2 < 1840; t2++) ; } } 誤差の原因として 1) 引数tが整数型のため少数点以下が切り捨てられ、パルス幅が短くなりモーターが速 めに回転した。 2) 内側のfor文を1μsecで終了させる条件1840が適切ではなかった。 この値は、パルス幅をオシロスコープで観測しながら、パルス幅の±10%程度ある 揺らぎの中央付近で決定しました。 などが考えられます。 2重のforループによる遅延は、マルチタスクOSでは他のアプリケーションの影響を受け やすく遅延時間が不正確ですが、今回は暫定で採用しました。 2重のforループを採用した理由 当初は下記の関数を使用しました。 /// 1m秒倍ウェイト public void WaitmSec(int wait) { System.DateTime time = System.DateTime.Now; wait *= 10000; while (System.DateTime.Now < time.AddTicks(wait)) { これは、PC内臓のタイマーカウンターの値で遅延時間を実現するものです。 実際に実行したところ、5msecの遅延設定で13msecの遅延時間になってしまい、実用 的ではありませんでした。 このほかにSystem.Environment.TickCountプロパティを用いてみましたが、結果は同じ でした。 両方とも使う前に何らかの設定をするのか、勉強不足で不明です。 恒久対策案 パルス幅制御をEZ-USBマイコン側で行うことで、クリスタル発振子に依存した精度の良 いパルス幅が得られます。 対策時期 CNCアプリケーションとEZ-USBマイコンの両方でプログラムの変更が必要で、相互間の 通信仕様、データ処理、パルス幅制御方法などの検討が必要です。 処理が複雑になり、変更の作業量が多いため、切削テスト以降に対策方法の検討をした いと思います。