沼津高専 電子制御工学科 |
||||||
|
||||||
改訂記録 |
||||||
版数 |
作成日 |
作成者 |
承認 |
改訂内容 |
||
A01 |
2007.12.14 |
齋藤・藤田 |
平田 |
初版 |
目次
接続されるステッピングモーターはPORTAの下位4bit(RA3,RA2,RA1,RA0)を0101→0110→1010→1001→0101→…と変化させていくことで右回転を実現し、その逆の変化をさせていくことで左回転を実現する。
右回転、左回転、命令はそれぞれが同時に入ったとしても同時に動くことはない。
FPGAボードないでの回路によって、右回転、左回転、停止の命令が複数競合することが内容になっているので、停止を優先させるような処理は行う必要がない。
ステップモーターはパルス入力が入ると動くので、逆に言えば右か左へ動かすような入力がない限り動かない。よって停止命令による特別な処理はしていない。
以上の使用を満たすように作成したプログラムを以下に示す
INCLUDE"p16F84.inc"
list
p=16F84
STATUS EQU 3
PORTA EQU 5
PORTB EQU 6
TRISA EQU H'85'
TRISB EQU H'86'
Memory EQU 0x0C
OutMode EQU Memory+0
CLRF PORTA
START CALL PortSet
CALL IniSet
STEP1
CHKS BTFSS PORTB,1
GOTO CHKL
GOTO CHKS
CHKL BTFSS PORTB,0
GOTO CHKR
GOTO ROTL
CHKR BTFSS PORTB,2
GOTO CHKS
GOTO ROTR
PortSet BSF STATUS,5 ;ページ切り替え
MOVLW B'00100111'
MOVWF TRISB ;PORTBの入出力設定
MOVLW B'00000000'
MOVWF TRISA ;PORTAを全て出力に設定
BCF STATUS,5 ;ページ切り替え
RETURN
IniSet MOVLW B'00000101'
MOVWF PORTA ;PORTAに初期値を与える
MOVLW B'00000000' ;初期値を0としてOUTMODEに入れる
MOVWF OutMode
RETURN
ROTL INCF OutMode,1
GOTO Rotate
ROTR DECF OutMode,1
Rotate BTFSS OutMode,0 ;OutModeの値判定
GOTO CaseX0
GOTO CaseX1
CaseX0 BTFSS OutMode,1
GOTO Case00
GOTO Case10
CaseX1 BTFSS OutMode,1
GOTO Case01
GOTO Case11
Case00 MOVLW B'00000101'
GOTO Fin
Case01 MOVLW B'00000110'
GOTO Fin
Case10 MOVLW B'00001010'
GOTO Fin
Case11 MOVLW B'00001001'
Fin MOVWF PORTA
WAIT BTFSS PORTB,1
GOTO WAIT
GOTO STEP1
END
以上のプログラムをアセンブリして、pic16f84に書き込んで用いる。
なお、プログラム中のWAITの部分についてであるが、左右の回転命令が来て1ステップ回転させた後、一度STOP命令が来るまで待機する処理である。この処理は、我々のステッピングモーターの回転角制御のためにCPUから送信される回転命令の回数を数える必要があり、そのための対策としてCPUの回転命令は左右どちらかの回転命令のあとSTOP命令を一度はさんで次の回転命令を出すようにしている。例えばLEFT→LEFT→LEFTとCPUが命令を出したとき、PICの入力ポートの値は(FPGAの設計した回路により)何回書き込んでも1から変化しないため、CPUが何回回転命令を出したのか数えることは困難である。そのためLEFT→STOP→LEFT→STOP→LEFT→STOPと命令をCPUが出すことによって左方向に3ステップとカウントしている。