PIC24Fでサーボモータを制御

Pocket

 今回はPIC24FJ64GB002を使用してサーボモータを制御をやってみたいと思います。

 基本的にはPIC24FのPeripheral LibraryからPWM出力を使用してサーボの制御を行います。私の所有しているサーボモータですが、アナログサーボで、中央(ニュートラル)が大体1600μs、+90度が2400μs、-90度が850μsくらいです。

 

 その周波数に合わせてPWM出力を調整します。

サーボモータを制御するソースです▼

int main ( void ) {
  CLKDIV = 0x0000;                        /*クロックをPLL prescaler (1:1)で使用 32MHz*/
  PPSOutput(PPS_RP0, PPS_OC1);            /*Assing OC1 to pin RP0*/
  OpenTimer5(T5_ON | T5_PS_1_8 , 0x4e20); /*Timer is configured for 10.00ms(100Hz)*/
  penOC1(OC_IDLE_CON | OC_TIMER5_SRC | OC_PWM_EDGE_ALIGN , OC_SYNC_TRIG_IN_TMR5, 0, 0);

  SetDCOC1PWM(0xc9a, 0);

}

int bt_spp_recive_callback(uint16_t channel, uint8_t *packet, uint16_t size) {
  ch1[0]   = *(packet + 4);
  ch1[1]   = *(packet + 5);
  ch1[2]   = 0x00;
  ch1_Duty = atoi(ch1);

  if (ch1_Duty == 0) {
    SetDCOC1PWM(0xc9a, 0);
  }
  if (ch1_Duty > 0) {
    SetDCOC1PWM(0xc9a + (0x600 / 40) * (ch1_Duty), 0);
  }
  if (ch1_Duty < 0) {
    ch1_Duty = ch1_Duty * -1;
    SetDCOC1PWM(0xc9a - (0x600 / 40) * (ch1_Duty), 0);
  }
}

 ソースはサーボモータ制御に関する記述の抜粋です。まずmain()でPWM出力の設定をしています。

 

 timer5を使用してプリスケーラは「8」、timerカウントは0x4e20でPWM周期は10ms(100Hz)にしてます。

 

<スポンサーリンク>

初期PWM出力はduty比を0xc9aで約1613μsにしてサーボをニュートラル位置にしています。

 

サーボ制御ですが、int bt_spp_recive_callback()内で実施してます。これはBluetoothでパケット受信したときに処理する関数ですが、今回は自作のスマホアプリからサーボを制御しているためこの関数になってます。

 

サーボ制御部分はif (ch1_Duty == 0)から以下の部分です。ch1_Dutyの値によりサーボを制御してます。ch1_Dutyには-40~+40の値が入ります。このソースはBluetoothからの情報で動かしてますが使い方に合わせて変更しましょう。

 ch1_Dutyの値によりPWMのDuty比を操作して845μs~2381μsの間で制御してます。これで簡単にサーボを±90°で制御できます。PIC24FのPWM使い方はこちらから

 

Pocket

<スポンサーリンク>


この投稿へのコメント

コメントはありません。

コメントを残す

メールアドレスが公開されることはありません。

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL