目次>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 ; =========================== ここまで ===============================