スポンサーリンク

BeagleBoneBlackのLinuxCNCから誤パルスが検出された原因が判明!!

CNCドライバー自作編

先日、久々にはまったトラブルが解決したので報告します。

前回はまったトラブルはこちら

スポンサーリンク

トラブルの内容

BeagleBoneBlackにインストールしたLinuxCNCから計算通りのパルスが出力されず、数パルス余計に出力される問題が発生。

全く原因が全く分かりません。

他のサイト情報によると、同条件のLinuxCNCを使っているにもかかわらず、誤パルスは全く確認されないとのこと。
この時点で私のパルスカウンターか、測定環境に問題がありそうだと推測できます。
実際に同じ機械を使っているのに私の機械にだけ誤パルスが入るのは何か腑に落ちません。

パルス異常値は、十分程度のNC可動で数十パルスにも及びます。

私の作った高精度加工機では±1/100mmの精度の加工ができるのでこの誤パルスは致命的です。
1/100mmは、わずか8パルス分なので、数十パルスも誤差が生じてしまうと大変な精度悪化となります。

この原因をはっきりさせておかないと、自作カウンターも信頼性がなく、使い物になりません。
_DSC0008

原因はノイズだった

ステッピングモーターの駆動にはStep端子とDir端子の2本の信号で制御します。
Step端子はモーターの回転速度を制御する信号で、Dir端子は回転向きを制御する端子です。

パルス測定の理屈は、Step端子から出力される信号をカウントすればよく、回転方向に関する情報は基本的に必要ありません。
必要ないのでDirパルスの配線はしていませんでした。
マイコン側の設定についても、Dirの信号からの制御を削除し、Step端子からの信号だけを割り込みを作動させ、カウントするプログラムに変更していたのです。
(理論上、他の割り込みと干渉しないのでカウントミスは起こらないはずです。)

結果から言うと、これが異常パルス検出の原因でした。
パルス異常の原因が全く分からなかったので、藁をもつかむ気持ちでとりあえずDirを元に戻してみることにしました。

そして、ダメもとでコードを変更してみると・・・

あれっ?

異常パルスが検出されない・・・・

確認のため、8000パルスを往復するプログラムを100回実行するGコードを回してみたのですが、異常パルスが発生しないのです。

なんと良かれと思って改良したDir端子の入力削除が悪影響していたわけです

ただし、同じGコードを5000行実行すると1パルス余計に観測されてしまいました。しかも、テストを重ねるたびにランダムに発生するのです。

この時点で可能性の一つとして考えていたものの、確証がなかったので口にしませんでしたが確証が持てました。

そう、これはノイズです。

そこで、ノイズを除去するために、信号の立ち上がり信号で割り込みし、一定の時間(マイコン1サイクル分)時間稼ぎしてから、信号が立ち下がったときにカウントするプログラムに変更しました。
これにより、瞬時に入力されるノイズパルスをある程度除去できるはずです

修正したカウンターで上記の5000行のGコードを4セット実行してみましたが、誤パルスの検出はゼロ。

事象との因果関係のまとめ

実はよくわからない・・・・

Dir端子が影響していることは間違いないのですが、そもそもDir端子の入力をマイコンのソフトウェアレベルで切っているので影響はないはず。

しかもDir端子そのものを繋がないときに多くの誤パルスが発生し、Dir端子を繋ぐと誤パルスが少なくなるものの、ゼロにはならない

しかも、他のコントローラも調べてみると、LinuxCNCだけでなく、USBCNCにも”Dir端子を取り外すと”同様の誤パルスが発生するのです。

ということは、もしかしたらDir端子のコードがアンテナになって何かのノイズを拾ってしまったのではないかとおもいますが、根拠がないのではっきりしません・・・。

いずれにせよ、Dir端子を接続して対策を取ったカウンターとモータードライバに関しては、10時間ほど連続でGコードをループさせましたがエラーが発生し無いことを確認しています。

一応、パルスカウンターやLinuxCNCはともに問題なかったようです。

コメント