dsPIC リアルタイム制御
FRONT PAGE

コレは何?/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から出力される方形波を観測し,
ソースコードの赤線の部分 の周期レジスタの設定のところを調整します。







- 119853 -

研究室の横の倉庫 - Side Warehouse of Laboratory
Copyright(C), Side Warehouse, All rights reserved.