PSMC機能でサーボモータを動かしてみます

〔PICの動かせ方入門に戻る〕


以前こちらでPIC12F1822の16ビットタイマー(TIMER1)を使い割り込みで処理する方法を書きました。
なので、サーボモータの制御方法についてはそちらを参照してください。
このページではPIC16F178x系の周辺機器モジュールPSMC(Programmablse Switch Mode Control)で
PWMを発生させてサーボモータを動作させてみたいと思います。
PSMC機能の基本はこちらを参照しましょう、又、PSMCによるPWM生成は"単相PWM"機能で行います。

使用するサーボモータ(SO3N 2BBMG)は以前こちらで使用した物です。
又、こちらの360°連続回転サーボSG90-HVも動作させてみたいと思います。

《 PSMCのレジスタ設定 》

生成する波形図 生成するPWM波形は左図です。
他のPICでPWMの50Hzを生成するには
Foscを2MHzにすれば出来ますがぁ....
PSMCを持つPICはFoscを16MHzで可能です
それにPSMCは3チャンネル有るので
サーボモータを3個まで制御可能です。
尚、因みにPIC16F1788ならPSMCが4チャンネル有りますが、ここでは16F1786を使います。

PSMCのレジスタ設定は"PSMC Designer Tool"を使い、"単相PWM"で設定を行いますので"単相PWM"の
ページを参照しながら以下の様に設定変更を行いましょう。

@ 使用するデバイスとモジュールを選択します。
  Device=PIC16(L)F1786に設定、PSMC=PSMC3に設定します。
  PSMCモジュールの"Enable"にチェックを入れます。

A PSMCクロックのソースを設定します。
  ClockSource=Fosc(16MHz)に設定、Prescale=8(1:8)に設定します。
  psmc_clkは2MHzとなります。

B 周期イベントの設定を行います。
  生成する周波数(Period Freq)を入力します、ここでは0.050(Freq)と入力します。

C 立ち上がりイベントの設定(位相)を行います。
  こちらと同じです。

D 立ち下がりイベントの設定(デュティ比)を行います。
  パルスの立下げエッジタイミング時間(Duty Cycle)を入力します、ここではデュティ比は
  7.5%(Percent)としました。(サーボモータのニュートラル位置です)

E PSMCの使用するモード(単相PWM)を選択します。
  こちらと同じです。

F 出力ピンの設定を行います。
  ここではPSMC3のモジュールを使い、PSMC3A(RC5)の16番ピンから出力を行います。

以上設定完了です。

後は可変抵抗器で立下りイベントを変えてやればサーボモータは回転します。
尚、サーボモータのPWM出力は出力し続ける必要が有ります。
SO3N 2BBMG”のサーボモータ時設定
[ニュートラル位置]
PSMC3DCH  = 0x0B;   // デュティ比は7.5%:ON時間=1500us
PSMC3DCL  = 0xB8;
[時計回り方向90°位置]
PSMC3DCH  = 0x05;   // デュティ比は3.25%:ON時間=650us
PSMC3DCL  = 0x14;
[半時計回り方向90°位置]
PSMC3DCH  = 0x12;   // デュティ比は11.65%:ON時間=2330us
PSMC3DCL  = 0x34;

”SC90-HV”の360°連続回転サーボモータ時設定
[ニュートラル位置(停止)]
PSMC3DCH  = 0x0B;
PSMC3DCL  = 0x6A;   // ON時間=1461usに変えるでないと停止しません。
[時計回り方向回転]
PSMC3DCH  = 0x05;   // 最高速度での回転値
PSMC3DCL  = 0x14;
[半時計回り方向回転]
PSMC3DCH  = 0x12;   // 最高速度での回転値
PSMC3DCL  = 0x34;

《 配線図 》

実態配線図
電源は5.0Vです。
PSMCモジュールは、PSMC3を使い、
出力ピンはPSMC3A(RC5)の16番ピンを
使います。
可変抵抗は手持ちから500KΩBを使っています。
もし、可変抵抗の回し方向とサーボタの
回転方向が一致しない場合は可変抵抗の
+−配線を入れ替えましょう。
アナログ入力ピンはAN12(RB0)です。

《 ダウンロードプログラムについて 》

↓ここからサンプルプログラムソースファイルをダウンロードして下さい。
servo.zip

プログラムソースをダウンロードしたら、MPLAB Xにてプロジェクトを作成します。
以下のファイルをプロジェクトディレクトリにコピーしてプロジェクトに取込んで下さい。
次にコンパイルPIC書き込みを実行して下さい。
MPLAB(R) XC8 C Compiler Version 2.00コンパイラを使用しています。

ダウンロードファイルを解凍すると下記の様なファイル構成です。
 servo.c・・・・・・・・・・・ 本体のサンプルプログラムソースファイル

 尚、CPUのクロックは16MHzを想定しています。

servo.c

このプログラムの動作は、起動させればサーボモータはニュートラル位置に移動して停止します、
それから3秒ほどして可変抵抗のツマミを回せばその方向に回した角度だけ回転します。

SC90-HV(360°連続回転タイプ)の場合は、プログラムを変更しましょう。
(0xB8の設定ではサーボモータが停止しない為に0x6Aと調整しましょう)
PSMC3DCL = 0xB8; // (1周期40000カウントなのでデュティ比は7.5%:ON時間=1500us) SO3N 2BBMG 時
から
PSMC3DCL = 0x6A; // (1周期40000カウントなのでデュティ比は7.5%:ON時間=1461us) SC90-HV 時
に変更します。
SC90-HVは可変抵抗のツマミを回せばその方向に回転します、更にツマミを回せばサーボモータは
回転速度をあげます。

《 その他 》

SC90-HV(360°連続回転タイプ)はギヤードモーターとして使う事が出来そうですね。
又、6.0VまでOKの様なのでPICと別電源にすればトルクや回転数を上げられそうですね。
尚、デュティ比率は3.25%〜11.65%(周波数のON時間)で行っているのでどの程度比率を拡大させれば
もう少し回転を上げられるか等は実験していません。(ご自分で実験しましょう。)

PSMCはモーターのアプリケーションを作成するには最適な機能だと思います、
これからは、モーター関連を作成する場合はPIC16F1786/16F1788で決まりですね。
でもぉ、できるならPICの28Pでなく18Pで出して欲しかった。




【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.