J105 STMC

7. Example Program

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