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信号の乱れは無くなりました。
メデタシメデタシ。
コメント
コメントを投稿