dsPIC30F4012でQEI設定を行う(エラッタ対策)
dsPIC30F4012のQEI設定を行いました。
データシートは
dsPIC30F4012 In Production
より
ですが、簡素すぎるのでより詳しい情報は
dsPIC30F Family Reference Manual
を参照します。
日本語資料として、
日本語資料www.microchip.co.jp
より
dsPIC33F/PIC24H ファミリ リファレンス マニュアル、セクション 15. 直交エンコーダ インターフェイス(QEI)
も参考になります。
dsPIC30F ファミリ リファレンスマニュアル 高性能デジタルシグナルコントローラー
はDFLTCONレジスタにIMV<1:0>ビットの記述がありません。
資料を参考に
・x4直行モード
・デジタルフィルタなし
・MAXCNTによる位置カウンタのリセット
に設定しました。
テスト動作をしてみると、位置カウンタのロールオーバー/アンダーフロー時に割り込みが発生していません。
コードは単純なのに~と考える事小一時間…
ハードウェア絡みの問題を考えてエラッタを見てみると…
dsPIC30F4011/4012 Family Silicon Errata and Data Sheet Clarification
p11を見ると、
どおりで割り込みが発生しないはずです
MAXCNTを0xFFFFから変更して無事動作しました。
テストコードは以下のとおり。
long poscnt_h = 0; // --- QEIモジュールの初期化 --- void InitalQEI(void) { ADPCFGbits.PCFG4 = 1; // QEAとQEBをデジタル入力ピンに設定 ADPCFGbits.PCFG5 = 1; QEICON = 0; // QEICONレジスタクリア QEICONbits.QEIM = 7; // 直行エンコーダインターフェースモード選択 // 7:x4モード,MAXCNTリセットモード DFLTCON = 0; // DFLTCONレジスタクリア // デジタルフィルタ使用しないので設定なし POSCNT = 0; MAXCNT = 0x7FFF; // 0xFFFFに設定すると割り込み発生しない(エラッタ) IFS2bits.QEIIF = 0; // QEIIFイベント割り込みフラグステータスクリア IPC10bits.QEIIP = 4; // QEIイベント割り込み優先度設定(7~0) IEC2bits.QEIIE = 1; // QEIイベント割り込みイネーブル } // --- QEIイベント割り込み --- void __attribute__((interrupt, shadow, auto_psv)) _QEIInterrupt(void) { if ( QEICONbits.UPDN ) poscnt_h += 0x8000; else poscnt_h -= 0x8000; IFS2bits.QEIIF = 0; } // --- QEI位置カウンタ取得 --- // マクロ実装の場合 // extern long poscnt_h; // #define GetPosition() (poscnt_h | POSCNT) long GetPosition(void) { return (poscnt_h | POSCNT); }