2.4GHz版プロポ作製-PPM信号制御編(改)


送信モジュールTx1-Jのジョイスティックは実装不良の様で正常動作しませんでしたが、PPM信号を入力する事で無事に、受信モジュールRx31を制御できるになりました。

※回転ボリュームがスロットル。スライドボリュームがステアリング。


イロイロと嵌った事柄があるのですが、PPM信号出力プログラムの改良点についてカキコします。

まずは、Txに入力するPPM信号のポラリティです。

当初はHパルスでしたが正常に動作せず、悩んだ挙句に反転したらあっさり動きました。
ラジコンの世界では常識なのかも?


次に、USBの通信でPPM信号が乱される問題。

USBケーブルでPCに繋いで、PC側からPPMの各チャンネルのパルス幅を制御してみたり、PICに繋いだボリューム値をPCでモニターしていると、PPMのパルス幅が時々乱れる。
で、受信モジュールに繋いだサーボも微妙に右へ左へとブレて止まらない。

PIC側のUSB処理を停止して、PCからのバスパワー供給だけならPPM信号も安定してる。

やはり、PCから常時死活チェックが飛んでくる為、PPM信号を生成している割り込み処理が遅れるのが問題の様です。

そこで、USB処理を低位優先割り込みに、PPM生成用のCCP割り込みを高位優先の割り込みに書き換え。

●割り込み関数のUSBDeviceTasks()とPPM_int()を入れ替え。


//These are your actual interrupt handling routines.
#pragma interrupt YourHighPriorityISRCode
void YourHighPriorityISRCode()
{
//        USBDeviceTasks();
PPM_int();

} //This return will be a "retfie fast", since this is in a #pragma interrupt section
#pragma interruptlow YourLowPriorityISRCode
void YourLowPriorityISRCode()
{
        USBDeviceTasks();
// PPM_int();

} //This return will be a "retfie", since this is in a #pragma interruptlow section

●PPMのフレーム生成に使用しているTimer1を高位優先の割り込みに変更

//    IPR1bits.TMR1IP = 0;     // 低位割込みにセット
    IPR1bits.TMR1IP = 1;     // 高位割込みにセット

●PPMパルス生成に使用しているCCPも高位優先の割り込みに変更

//    IPR1bits.CCP1IP = 0;     // 低位割込みにセット
    IPR1bits.CCP1IP = 1;     // 高位割込みにセット

●USBの割り込みを低位優先の割り込みに変更

コードを探し出すのに苦労しましたが、usb_hal_pic18.h の中に記述がありました。

USB_INTERRUPT_LOWを定義すれば低位優先、未定義なら高位優先となる様に変更。

//STALLIE, IDLEIE, TRNIE, and URSTIE are all enabled by default and are required
//change by 777gunslinger
#if defined(USB_INTERRUPT)
#if defined(USB_INTERRUPT_LOW)
  #define USBEnableInterrupts() {RCONbits.IPEN = 1;IPR2bits.USBIP = 0;PIE2bits.USBIE = 1;INTCONbits.GIEL = 1;}
#else
  #define USBEnableInterrupts() {RCONbits.IPEN = 1;IPR2bits.USBIP = 1;PIE2bits.USBIE = 1;INTCONbits.GIEH = 1;}
#endif
#else
    #define USBEnableInterrupts()
#endif

----
usb_config.h 内に、 #define USB_INTERRUPT_LOW と記述すれば低位優先になります。
コメントアウトすれば高位優先です。

これで、ピタリとPPM信号の乱れは無くなりました。 メデタシメデタシ。

コメント

このブログの人気の投稿

ARM用クロスコンパイラのビルド(Windows8+Cygwin)

Raspberry Pi のsleep時間測定

Quartus2 V13.1 ~エントリー編 HDL回路から回路図用シンボルを作成する~