Attribute System

ジャンク奇行。 ときどき ラクガキ。

広告

※このエリアは、60日間投稿が無い場合に表示されます。記事を投稿すると、表示されなくなります。

速度と距離を測る、その3

2015-09-26 23:34:07 | ロボコン
 こんばんはヌキヲです。
今回は念願だったエンコーダの逓倍処理を実装したので紹介します。

今までは ADC で読みシュミットトリガをしているだけでしたので
クワッドレート、すなわち 1スリット 4パルス でした。
そこを今回は逓倍処理で 1スリット 256パルス にするのが目標です。

以前の記事はこちら
速度と距離を測る
続・速度と距離を測る


Encoder


写真の様な白黒のスリットを用意すると、矩形波が来ると思っている方が多いのですが、
白黒の境目付近はグレー値が来るので、波形は疑似サイン波状になります。
また、センサには焦点距離というのが存在して、焦点距離近傍では小さな点として、
そして大きく外れればぼやけて大きな点(平均値)として読み取れます。

前回まででセンサの X相 Y相 が位相差 90度 になるように設計されているので、
縦軸に Y相、横軸に X相 を持ってくるとアークタンジェントで位相の角度に変換できます。
ヌキヲさん数学てんでダメなのですが、極座標変換の一種らしいです。

さすがに毎回アークタンジェントを計算するのは処理的に重いのと、
0除算 の問題があるのでアークタンジェントはテーブル化してしまいます。
今回は力弱くお手本と同じ 16x16 のテーブルにしましたが、
プログラム ROM 容量があれば 32x32 などにしたりまたは分解能を上げたりと、
いろいろバリエーションは変えられそうです。

 -95, -92, -89, -86, -82, -78, -73, -68, -63, -58, -53, -48, -44, -40, -37, -34,
 -97, -95, -92, -88, -84, -79, -74, -69, -63, -57, -52, -47, -42, -38, -34, -31,
-100, -98, -95, -91, -87, -82, -76, -70, -63, -56, -50, -44, -39, -35, -31, -28,
-104,-101, -98, -95, -90, -85, -78, -71, -63, -55, -48, -41, -36, -31, -28, -25,
-108,-106,-103, -99, -95, -89, -82, -73, -63, -53, -44, -37, -31, -27, -23, -20,
-112,-110,-108,-105,-100, -95, -87, -76, -63, -50, -39, -31, -26, -21, -18, -16,
-117,-115,-113,-111,-108,-103, -95, -82, -63, -44, -31, -23, -18, -15, -13, -11,
-121,-121,-120,-119,-117,-113,-108, -95, -63, -31, -18, -13,  -9,  -7,  -6,  -5,
 127, 127, 127, 127, 127, 127, 127, 127,   0,   0,   0,   0,   0,   0,   0,   0,
 121, 121, 120, 119, 117, 113, 108,  95,  63,  31,  18,  13,   9,   7,   6,   5,
 117, 115, 113, 111, 108, 103,  95,  82,  63,  44,  31,  23,  18,  15,  13,  11,
 112, 110, 108, 105, 100,  95,  87,  76,  63,  50,  39,  31,  26,  21,  18,  16,
 108, 106, 103,  99,  95,  89,  82,  73,  63,  53,  44,  37,  31,  27,  23,  20,
 104, 101,  98,  95,  90,  85,  78,  71,  63,  55,  48,  41,  36,  31,  28,  25,
 100,  98,  95,  91,  87,  82,  76,  70,  63,  56,  50,  44,  39,  35,  31,  28,
  97,  95,  92,  88,  84,  79,  74,  69,  63,  57,  52,  47,  42,  38,  34,  31,



そのテーブルを表示します。
負号付8bit で位相角度値を表現し、前回(t-1)との偏差で移動量を算出します。
注意点は、どんなに細かく動かしても 1パルス 分の移動量を得ることはできません。
このテーブルを一周で一スリット分になります。

一見 -121 と 127 との境をまたぐとき、移動量が突然 -248 等の
大きい値にになってしまいそうですが、ここは 2の補数 表現の循環に当たり
うまく計算できることが分かりました。←悩みました。


Encoder2015


今回の実装は PIC24F04KA200 で行いました。
ADC のサンプリングレートと、IC の大きさが決め手ですが、
今回プログラム容量が 4KB しかなくかなりギリギリでした。
倍の 8KB あればもっとテーブルを大きくできたので残念です。
この 4KB という容量はかなり微妙で、純正の printf なんかも全然入る気配がしません。
かなり用途を特定されてしまいます。

メイン基板との通信は ソフトUART で行います。
クワッドレート出力の名残で、ピンが二本あるので片方をタイミング生成に使用し、
立ち上がりエッジを検出すると、それまでの移動量を UART で送信します。
UART 端子をオープンドレインにして終端プルアップすれば、多重することもできますね。
現在 1ms 周期での取得で安定しています。

晴れて 1スリット 256パルス になったのなら、
1回転 5スリット の時 1280パルス来る計算です。
この状態で現在 3000mm/s までは安定して速度制御できそうです。

さて、気になる参考文献なのですが、初出が 2001年 です。
私はこれを理解し、実用化するまでに15年かかっていることになります。
独学の限界ですかね?

一応これにてロータリーエンコーダの自作は完成としておきます。
やりたいことみんなやれた感じで大変満足しています。
ここが再現できない!とか説明端折り過ぎ!
とかありましたら、何でもいい(スパム以外)のでコメかメッセージをください。


参考文献・お手本
・トランジスタ技術 2001年1月号
 自作ロータリ・エンコーダとPICマイコンによる
 模型モータ用位置・速度サーボ・システムの製作

コメント   この記事についてブログを書く
« 30pin iPod dock の Bluetoot... | トップ | VsualuRuby を Ruby 1.9.3 で... »
最新の画像もっと見る

コメントを投稿

ロボコン」カテゴリの最新記事