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