カラクリ人形等を動かす為に、電池などでも駆動でき、基本的には電源の接続・切断だけで簡単に制御できる直流(DC)モーターを使ってきた。しかし、負荷が重い場合や高速制御が必要な場合などでは、回転角度や停止位置を精度よく実現するのに苦労させられる。此の辺りに付いては、別途述べてみたい。

 

一方、くるくる回転させる必要のない用途であれば、回転角度や停止位置を精度よく出せるサーボモーターは頼もしい。しかし、制御方法は、DCモーターのそれよりも若干面倒の様だ。例によって、インターネットでいろいろ調べてみたが、すんなりと理解させてくれるような記事には出会えなかった。

 

そこで、インターネットの幾つかの記事で教えて頂いた事と、私の疑問を実験で確認した事等を合わせて、サーボモーターの制御方法を纏めてみようと思った。

 

サーボモーターは、駆動電源の他に一定周期のパルス信号を与えて制御する。そのパルス信号のパルス幅でサーボモーターの回転角を指定する。例えば、サーボモーター型番SG90では、パルス周期は20mSで固定。パルス幅を0.5mSから2.4mSの間で変化させて、回転角を-90°から+90°の間で実現する。

                                  

つまり、サーボモーターの制御には、パルス信号のパルス幅変調(PWM)が必要と言う事だ。私は以前からカラクリ人形等の制御にマイクロコンピュータPIC16F88を使ってきたが、幸いにも、そのマイコンはPWM機能を内蔵しているので、その機能を使ってサーボモーターを制御する方法を整理してみる。

 

           サーボモーターとPIC16F88との接続

 

 

PWMに必要な設定などは次の通りだ。

 

◆CCP1CONレジスターの設定

  此のマイコンでPWM機能を実行する事を設定する。

  CCP1CONに:00001100 : 0CHを書き込む

 

◆T2CONレジスターの設定

  ビット1と0でTMR2カウンターの計数倍率を16とする設定を行う。

  ビット2のTMR2ONはパルス幅カウンターの動作/停止を指定するが、

  此の指定は実行プロ グラムの中で行う。此処では停止としておく。

  T2C0Nに00000011 : 03Hを書き込む。

 

◆PR2レジスターの設定

  パルス信号の周期を指定する。

  この設定は、マイコンの初期設定と共にバンク1の中で行う。

   設定値に付いては後述する。

      

◆CCPR1Lレジスターの設定

       パルス信号のパルス幅を指定する。

       この設定は、実行プログラムの中で随時・適宜行うが、後述する。

 

◆CONFIGの設定

  PWM処理されたパルス信号を出力するマイコンの端子を指定する。

       特に設定しなければRB0端子から出力される。

  RB0端子を他用途で使う場合は、CONFIGで設定すればRB3端子に出力される。

   &_CCP1_RB3   これをCONFIGに追記する。

 

基本的な設定は以上だが、マイコン クロック周波数、パルス信号周期とパルス幅の3個の設定値は、下記の式に基づいて決める。

 

周期計算法 : (PR2内容+1) X 4T X (TMR2計数倍率16)

幅計算法 : (CCPR1L+CCP1CON45bit)の内容 X T X (TMR2計数倍率16)

                                              此処でTはマイコンクロック周期

 

また、サーボモーターSG90の仕様書には、パルス周期20mS、パルス幅0.5mS~2.4mSの間で設定、と記されているので、それらを実現し得る上記の3個の設定値の組み合わせを導き出す事が求められる。

 

 

上記の検討と実験で得た設定値と、それによる実測値を下記に示して置くので、まだ微調整が必要の様だが、まずはご参考までに。

 

*システムクロック: 500KHz。  バンク1で、OSCCONに30Hを書き込む。

*パルス周期 20mS。 バンク1でPR2に80Hを書き込む。

*パルス幅     0.5mS         -90°  CCPR1L に04(04H)を書き込む

        1.45mS          0°            13(0CH)          

              2.4mS         +90°            20(14H)          

上記以外の細かい角度・パルス幅に付いては、按分などして決めて調整する。

 

++++++++++++++++++++++++++++++++++++++++++++++++

 

実行プログラムの中では、下記の様にパルス幅の設定を行う。

ポイントは、パルス幅の設定を行う前にタイマーを停止させ、設定が終わった後でタイマーを動作開始させる事。そして、次のパルス幅(回転角度)を設定する時は、サーボモーターの応答時間(SG90仕様書 : 動作速度: 0.12 s/60°)に相応する時間を確保する。

 

 

JOB1       BCF    T2CON,TMR2ON  ;タイマーTMR停止

              MOVLW  04H                ;04をWレジスタに書込み   0.5mS   -90°

              MOVWF  CCPR1L          ;W→CCPR1Lレジスタに書込み パルス幅設定

              BSF    T2CON,TMR2ON  ;タイマーTMR動作開始

             CALL   TIM150               ;150mSサブルーチン

 

JOB2       BCF    T2CON,TMR2ON  ;タイマーTMR停止

              MOVLW  0CH                 ;13   1.45mS    0°

              MOVWF  CCPR1L           ;パルス幅設定

              BSF    T2CON,TMR2ON  ;タイマーTMR動作開始

              CALL   TIM150

 

JOB3       BCF    T2CON,TMR2ON  ;タイマーTMR停止    

              MOVLW  14H                 ;20    2.4mS    +90°

              MOVWF  CCPR1L           ;パルス幅設定

              BSF    T2CON,TMR2ON  ;タイマーTMR動作開始

              CALL   TIM150

 

              GOTO   JOB1

 

皆様の参考になれば幸いです。

 

動作状況の映像です。

https://youtu.be/kdJLXYNWI5E