目次>5章 第2ステップ(色々な実験)>ステッピングモータを回す(ユニポーラ型)>ソース
ステッピングモータを回す(スイッチ制御)
更新日2008.5.17
以下のソースを取り込んで、アセンブル→PIC書き込み→実行して下さい。
; ========================== ここから ==============================
; PIC16F84A
; CLOCK : 20MHz
;
; ステッピングモータ(ユニポーラ型)の制御
; (スイッチで回転数と回転方向を切り替える)
;
; RB0〜3:プッシュボタンスイッチ
; RB4〜7:ステッピングモータ
; RB4:X
; RB5:Y
; RB6:^X
; RB7:^Y
;
; TMR0割込み
; プリスケーラ : 16
; TMR0 : フリーラン
; TMR0割込み周期 : 819.2uS
;
LIST P=PIC16F84A
INCLUDE P16F84A.INC
__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
CBLOCK 0Ch
save_st ;STATUSのセーブ
save_w ;W-regのセーブ
interval ;インターバル
interval_i ;インターバル初期値
motor_data ;パルスモータ制御ビット
flag ;処理フラグ
; bit0 : 1ステップ時間経過
; bit1 : 励磁方式(0:1相励磁,1:2相励磁)
; bit2 : 回転方向
; bit3 : 動作状態(0:停止,1:回転中)
; bit4 : sw1状態
; bit5 : sw2状態
; bit6 : sw3状態
; bit7 : sw4状態
cnt20mS ;20mS時間待ちカウンタ
cnt04mS ;0.4mS時間待ちカウンタ
ENDC
f_step EQU 0 ;flag[0]:1ステップ時間経過
f_mag EQU 1 ;flag[1]:励磁方式
f_round EQU 2 ;flag[2]:回転方向
f_stat EQU 3 ;flag[3]:モータ動作状態
f_sw1 EQU 4 ;flag[4]:sw1状態
f_sw2 EQU 5 ;flag[5]:sw2状態
f_sw3 EQU 6 ;flag[6]:sw3状態
f_sw4 EQU 7 ;flag[7]:sw4状態
; ============================================
ORG 0 ;リセットベクタ
GOTO init
; ========= 割り込み処理 (タイマ)=============
ORG 4 ;割込みベクタ
intr
MOVWF save_w ;W-regセーブ
SWAPF STATUS,W
MOVWF save_st ;STATUSレジスタセーブ
BCF INTCON,T0IF ;割込みフラグクリア
DECFSZ interval,F ;ステッピングモータ1ステップ時間経過?
GOTO intr90 ; No
MOVF interval_i,W
MOVWF interval ;インターバル初期値設定
BSF flag,f_step ;1ステップ時間経過
intr90
SWAPF save_st,W
MOVWF STATUS ;STATUSレジスタロード
SWAPF save_w,F
SWAPF save_w,W ;W-regロード
RETFIE ;割込み許可リターン
; ================ 初期処理 ================
init
BSF STATUS,RP0 ;■バンク1に切替え
MOVLW 0Fh ;RB0-3:input,RB4-7:output
MOVWF TRISB
MOVLW 083h ;プリスケーラ:16
MOVWF OPTION_REG
BCF STATUS,RP0 ;■バンク0に切替え
CLRF flag
;0.2uS×256×16×30=24.576mS
MOVLW d'30' ;ステッピングモータ1ステップのカウンタ
MOVWF interval_i ;初期値
MOVWF interval ;現在値
MOVLW 010h ;1相励磁
MOVWF motor_data ;ステッピングモータ制御信号
CLRF TMR0
MOVLW 0A0h ;TMR0割り込みを使用する
MOVWF INTCON
; ================ メイン処理 =========================
main
BTFSC flag,f_step
CALL step_control ;ステッピングモータの制御
BTFSS PORTB,0
CALL sw1_on ;sw1 ONの処理
BTFSS PORTB,1
CALL sw2_on ;sw2 ONの処理
BTFSS PORTB,2
CALL sw3_on ;sw3 ONの処理
BTFSS PORTB,3
CALL sw4_on ;sw4 ONの処理
BTFSC PORTB,0
BCF flag,f_sw1 ;sw1 OFF
BTFSC PORTB,1
BCF flag,f_sw2 ;sw2 OFF
BTFSC PORTB,2
BCF flag,f_sw3 ;sw3 OFF
BTFSC PORTB,3
BCF flag,f_sw4 ;sw4 OFF
GOTO main
; ============ ステッピングモータ制御 ==================
step_control
BCF flag,f_step
BTFSS flag,f_stat ;モータ回転中?
GOTO step_c9 ; No
BTFSC flag,f_round ;正転?
GOTO step_c5 ; No
CALL step_R ;右回転
GOTO step_c8
step_c5
CALL step_L ;左回転
step_c8
MOVLW 0Fh
ANDWF PORTB,W
IORWF motor_data,W
MOVWF PORTB ;ステッピングモータ制御(RB4-7)
step_c9
RETURN
; =========== ステッピングモータ制御(右回転) =========
step_R ;モータ制御ビットを左に回転シフトする
BCF STATUS,C
RLF motor_data,F
BTFSC STATUS,C
BSF motor_data,4
RETURN
; =========== ステッピングモータ制御(左回転) =========
step_L ;モータ制御ビットを右に回転シフトする
BCF STATUS,C
RRF motor_data,F
BTFSC motor_data,3
BSF motor_data,7
BCF motor_data,3
RETURN
; ================ sw1 ONの処理 ========================
sw1_on
BTFSC flag,f_sw1 ;既にON?
GOTO sw1_on_9 ; Yes
CALL wait20mS
BTFSC PORTB,0 ;sw1 ON?
GOTO sw1_on_9 ; No
BSF flag,f_sw1 ;ON
DECF interval_i,F ;1ステップ初期値−1(回転数を上げる)
sw1_on_9
RETURN
; ================ sw2 ONの処理 ========================
sw2_on
BTFSC flag,f_sw2 ;既にON?
GOTO sw2_on_9 ; Yes
CALL wait20mS
BTFSC PORTB,1 ;sw2 ON?
GOTO sw2_on_9 ; No
BSF flag,f_sw2 ;ON
INCF interval_i,F ;1ステップ初期値+1(回転数を下げる)
sw2_on_9
RETURN
; ================ sw3 ONの処理 ========================
sw3_on
BTFSC flag,f_sw3 ;既にON?
GOTO sw3_on_9 ; Yes
CALL wait20mS
BTFSC PORTB,2 ;sw3 ON?
GOTO sw3_on_9 ; No
BSF flag,f_sw3 ;ON
BTFSC flag,f_sw4 ;sw4もON?
GOTO sw3_on_7 ; Yes (sw3,sw4同時押し)
BTFSS flag,f_stat ;モータ回転中?
GOTO sw3_on_5 ; No
BCF flag,f_stat ;モータ停止
GOTO sw3_on_9
sw3_on_5
BCF flag,f_round ;正転
BSF flag,f_stat ;モータ回転開始
GOTO sw3_on_9
sw3_on_7
BTFSS flag,f_mag ;現在は1相励磁
GOTO sw3_on_8 ; Yes
BCF flag,f_mag ;1相励磁に切り替え
MOVLW 010h
MOVWF motor_data
GOTO sw3_on_9
sw3_on_8
BSF flag,f_mag ;2相励磁に切り替え
MOVLW 030h
MOVWF motor_data
sw3_on_9
RETURN
; ================ sw4 ONの処理 ========================
sw4_on
BTFSC flag,f_sw4 ;既にON?
GOTO sw4_on_9 ; Yes
CALL wait20mS
BTFSC PORTB,3 ;sw4 ON?
GOTO sw4_on_9 ; No
BSF flag,f_sw4 ;ON
BTFSC flag,f_sw3 ;sw3もON?
GOTO sw3_on_7 ; Yes (sw3,sw4同時押し)
BTFSS flag,f_stat ;モータ回転中?
GOTO sw4_on_5 ; No
BCF flag,f_stat ;モータ停止
GOTO sw4_on_9
sw4_on_5
BSF flag,f_round ;逆転
BSF flag,f_stat ;モータ回転開始
sw4_on_9
RETURN
; ================ 20mS待つサブルーチン ==================
wait20mS
MOVLW d'50' ; 50(20mS)
MOVWF cnt20mS ; (ループ回数として50をセット)
wait20LP
CALL wait04mS ; 0.4mS待つ
DECFSZ cnt20mS,F ; ループ回数−1して0になったら次の命令をスキップ
GOTO wait20LP
RETURN
; ================ 0.4mS待つサブルーチン =================
wait04mS
MOVLW d'249' ; 249
MOVWF cnt04mS ; (ループ回数として249をセット)
wait04LP
NOP ; 何もせず1サイクル消費
DECFSZ cnt04mS,F ; ループ回数−1して0になったら次の命令をスキップ
GOTO wait04LP
RETURN
END
; =========================== ここまで ===============================