※前記事
今回の試作(とある装置の性能評価用ジグ)、目的はグルグル回る0~360度の角度計測です。
(0.3度分解能で)
小さなロータリーエンコーダを選んだのは、小さな起動トルクと小さなイナーシャが測定系にとって魅力だったから。
形状の大きなエンコーダだと、もっといろんなパルス数のが手に入りますが、この大きさで300パルスという分解能は十分にありがたい性能です。
48ピンですが、小さくても32ビット・マイコン。
二つのタイマーカウンタ・モジュールで位相計数モード(2相パルスをカウント)が利用できます。
ハード的には、こんな感じでこのエンコーダと接続しています。
※今回使ったのは一つだけ。 もう一系統のカウント入力は
空いています。
イニシャルだけしておけば、ソフトであれこれしなくてもカウント値を読み出すだけで「現在位置」が分かるという仕掛けです。
ほんとにお手軽。
ただし、カウンタは16ビットなんで、カウント範囲は「0~65535」。
ソフト的に何らかの処理を入れないと、「何回転もグルグル回る用途」では使えません。
今回のエンコーダは1200パルスなんで、手を入れない場合の回転回数は「54回転」までになります。
55回転目になると「65535」を超えて一周回ってしまいます。
それを描いてみました。
オーバーフローするかも? そんな数値の処理 では、符号付きの16ビット値を考えていましたが、今回は符号なしの数値です。
右回りでカウントアップしている時は、カウント値を1200パルス割った余り、つまり「0~1199」の値に「3」を乗じれば「0.1度」単位の回転角が得られます。
しかし、正しいのは54回転目まで。
55回転目になると、その途中で「65535→0」のオーバーフローが発生して、それより右に回ると正しい角度が得られません。
そして、左回りだと、いきなり「0→65535」となります。
ほんとは「0度→359.7度」なのに、剰余は「735」となり、角度に直すと「220.5度」になってしまい間違った値が出てきます。
通常のグルグル回らないup/downカウンタ(上限値、下限値がある)だと、16ビットの高速カウンタをベースに、定期的にオーバーフローを監視することでソフト的に上位桁を作リ出し、カウント桁数を増やします。
1mS程度の周期で監視できるのなら、ベースにしたカウンタの応答速度を低下させることなく桁数を増やせるでしょう。
ところが、今回はグルグル回る処理をしなければなりません。
上位の桁数を増やしても、いつかは頭打ちになってしまいます。
そこで、考えを変えます。
数値として欲しいのは回転角度です。
つまり、、エンコーダの1回転カウント値である「0~1199」です。
軸が何回転したのかの情報は不要です。
(カウント値1200以上の値は不要)
マイコンの内蔵カウンタが「カウント範囲を0~1199にする」なん
ていう機能を持っていれば良いのですが・・・
※コンペアマッチでゼロクリアーという機能は
あるが、up/downカウンタでは使えない。
(1) まずは、オーバーフローとアンダーフローのチェックです。
前回にカウンタを読み出した時の値を覚えておき、前回値と今回値の
差の絶対値が16ビット値の半分、「32767」より大きかったらオーバー
フローが発生したと判断します。
※32767以下なら、65536←→0 の点を通過していない。
(2) 差の正負により、右回転のオーバーフローか左回転のオーバーフロー
(アンダーフロー)かを判断します。
(3) 右回転のOVFなら、「一周分65536を1200で割った余り=736」を、
今回カウンタの値から算出したカウント値(0~1199)に加えます。
(それをさらに1200の剰余を計算し0~1199を算出)
「736」はオフセット値として記録しておき、オーバーフロー発生ごとに
736をオフセット値に加算します。
(加算後のオフセット値も剰余計算で0~1199にしておく)
これで右回転の時の補正が完了します。
※1回転目のオーバーフロー「65535→0」は「735→0」ではなく
「735→736」となる
(4) 同じように左回転のOVFでは、「-736」をオフセットにすれば良いのですが、
せっかくですんで、マイナスの値は使わずに1200に対する補数である
「464」をオフセット値に加算することにします。
この、加算処理後も剰余計算で0~1199にしておきます。
(5) カウント値、オフセット値とも1200の剰余計算で0~1199にすることで、
桁あふれなくグルグル回る軸の回転角度を「符号無し16bit値」で計算する
ことが可能になります。
こんな考えでプログラムを組んで、グルグル回る角度の値を算出します。
最近のコメント