免責事項

注意、免責事項について
・高電圧、大電流その他高エネルギを扱う実験を行う際にはくれぐれも安全に配慮し、細心の注意を払って行うようにしてください。
・当ブログの記事を参考にして発生した損害についてFEL研究室はいかなる責任も負えませんでご了承ください。
ラベル モータ の投稿を表示しています。 すべての投稿を表示
ラベル モータ の投稿を表示しています。 すべての投稿を表示

2020年10月11日日曜日

ACサーボモータのエンコーダ解析

ご無沙汰しております。
すっかり涼しくなってきました。
秋と言えば、過ごしやすいことを口実に〇〇の秋と、ほとんどなんでも有りの秋が大量発生して騒々しいことこの上無いので、何かと流行に歯向かいがちな年頃の私としては「逆張りの秋」を標語に、世間への反発を強めていこうと決意しました。
 
実に9ヶ月ぶりくらいの更新です。
久しぶりに記事書くやつ(意味不明)立ち上げたらなんかUIが変わってて困惑しました。画像の左揃えがうまくできん。

さて、ヤフオクで衝動買いしたACサーボが部屋で眠っていたので、ちょっとモータ制御でもしてみようと思いたち、まずは搭載されているエンコーダを解析してみることにしました。
 
50Wなのでとても小柄です。
モータの型式は「GYS500DC1-C8B」で、カタログ(記事の後ろにURL貼っときます)によると、16bitのインクリメンタルエンコーダを搭載しているらしいです。インクリメンタルとアブソリュートの違いは「多回転データの有無」で、前者が無し、後者が有りです。アブソリュートでは大抵多回転データ保持用のバッテリが接続され、それを用いて回転量のメモリが消えないようにしている仕組みのようです。
カタログやサーボアンプ側の資料を読み漁りましたが、ピン配置以上のデータが見つかりませんでした。ピン配置はメーカの製品情報に書いてあり、この情報から半二重の差動シリアル信号なんだろうというのは予想が付きます。

取り敢えず電源に5Vを供給し、差動ペアの信号をオシロで見てみましたが何も信号の変化がなかったのでなんからのリクエストに対してエンコーダがデータを返すような仕組みのようです。なんらかのデータを送ってやるにしろどういう信号レベルなのかもわからないので分解してみました。
 
既に外して線が引っ張り出してありますが、1段目の基板(写真左)にRS-485のトランシーバが載っていたのでこれを外し、送信信号と受信信号を別々に取り出してみました。制御してそうな部分はASICのようで当然データシートも出てきませんでしたので通信プロトコルについては不明です。他社と共用してそうな製品もないようなのでこのメーカ独自のものなのでしょう。
取り敢えず適当な周波数のパルスを送ってみるとラッキーなことになんかデータを返してきました。8パルス送ると以下のようなデータがエンコーダから送信されてきます。
 
4MHzのパルスがしばらく続いて、あるところでオフ期間が1周期分(250ns)あるパルスが出てきます。
 
この後からはなんか意味がありそうなパルスの変化が現れてきます。
 
エンコーダの軸を回すと後半部分の波形が変化しました。また、電源を入れ直すとかならず同じような波形となる部分があったのでそこにインクリメンタル角度データがありそうです。
波形を見る感じUARTでは無さそうです。波形の変化の仕方からマンチェスター(バイフェーズ)っぽいので取り敢えずデコーダを作って読み出してみることにしました。
波形の最初の方に同じような波形が続くのは、恐らくここでデコーダがクロックの同期をとるためのプリアンブル期間と思われます。この期間でPLL等を用いてクロックを復元してやればいい感じにデータが読み出せるんじゃないでしょうか。
考えたデコーダの構成は以下の感じです。

デコードすると単なるクロック同期のシリアル信号(SPIで読める)になるので適当なマイコンにでも入力したらいいかと思ったのですが、クロック4MHzのSPIを数バイト高速で処理しなければなりませんので少々オーバスペックですがdsPICを使ってみました。
マイコンでやってることは非常に単純で、エンコーダへの送信データとしてIO叩きで8パルス作って、エンコーダからデータが出てきたらPLLのロック信号を監視して、ロックしたらSPIの受信バッファを読み、1が含まれたデータが検出されたらそっからは順番にメモリにデータを格納していくということをやっています。Cで書いても余裕の速度なのでdsPICすごいですね、というかもったいない。
読み出せたデータを眺めながらモータの軸を動かしていると以下のようにデータが格納されていることがわかりました。
ステータスフラグのようなものは内容は不明です。パッと思いつくのはバックアップ用バッテリの電圧監視とか温度監視とかでしょうか。確かめてないのでわかりません。
その次の16bitが1回転の位置データです。電源を切っても軸位置を変えなければ同じデータが読み出せます。インクリメンタルエンコーダでも1回転のアブソリュートデータは取れるのですね。知りませんでした。
その次に8bitの90度ごとのデータがあります。軸を90度回転させるごとに255→0に戻ることから判明しました。電源を切っても保持されます。何に使っているのかはわかりませんが、もしかしたらモータが4極なのでモータ駆動用の位置データ(ホールセンサの変わりのようなもの?)かもしれません。
そしてその次の16bitにインクリメンタルな位置データが続きます。電源を入れると0からのカウントになります。
次は16bit分0が続くようです。同じシリーズのACサーボには16bit回転量を持ったアブソリュート型もあるようなのでその場合に多回転データが入るのかもしれません。
最後に16bitのチェックサムないしCRC等の検査データと思われる部分があります。インクリメンタルデータとアブソリュートデータ両方に影響を受けて変化するためです。計算式までは不明です。
 
アブソリュート16bitデータを360度換算にして表示させてみた動画です。
軸の回転に応じて角度が変化しているのが確認できます。

ちょっと疑問なんですが、モータ軸に高分解能なエンコーダを付けた角度制御ってどういうアルゴリズムになっているんでしょうか。いくらエンコーダの分解能が高くても、正弦波駆動の分解能はたかだか知れているはずで、同期モータですので単純に考えるとそれ以上の角度分解能は無いはずです。指令値に近づくと相ごとに位相の進み、遅れ等を意図的に作ったりするのでしょうか。気になります…。
 
今回はエンコーダの解析ができたので、気が向いたらACサーボの制御でもチャレンジしようかなと思っています。または一年放置している焼き芋機。
 
それでは

資料
1. モータのカタログ
 
2. インバータの詳細(エンコーダのピン配置等)
 
3. マンチェスタ(バイフェーズ)デコード

2016年10月1日土曜日

DCサーボの位置決め制御!

こんにちは、KKTです。
今日はもう10月ですが、なかたくんも間に合わせ記事+αを書いてくれて素晴らしいことだと思います。組紐がきれいに編めててすごいと思いました。僕も結びを大切にしようと思います。

今日は題名の通りDCサーボの位置決め制御についてです。
DCサーボと言っても色々ありますが今回はRCサーボを使っていこうと思います。RCサーボは入力されたパルス幅に応じた回転角になるように制御されていますが、サーボに内蔵されている回路はどんな回路なのでしょうか。今回は制御のお勉強ということで、可変抵抗を使ってサーボの回転角を制御するという回路を作ろうと思います。

入力に対して何らかの出力をする場合は、入力(指定値)と出力が完全に1:1で対応してたら都合が良いのですが、実際はそうでもありません。
例えば、電源装置であれば指定した電圧を出力する時でも内部抵抗等が原因で負荷によって出力電圧が変わってしまいます。そこで、出力から入力にフィードバックをかけて、クローズドループにしてやると出力の精度や安定性は飛躍的に向上します。
フィードバックを自分の出力から貰って、それをどんなふうに出力に反映させるかはいくつかの方法があります。単純に、指定した値より大きければ出力をOFF、小さければONにするON/OFF制御と呼ばれるものや、もっと高度なPID制御と呼ばれるものもあります。
   
今回は比例制御と呼ばれるものを見ていきたいと思います。比例制御については回路説明のところで少しお話します。

取り敢えずRCサーボを分解します。
RCサーボは出力軸の回転角をフィードバックするために可変抵抗を内蔵しています。便利なのでそのまま流用します。ついでにモータの線も付けておきます。

続いて、こんな回路を組みます。
比例制御の基本的な流れとしては、

指定値と現在値の差を求める
↓
差を必要に応じて増幅
↓
出力に反映

という感じだと思います(適当)。ON/OFF制御よりONとOFFの間が細かいのでより精密に制御することができます。指定値と現在値の差を求めて制御しているので、指定値と現在値が大きく離れている時は出力も大幅に動かし、差が小さい時は出力も少なく変化させるので滑らかに制御できるのがわかると思います。しかし、指定値と現在値がかなり近くなると差もかなり小さくなるので出力の変化も小さくなって、時間がかかる=有限時間内での精度はあまり高くないということになってしまいます。そこで差を増幅することで実際の指定値と現在値がごく近い時でも出力を変化させ、精度を上げることができます。すごい!
回路的には、まず初段のOPアンプでは差動増幅器を構成していて、文字通り指定値と現在値の差を求めます。それを次段で非反転増幅します。ゲインは可変できるようにしてあります。ゲインを変えるとサーボの応答が大きく異なるので非常に面白いです。増幅後はトランジスタのプッシュプルに通して電流増幅します。±電源を使っているのでトランジスタ2個で正転逆転できるようになっています。トランジスタが飽和しない時も多いので放熱には注意しましょう。
これで±5Vくらいの電源をつなぐと、可変抵抗の動きに合わせてサーボの軸が回ると思います。なかなかおもしろいです。こんな感じに実装しました。

次に、指定値に対してサーボがどのように応答しているか見てみましょう。現在値ボリュームと指定値ボリュームにオシロを繋いで波形を見てみます。

ゲインが大体丁度よい時
振幅が大きい方がサーボの応答、小さい方が指定値です。指令値が立ち上がってから徐々にサーボが動いて、指定値に達するとそれを維持し、また立ち下がり時も同様の動作で指定値に従って動作します。指定値に到達している時は外乱にも強く、手でサーボホーンを動かそうとしても(トルクがある程度強ければ)ほとんど動きません。

次にゲインが必要以上に高い時の様子
なかなかおもしろいことになっています。指定値の立ち上がりから少し遅れて現在値も立ち上がっていますが、頂上あたりで行き過ぎを検知して、戻しすぎ、また行き過ぎ、戻しすぎる…というのを数度繰り返したあと収束しています。いわゆるハンチングと呼ばれる現象です。ゲインを必要以上に高くするとこうなるので注意しましょう。また、モータ電流が瞬間的に高くなる部分で電源電圧が低下しているため指定値にも影響が出ていますね。パスコンを増やすなり電源のインピーダンスを下げるなりしたほうが良いです。画像はありませんが低く過ぎると、いつまで経っても指定値にならないような波形になります。
サーボの特性で、立ち上がり速度と立ち下がり速度が違うのは仕方ないです。
簡単な回路で、角度制御ができておもしろいのでいらないサーボがあれば試してみてはいかがでしょうか。

Web拍手反応

>餃子なのかマグネトロンなのかはっきりしてください
おずしは(一応)人間なのでどちらかと言えば餃子に近いと思います。 

>koko 
ココスの包み焼きハンバーグ食べてみたい

>そりすぎて百万回そりになった猫 
100万回抜いたねこれ のコラ割りとすき

>お前、言語か? 
教諭はアカチャンの時も言語って泣いてそう

>記事書く時はめっちゃ頭良さそうに見えるKKTすこ 
記事書く時はめっちゃ頭良さそうに見えるくらいでしか好かれない男!(ドッ)

>すき... 
心苦しいからやめて

>わーい! 
ワイはワイのために、みんなもワイのために、やぞ

>いつも楽しく拝見しております。シュッシュッシュ 
シュッシュッシュシュシュ!強い素子!シュッシュ!

>オラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオラオ…
いたずらに長いのを送るのはNG

>失敗集はよ 
ワシの伝記出版されたらほぼ失敗集みたいになるやろ


シモネタ送るのはやめよう!

それでは、今日はこの辺で。

http://clap.webclap.com/clap.php?id=fellabo