2015年4月10日金曜日

PICでサーボモーター制御

とうとうメカトロニクスに手を出すことに(笑)

先日製作した475.5kHz用ローディングコイルの可変Lを遠隔操作するための駆動装置としてサーボモーターを使うことにしたのですが、どのようなものを選べばよいものか見当が付きませんでした。ふと秋月にサーボモーターのラインナップがあったのを思い出して秋月のサイトで見てみると、いろんな種類のサーボモーターがありました。

数グラムの超小型軽量タイプや高トルクな比較的大型のものなどさまざまですが、とりあえずスタンダードなものとして台湾GWS製のMICRO/2BBMG/Fというミドルクラスっぽいモデルを選んでみました。ミドルクラスっぽいといっても本体の重さは28gで一辺3センチ以下と小型なものです。

回転軸が金属になっています

サーボモーターにはGNDと+5Vライン、それに回転角を制御する線計3線が出ています。

制御線に送る信号については定まった規格はないようですが、どのメーカーもだいたい共通して制御信号はパルス波で、パルス周期が約20ミリ秒、パルス幅を1ミリ秒から2ミリ秒程度の間で変化させることによって回転角を調整します。

いくつかネットで見つけたPICによる制御例では、可変抵抗器で得た電圧をA/D変換器で読み取り、その値に応じてパルス幅を変化させるものがほとんどです。まずは公開されているソースコードをコンパイルして試してみましたが、小気味良く動き追従性も十分でしたがボリウムを早めにまわすと突然パルス信号が止まってしまったりしてあまり具合が良くありません。

さらに可変抵抗器の劣化に伴う制御電圧の不安定化も懸念されるため、A/D変換は使わずに直接パルス幅を決定する方法を考えることにしました。

パルス波を生成する方法として、まずPICに内蔵されているPWMモジュールの利用を思い浮かべましたが、いずれも8ビットタイマーベースで、通常使用する4MHzクロックからみると20ミリ秒というパルス周期は遅すぎて、プリスケーラーを最大限に使用してぎりぎりやっと生成できるくらいです。ただその場合プリスケーラーを使用した分パルス幅を細かく調整することができなくなってしまいます。というわけでPWMモジュール使うことは断念しました。

考えた方法は、2つのタイマー割り込みを使用するというものです。

 1つ目のタイマーではパルス間隔で割り込みをかけ、割り込み時に制御ポートをオンにするオンタイマーとして作動させます。と同時に必要なパルス幅になるような値を別の2つ目のタイマーに設定させます。2つ目のタイマーは1つ目のタイマー割り込み時からカウントを開始し、設定値(必要なパルス幅)に達したときに割り込みがかかりそのときに制御ポートをオフにさせます。(オフタイマー)これにより比較的正確に任意のパルス幅をもった信号を生成することができます。
2つのタイマーによるパルス波生成

このパルス幅の設定値を変化させれば、その結果サーボモーターの回転角を任意に変更させることができます。

こちらのサンプルコードではPIC16F1827をターゲットにしています。16F1827はタイマー0, 1, 2, 4, 6と5つのタイマーが内蔵されていてそのうちのタイマー1が16ビット、他が8ビットタイマーになっています。パルス間隔生成(オンタイマー)は8ビットのタイマー2を使いましたが、PWMと異なりポストスケーラーが使えるので20ミリ秒生成は問題なく可能です。パルス幅を作るオフタイマーには16ビットのタイマー1を使いました。プリスケーラーをできるだけ小さくすることによって、サーボモーター可変角180度を約440ステップ(0.4度/ステップ)で変化させることができました。

 パルス幅設定値変更はロータリーエンコーダで行い、LCDによる状態表示も入れてみました。ポイントは処理によってパルス幅が変動しないように、制御ポートがオンの時には他の割り込みや処理を行わないようにするということです。

25ステップ/回のロータリーエンコーダーでは35.2倍の減速機構に相当します
角度とインダクタンスバーグラフ表示つき
 使用するサーボモーターによってoffset値や変化幅が変わると思います。適宜数値を調整してみてください。

0 件のコメント:

コメントを投稿