J105 STMC
The following is a complete demonstration of how to use the STMC. Because it is written as a demonstration, it is considerably longer than you will require in any particular application. Connection detaiIs for an RS stepper motor stock number 332-082 are given in Appendix B. If you use this motor, typical pull-in and maximum speeds are 60 and 600 steps/sec respectively, depending on load and supply voltage.
10 PRINT"DEMONSTRATION OF STEPPER MOTOR CONTROL" 15 REM DATA PORT IS AT 3B0 HEX, AS IN MANUAL 20 DP=3*256+11*16: REM ADDRESS OF DATA PORT 30 CSP=DP+1: REM ADDRESS OF CONTROL/STATUS PORT 40 IOP=DP+2: REM ADDRESS OF I/O PORT 50 NT=16:REM NO INTERRUPTS AT END OF COMMAND 100 REM INITIALISATION COMMAND 110 IC=8+2.REM DO NOT SWITCH OUTPUT, INTERNAL CLOCK, 120 REM POSITIVE MOTOR DRIVE,FULL-STEP MODE,4 PHASE 130 CK=12500:REM INTERNAL CLOCK FREQUENCY 190 REM 200 INPUT "ENTER THE PULL-IN RATE ";X 210 B(1)=CK/X 220 IF B(1)>255 THEN PRINT"TOO SLOW":GOTO 200 230 IF B(1)<5 THEN PRINT"TOO FAST":GOTO 200 240 REM 250 INPUT "ENTER THE MAXIMUM SPEED ";X 260 B(2)=CK/X 270 IF B(2)>255 THEN PRINT "TOO SLOW":GOTO 250 280 IF B(2)<5 THEN PRINT "TOO FAST":GOTO 250 290 REM 300 INPUT "ENTER THE NUMBER OF ACCEL/DECEL PULSES";X 310 B(4)=INT(X/256) 320 B(3)=X-B(4)*256 350 N=4:CM=IC:GOSUB 10000: REM SEND INIT COMMAND 360 REM WITH 4 BYTES OF DATA 500 REM INSERT SCREEN CLEAR CODE HERE, IF YOU LIKE 505 PRINT 510 PRINT "** COMMAND MENU **" 520 PRINT:PRINT 530 PRINT"ENTER ONE OF THE FOLLOWING 535 PRINT 540 PRINT"O - EMERGENCY STOP" 550 PRINT"1 - DECELERATING STOP" 560 PRINT"2 - SINGLE STEP" 570 PRINT"3 - ACCELERATION/DECELERATION" 580 PRINT"4 - CONSTANT SPEED OPERATION" 590 PRINT"5 - MOVE TO LIMIT SWITCH AT CONSTANT SPEED" 600 PRINT"6 - MOVE TO LIMIT SWITCH WITH ACCEL/DECEL" 610 PRINT"7 - MOVE TO REFERENCE POINT" 620 PRINT"8 - REINITIALISE PARAMETERS" 630 PRINT"9 - I/O PORT OPERATIONS" 635 PRINT"1O - READ FINISH STATUS" 640 PRINT 650 INPUT "ENTER 0 TO 10";CO 660 IF CO=8 GOTO 100 700 ON CO+1 GOSUB 900,1OOO,2000,3000,4000,5000,6000,7000,8000,9000,9500 710 GOTO 500 900 REM EMERGENCY STOP 920 REM SAME AS 1000 REM DECELERATING STOP 1010 N=0:CM=64+NT+CO 1012 GOSUB 11025 1014 OUT CSP,CM:REM SEND COMMAND AFTER STATUS CHECK 1020 GOSUB 20000:REM GET FINISH STATUS 1030 RETURN 1050 REM 2000 REM SINGLE STEP 2010 GOSUB 21000:REM CW OR CCW? CC=1 IS CCW 2020 N=0 : CM=64+NT+CC+CO : GOSUB 10000 2025 GOSUB 20000 2030 RETURN 2050 REM 3000 REM ACCEL AND DECEL 3010 INPUT "ENTER NUMBER OF STEPS TO MOVE (1 TO 65536)";X 3020 REM WE LOSE ACCURACY IN BASIC IF NOT INTEGERS 3025 X=X-1 3030 B(3)=0 3040 B(2)=INT(X/256) 3050 B(1)=X-B(2)*256 3055 GOSUB 21000 3060 N=3: CM=64+NT+CC+CO : GOSUB 10000 3080 RETURN 3090 REM 4000 REM CONSTANT SPEED OPERATION 4010 INPUT "ENTER STEP RATE";X 4020 B(1)=CK/X 4030 IF B(1)>255 THEN PRINT" TOO SLOW":GOTO 4010 4040 IF B(1)<5 THEN PRINT" TOO FAST":GOTO 4010 4050 INPUT "ENTER NUMBER OF STEPS TO MOVE (1 TO 65536)";X 4055 X=X-1 4060 B(4)=0 4070 B(3)=INT(X/256) 4080 B(2)=X-B(3)*256 4085 GOSUB 21000 4090 N=4 : CM=64+NT+CC+CO : GOSUB 10000 4110 RETURN 4120 REM 5000 REM MOVE TO LIMIT AT CONSTANT SPEED 5010 INPUT "ENTER STEP RATE";X 5015 B(1)=CK/X 5020 IF B(1)>255 THEN PRINT"TOO SLOW":GOTO 5010 5030 IF B(1)< 5 THEN PRINT"TOO FAST":GOTO 5010 5035 GOSUB 21000 5040 N=1 :CM=64+NT+CC+CO:GOSUB 10000 5060 RETURN 5070 REM 6000 REM MOVE TO LIMIT WITH ACCEL/DECEL 6005 GOSUB 21000 6010 N=0 : CM=64+NT+CC+CO : GOSUB 10000 6030 RETURN 7000 REM MOVE TO REFERENCE POINT 7010 INPUT "ENTER STEP RATE";X 7020 B(1)=CK/X 7030 IF B(1)>255 THEN PRINT"TOO SLOW":GOTO 7010 7040 IF B(1)<5 THEN PRINT"TOO FAST":GOTO 7010 7045 GOSUB 21000 7050 N=1 :CM=64+NT+CC+CO:GOSUB 10000 7070 RETURN 8000 REM REINITIALISE 8010 REM THIS IS A DUMMY-SEE LINE 660 9000 PRINT:PRINT"I/O PORT OPERATIONS" 9010 INPUT "ENTER 1 FOR INPUT OR 0 FOR OUTPUT";X 9020 IF X=0 GOTO 9200 9030 PRINT"HIT A KEY TO RETURN TO MAIN MENU" 9035 X=INP(IOP):Y=X 9040 PRINT"INPUT PORT=";:GOSUB 22000 9050 PRINT" BINARY, DECIMAL=";Y; 9060 PRINTCHR$(13); 9070 IF KBD=0 GOTO 9035 9080 RETURN 9200 PRINT"ENTER A NEGATIVE NUMBER TO RETURN TO MAIN MENU" 9210 INPUT "ENTER THE VALUE (DECIMAL) ";X 9220 IF X<O THEN RETURN 9230 OUT IOP,X 9240 GOTO 9210 9500 REM READ FINISH STATUS 9510 GOTO 20000 10000 REM SEND COMMAND WITH N BYTES OF DATA 10005 REM IN ARRAY B0 10010 GOSUB 11OO0:REM CHECK STATUS 10020 OUT CSP,CM 10030 IF N=0 THEN RETURN 10040 FOR 1= 1 TO N 10050 GOSUB 11000 10060 OUT DP,B(I) 10070 NEXT I 10080 RETURN 10500 REM READS DATA BACK 10510 GOSUB 11000:REM SEE IF MOTOR STOPPED 10520 OUT CSP,CM 10530 FOR 1=1 TO N 10540 IF (INP(CSP) AND 1)=0 GOTO 10540:REM CHECK DATA READY 10550 B(I)=INP(DP) 10555 NEXT I 10560 RETURN 11000 REM CHECK STATUS 11005 REM CHECK IF MOTOR IS RUNNING 11010 X=INP(CSP) 11020 IF (X AND 4)=4 GOTO 11010 11025 REM CHECK IF INPUT BUFFER IS FULL 11030 X=INP(CSP) 11040 IF (X AND 2)=2 GOTO 11030 11050 RETURN 20000 REM GET FINISH STATUS 20005 N=1 20010 CM=128:GOSUB 10500 20015 PRINT"FINISH STATUS="; 20017 X=B(1):GOSUB 22000 20019 CM=128+1:N=1:GOSUB 10500 20020 PRINT"INPUTS ARE "; 20021 X=B(1):GOSUB 22000 20030 CM=128+2:N=1:GOSUB 10500 20035 PRINT 20040 PRINT"OUTPUTS ARE "; 20050 X=B(1):GOSUB 22000 20060 CM=128+3:N=3:GOSUB 10500 20070 PRINT" STEPS LEFT="; 20080 PRINTB(3)*256*256+B(2)*256+B(1) 20090 RETURN 21000 REM GET CCW OR CW 21010 INPUT "CCW (1) OR CW (O)";CC 21020 IF CC=1 OR CC<O THEN GOTO 21010 21025 CC=8*CC 21030 RETURN 22000 REM CONVERTS X INTO BINARY AND PRINTS IT 22010 FOR J=7 TO 0 STEP -1 22015 K=0 22020 IF X>2**J THEN X=X-2**J:K=1 22030 PRINT K; 22040 NEXT J 22050 RETURN