今回は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使い方はこちらから
コメント