読者です 読者をやめる 読者になる 読者になる

Nov11’s diary(自宅での開発環境作り )

3Dプリンタと切削加工機で工作した事をアップして行きます

PICを使用して開発する事にした(サーボモータ/DCモータ制御)(その3)

PIC24FJ64GA002でDCモータ制御が上手くできたので、次にサーボモータを動かして見る事にした
使用したサーボモータは、E-Sky500と言うサーボモータで少し前にラジコン用に購入した物を使用する事にした
接続は簡単で、サーボの電源を接続し、後は制御線に15msのPWMパルスを出力するだけでOK!
ちなみに、E-Sky500のピンアサインは、白線が制御線、赤がVCC、黒がGNDになっていたが、ネットで確認したところメーカによって様々あるようなので注意しないといけない事が分かった
また、パルス幅もメーカにより異なるようなので調整が必要となる事も分かった

んで、いつも通りにブレットボードで部品を配置しテストする事に
色々と試して、PWMの周期が約15msで、最小幅が640us、最大幅が1.54msの範囲で動作してくれた
[制御波形]

f:id:Nov11:20160214134243j:plain

[配線]

f:id:Nov11:20160214133224j:plain

  ((サーボモータ/DCモータ制御)(その2)の時に使用した配線に追加しました)

↓↓↓↓↓↓↓↓↓下記の内容は、MCC(v2.25.2)を使用しています↓↓↓↓↓↓↓↓
v2.25.2を使用する場合は、11月08日のブログを参照して下さい

[プログラム作成]
1)MPLAB Xを起動し、プロジェクトを作成する
2)Code Configuratorで、Systemを設定し、TMR1とOutput CompareのOC1とOC2を追加する
3)OC1の設定項目を以下の様に設定する
 Mode:Edge-Aligned PWM Mode,Clock:TMR2,Primary Compare:0x182,Secondary Compare:0x500に
 して、Code ConfiguratorのPin Managerで、出力ピン(OC1のOC1)を選択する
4)TMR2が追加されるので、Presclarを[1:8]にして、Timer Periodに15msと入力する
5)OC2をOC1と同様に設定する
6)TMR1を1000msに設定する
7)Generate Codeを押してコード生成を行う
8)パルス幅変更のプログラムをメイン関数に記述する
 と、言っても、MPLAB XのGenerate Codeがプログラムの大半を自動生成してくれているので、
 コーディングは以下の数行となる
-----------------------------------------------------------------------------------
uint8_t count;
uint16_t uiDuty;
uint8_t flg;

int main(void) {
    // initialize the device
    SYSTEM_Initialize();

    // この値はサーボにより異なる
    uiDuty = 0x500;
    flg = 0;
    
    while (1) {
        // Add your application code
        if ( TMR1_SoftwareCounterGet() != count ) {
            count = TMR1_SoftwareCounterGet();
            // 1000ms毎に制御する
            if ( flg == 0 ) {
                // サーボ1を制御する
                OC1_DualCompareValueSet(0x182,uiDuty);
                uiDuty += 0x80;
                if ( uiDuty > 0x1000 ) {
                    uiDuty = 0x500;
                    OC1_DualCompareValueSet(0x182, uiDuty );
                    flg = 1;
                }
            }
            else {
                // サーボ2を制御する
                OC2_DualCompareValueSet(0x182,uiDuty);
                uiDuty += 0x80;
                if ( uiDuty > 0x1000 ) {
                    uiDuty = 0x500;
                    OC2_DualCompareValueSet(0x182, uiDuty );
                    flg = 0;
                }
            }
        }
    }
    return -1;
}
-----------------------------------------------------------------------------------
7)プログラムを書き込む
8)接続したサーボが交互に動作すれば正常動作となる
ちなみに、上記プログラム中の時間取得関数(TMR1_SoftwareCounterGet())をググっても検索は1件で、サイトを開くと404エラーだった...ん~更なる不安に襲われる筆者であった
もしかしたら、Code Configuratorの自動作成機能は誰も使っていないのだろうか...

なお、ブログの内容を参照して実行した結果に責任は負いかねますので、ご了承下さい