NI製品ディスカッション

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

エンコーダから角度、角速度を求める方法

解決済み
解決策を見る

ロータリーエンコーダ1つを使用し、角度および、角速度を求めるプログラムを作成したいと思っています。

また、エンコーダのA相、B相の情報から回転方向も合わせて求めたいと思っていますが、参考になるサンプル等ありませんでしょうか?

0 件の賞賛
メッセージ1/5
12,249件の閲覧回数

LabVIEWのサンプルというより、まず一般論としてエンコーダのA相・B相をどう使うかを、検索された方が良いと思います。

回転方向ですが、(これも、なぜA相とB相があるのか、を検索されるとすぐ分かると思いますが)「A相が立ち上がった時に、B相がHiかLoか」ということですよね。

こういう場面が1周に4つあるので、

「A相が立ち上がった時に、B相がHiかLoか」

「A相が立ち下がった時に、B相がHiかLoか」

「B相が立ち上がった時に、A相がHiかLoか」

「B相が立ち下がった時に、A相がHiかLoか」

で回転方向を判別します。

A相が立ち上がった時にB相がまだLoである時の回転方向をCW=正転とすれば(多くのものはCWのときB相がA相より遅れるとするので)、

「A相が立ち上がった時に、B相がLoならCW、HiならCCW」

「A相が立ち下がった時に、B相がHiならCW、LoならCCW」

「B相が立ち上がった時に、A相がHiならCW、LoならCCW」

「B相が立ち下がった時に、A相がLoならCW、HiならCCW」

と判定します。

「立ち上がったかどうか」とは、1ループごとに1データ取得する場合は「1ループ前がLoで今ループがHi」と考えます(シフトレジスタorフィードバックノードを使う)。一定時間ごとにデータを配列でまとめて取得している場合は、元の配列と、元の配列をNOTして先頭に1つFalseを付加した配列とを、配列のままANDすると「立ち上がり部分がTrue」の配列になります(1つ前がLoで今がHiのところがTrueになる)。

 

この方法でCWなら+1カウント、CCWなら-1カウントすれば、A相・B相の立ち上がり・立ち下がりの4場面すべてでカウントできるので、1周期に4回の四逓倍のカウントになります。1周1000パルスのエンコーダなら、4000カウントで1周になります。

 

どこか適当な場所をゼロとして(Z相があるなら、CWでZ相の立ち上がり時、CCWでZ相の立ち下がり時をゼロとして)、「上記のカウント数÷4÷1周のパルス数×360」で角度が「°」で求められ、それを1秒ごとの変化で捉えれば角速度となります。

0 件の賞賛
メッセージ2/5
12,226件の閲覧回数

M.Shiraishi 様

返信ありがとうございます。

エンコーダについてのご説明ありがとうございます。

エンコーダについて改めて勉強になりました。

 

私の質問の仕方も悪かったのですが、サンプルの「カウンタ - エンコーダを読み取る」(NIサンプルファインダ → ハードウェア入力と出力 → カウンタ入力 )を見ると、A,B,Zの各相を入力しており、角度を求めています。

同様の方法で角速度も求めることはできると思いますが、エンコーダについての一般論を把握した上で、上記サンプルではA,B,Zの各相を入力しているのでこのサンプルを拡張して回転方向を求めることができないか?また、そのようなサンプルがないかと思った次第です。

 

0 件の賞賛
メッセージ3/5
12,203件の閲覧回数

そういうことであれば、既に「サンプルにより、A・B・Zから角度を求めることはできている」とすれば、それを一定時間(1秒なり0.1秒なり)のループごとに角度を取得して、その前回との差分を1秒なり0.1秒なりで割れば角速度が(時間分解能を上げると角度分解能が下がるので、どれだけ必要かは用途によります)、また、その時の角度の増減が、回転方向であると思います。この追加部分は、ループとシフトレジスタ、及び四則演算と正負判定のみと思いますが如何でしょうか。

メッセージ4/5
12,192件の閲覧回数
解決策
トピック作成者s-kazuが受理

使用するデバイスにクワドラチャエンコーダ(90度位相差出力A相B相のあるエンコーダ)をつなげられるカウンタがある場合。(例えばNIの製品ページで絞込検索、計測タイプに「位相差出力エンコーダ」があるもの)

 

〇角度計測について
関数→計測IO→DAQmx→DAQアシスタント→ブロックダイアグラムにアイコンを配置
対話式のDAQアシスタントが開きますので
信号を収集→カウンタ入力→位置→線形位置、もしくは角度位置→とりあえずctr0(カウンタ0)を選択
構成タブでエンコーダの単位を「ティック」
入力端子A,BにエンコーダAB相を接続した端子を設定
でコードタイプを「x4」
収録モードを「1サンプル(オンデマンド)」

OKで決定するとエンコーダ値を読み取るviができると思います。今回の例は1実行で1値(1サンプル、オンデマンド)

〇速度計測について
速度は位置変化を時間で割ればいいので、ループに入れて、位置変化量をループ時間で割ります。
ただし時間がループ速度になりますので、さらに正確な測定をするならば、もう一つのカウンタ、例えばctr1を使ってDAQアシスタントから角速度を選んでみてください。

なお、電気的な接続は間違えないようにご注意くださいね。

0 件の賞賛
メッセージ5/5
12,151件の閲覧回数