コレは何?/What is this?
dsPICを使って,リアルタイム制御をします。
本サイトではアセンブラで行きます。
dsPICのC言語の情報は大量にあるのですが,アセンブラの情報はかなり少ないので,困っている人の助けになれば幸いです。
Cコンパイラは無償で使えても機能制限があるようですが,アセンブラならそんなことを気にする必要はありません。
お金がなければ知恵で勝負です。
ここで紹介するのは,タイマ割り込みと待機ルーチンでリアルタイム性を確保する簡単なコードです。
ダウンロード/Download
dsPICのソースコードは以下からダウンロードできます。
You can download the source code of dsPIC.
realtime.s
MPLAB IDE および dsPIC30F4012 実機上で動作確認済みです。
We confirmed that this source code was normally operated in MPLAB IDE and dsPIC30F4012.
ソースコード/Source code (2012/01/20 より洗練されたコードに修正)
; ; dsPIC30F4012 REAL TIME CONTROL(TIMER INTERRUPT) TEST CODE ; .include "p30f4012.inc" ; 設定 config __FOSC, CSW_FSCM_OFF & EC_PLL16 ; ClockSW OFF, 外部Clock PLL16倍モード config __FWDT, WDT_OFF ; WatchdogTimer OFF config __FBORPOR, PBOR_ON & BORV20 & PWRT_16 & MCLR_EN ; 電源投入時自動リセット有効, 自動停止電圧2.0V, 電源投入タイマ16msec, MCLRピン有効 config __FGS, CODE_PROT_OFF ; CodeProtection OFF ; ルーチン .global __T1Interrupt ; 割り込みルーチン .global __reset ; 初期設定ルーチン ; dsPIC起動開始 .text .org 0x000000 goto __reset ; 起動開始と共に初期設定を行う ; タイマ割り込みベクタ __T1Interrupt: goto T1Interrupt ; 初期設定ルーチン __reset: ; I/Oポート入出力設定 mov #0b0000000000000000,w0 mov w0,TRISB mov #0b0000000000000000,w0 mov w0,TRISC mov #0b0000000000000000,w0 mov w0,TRISD mov #0b0000000000000000,w0 mov w0,TRISE mov #0b0000000000000000,w0 mov w0,TRISF ; タイマ1割り込み設定 clr T1CON ; 制御レジスタ設定 clr TMR1 ; タイマレジスタクリア mov #0x0BB7, w0 ; 周期レジスタの設定 0x0BB7=100μs (120MHz) mov w0, PR1 ; bset IPC0, #T1IP0 ; タイマ1割り込み設定 bclr IPC0, #T1IP1 ; 優先度を bclr IPC0, #T1IP2 ; 最高に設定 bclr IFS0, #T1IF ; タイマ割り込みフラグをクリア bset IEC0, #T1IE ; タイマ割り込みを許可 bset T1CON, #TON ; タイマ1始動 ; タイマ割り込み待機ルーチン ; このルーチンはタイマ割り込みが発生するまで待機するルーチン INT_WAIT: nop goto INT_WAIT ; 主ルーチン先頭に戻る ; タイマ割り込みルーチン T1Interrupt: bclr IEC0, #T1IE ; タイマ割り込みを禁止 call PERIOD ; 周期ルーチン呼び出し bclr IFS0, #T1IF ; タイマ割り込みフラグをリセット bset IEC0, #T1IE ; タイマ割り込みを許可 retfie ; タイマ割り込み終了 ; 周期ルーチン ; このルーチンは100μsごとに実行される。処理は3000step以内に納めること。(120MHz) PERIOD: ; ここに所望の制御コードを書く com.b PORTE ; 100μs毎にPORTEを反転 return .end
解説/Manual
動作は概ね以下の通り。
1.dsPIC起動直後にポート入出力設定とタイマ割り込みの設定を実行するこれで周期ルーチンの処理内容・演算負荷に関わらず,指定した制御周期を守ることができます。
2.待機ルーチンで無限ループに入る
3.タイマ割り込みが掛かったら,4へ
4.周期ルーチン(所望のコードが書いてある)を実行し,2へ戻る
ただし,制御周期以内で終わるようなステップ数にする必要があります。
制御周期の調整/Adjustment of Control Period
正確な制御周期を得るために,実機を使ってパラメータの調整を行います。
上述したソースコードでは,PORTEを制御周期ごとに反転させるようになっています。
オシロスコープでPORTEから出力される方形波を観測し,
ソースコードの赤線の部分 の周期レジスタの設定のところを調整します。
研究室の横の倉庫 - Side Warehouse of Laboratory
Copyright(C), Side Warehouse, All rights reserved.