PICガジェット制作4 RCサーボモータの動作テスト

PIC ホビー

PICを使ってRCサーボモータを駆動しようと思いますが、その前に駆動用のパルス信号の生成とRCサーボモータの動作信号を確認しようと思います。
本記録は、まめのプログラム工房でテストした内容なので、忘備録程度です。

Sponsored links
Sponsored links

超小型RCサーボモータ

超小型のサーボモータ FH-2502 と FH-1083 を手に入れたのですが、詳細仕様がわからないのでちょっと手探りで動作させてみようと思います。
一応ネット検索した仕様は以下の感じです。

FH-2502

寸法: 16 x 8.2 x 16.5 mm
重量: 2g (電線を含まない)
仕事電圧: 3.7V~4.8V
トルク:3.7V: 0.12 kg-cm、4.8V: 0.16 kg-cm
操作角度:3.7V: 0.07 sec / 60 °、4.8V: 0.06 sec / 60 °
モーター タイプ: リニア モーター
ギア タイプ: プラスチック ギア
プラグ: JST1.25mm、JST1.0mm 、JR, ケーブル長さ = 110mm
温度: -10℃ – 50℃
デッドバンド幅:5usec

FH-1083

寸法: 13.5×6.2×20.1mm
重量: 1.7g (コードなし)
動作電圧: 3.7〜5.0v
トルク:
3.7v: 2.08 oz-in (0.15 kg-cm)
4.2v: 2.36 oz-in (0.17 kg-cm)
速度:
3.7v: 0.06秒/60 °
4.2v: 0.04秒/60 °
モータータイプ: 中空カップ

SG-90を手本にして

入手が容易なSG-90の仕様を基本にして FH-2502 と FH-1083 のパルス波形を作ってみようと思います。SG-90のパルスの仕様は下図の通りなので、20msサイクルのPWMを生成し、1.5msのパルスで中間位置になるはずです。

ちなみに、どこかのURLで下記のような記述を見つけました。しかし、その後2度と見つかりません。

   FH-2502 0.8 ~ 2.2ms   テストの結果 0.5~2.4ms
   FH-1083 0.9 ~ 2.1ms   テストの結果 0.5~2.4ms

このパルス幅を目安に搬送波を50Hzで実現してみようと思います。

開発環境

開発PC

THERDWAVE Magnate IM
   13th Gen Intel(R) Core(TM) i5-13400 RAM16GB,SSD 500GB
   Windows 11 Home 22H2

ソフトウェア

統合開発環境: MPLAB X IDE Ver 6.15
        MCC Ver 5.3.7
Cコンパイラ: XC8 Ver 2.45

マイコン書き込み、デバッグツール

PICkit3

ターゲットデバイス

PIC12F1822

まめの開発環境についてはこちらを参照してください。

ターゲットボード

ターゲットは前回の回路の出力RA2にRCサーボモータを接続しました。モータ起動時の電圧降下を考慮してコンデンサを追加しています。

プログラム

MCCでPICの情報を設定

MCC(Microchip Code Configurator)を使ってPIC12F1822の設定をしていきます。
基本的な設定は、「PICガジェット制作1 MCC設定を使い電源電圧を測定する」を参照してください。

今回は最初なので、精度の高いクロック31.25kHz(MF)で設定しようと思います。

「System Module」でClockを設定します。
  内蔵発信器を使いますので 
    System Clock Select: 「INTOSC」
    Internal Clock:    「31.25KHz_MF」
  に設定します。

「Device Resources」からADC, ECCP, TMR2を追加します。
*PIC12F1822のECCPはTMR2しか使えません。

「ECCP」を選択して「ECCP mode」をEnhanced PWMに設定します。

「Pin Module」で
   Pin3(RA4): ADC AN3
   Pin5(RA2): ECCP PA1
を設定します。

「TMR2」の設定をします。
「Timer Period」をPWM Period(パルス周期)の目標値20msに設定します。

「ECCP」の設定をします。
「PWM Duty Cycle」を50%に設定します。
このときのCCPR Valueの値をこのあと使います。今回は311になっています。

「Project Resources」の[Generate]をクリックして、プログラムの雛形をつくります。
これでMCCの設定は一応完了です。

パルス幅の設定値を計算

MCCで簡単に設定しましたが、Duty Cycleが50%(パルス幅10ms)です。RCサーボのパルス幅をおおよそ0.5~2.4msにしなければいけないので、設定値を計算する必要があります。
今回、クロック31.25KHzでDuty 50%に設定したときの CCPR Valueが311になっていました。
CCPRが311のとき、パルス幅が10msになります。
パルス幅が0.5msのとき以下のように表せます。
    10ms : 311 = 0.5ms : PW
なので、
    PW = 311 * 0.5 / 10 = 15.5
CCPRに16を設定すればパルス幅が0.5ms程度になるはずです。
同様に計算すると以下のようになります。

パルス幅   CCPR値
0.5ms → 16
0.8ms → 25
1.5ms → 47
2.2ms → 68
2.4ms → 75

波形の確認

とりあえずモータをつける前に出力波形を確認しておきます。

MCCで作成されたepwm.cに EPWM_LoadDutyValue(uint16_t dutyValue) という関数が作成されています。この関数を使えば、CCPR値を設定できそうです。

void EPWM_LoadDutyValue(uint16_t dutyValue)
{
  // Writing to 8 MSBs of pwm duty cycle in CCPRL register
  CCPR1L = ((dutyValue & 0x03FC)>>2);

  // Writing to 2 LSBs of pwm duty cycle in CCPCON register
  CCP1CON = ((uint8_t)(CCP1CON & 0xCF) | ((dutyValue & 0x0003)<<4));
}

epwm.c

main.c の while分の中に EPWM_LoadDutyValue(CCPR値) を入れて波形を測定してみます。

CCPRを16-47-75まで変更してみました。

CCPR=16
CCPR=25
CCPR=47
CCPR=68
CCPR=75

大体思った感じでパルス幅が決まって出力されています。

サーボテストプログラム

可変抵抗の中間端子の電圧をADC(0~1024)で取得し、その値を16~75までのCCPR値に変換してEPWM_LoadDutyValueに渡しています。

FH-2502とFH-1083を動作させてみました。
URLで見つけた仕様?では FH-2502 0.8-2.2ms、FH-1083 0.9-2.1msとなっていましたが、実際は一般的?な0.5-2.4msで180°回転しました

パルス幅 0.5ms
パルス幅 1.5ms
パルス幅 2.4ms

FH-1083はすごく小型でプラモデルには仕込みやすそうですが、ちょっと入手が難しそうです。
FH-2503はFH-1083より若干大きいですが、SG-90に比べるとくらべものにならないくらい小さく、価格もSG-90並みなので、FH-2503をメインに使おうかなと思います。

タイトルとURLをコピーしました