PWM.MOT PIN, CHAN, SPEED, RAMP, NSTEPS, DIR
PIN= uguale a PWM
CHAN= uguale a PWM
SPEED= massima velocità raggiunta dalla RAMP
RAMP= incremento della rampa sia in accell che in decell Es 3 somma o sottrae 3 alla rampa partendo da 3
NSTEPS= quanti step deve eseguire in totale. Ogni step esegue una chiamata d'interrupt ad una label
DIR= 0 va avanti 1 va indietro
la preparazione dei parametri può essere fatta in un DO-LOOP senza problemi.
Nell'esempio allegato, ci sarebbe già tutto.
Il sistema dovrebbe supportare almeno 3 moduli.
Lo speed dovrebbe arrivare almeno a 500Hz
Code: [Local Link Removed for Guests]
STEP1=2
DIR1=4
INTERRUPT1=15
STEP2=5
DIR2=19
INTERRUPT2=18
STEP3=23
DIR3=1
INTERRUPT3=3
PIN.MODE STEP1, OUTPUT
PIN.MODE DIR1, OUTPUT
PIN.MODE INTERRUPT1,INPUT
PIN.MODE STEP2,OUTPUT
PIN.MODE DIR2,INPUT
PIN.MODE INTERRUPT2,INPUT
PIN.MODE STEP3, OUTPUT
PIN.MODE DIR3, OUTPUT
PIN.MODE INTERRUPT3, INPUT
MAXPOS=5
DIM POSITIONX(MAXPOS)=0,400,0,400,0,400
DIM SPEEDX(MAXPOS)=0,0,0,0,0,0
DIM POSITIONY(MAXPOS)=0,200,0,400,0,400
DIM SPEEDY(MAXPOS)=0,0,0,0,0,0
DIM POSITIONZ(MAXPOS)=0,400,0,400,0,400
DIM SPEEDZ(MAXPOS)=0,0,0,0,0,0
SPEED=50
SLOW=1
MED=3
FAST=5
RAMP=MED
RAMP1=1
RAMP2=1
RAMP3=1
DEST1=0
DEST2=0
DEST3=0
FOR N= 0 TO MAXPOS
DIFF_POS=0
OLD_N=N-1
IF N=0 THEN OLD_N=MAXPOS
DIFFX=ABS(POSITIONX(N)-POSITIONX(OLD_N))
IF DIFF_POS < DIFFX THEN DIFF_POS = DIFFX
DIFFY=ABS(POSITIONY(N)-POSITIONY(OLD_N))
IF DIFF_POS < DIFFY THEN DIFF_POS =DIFFY
DIFFZ=ABS(POSITIONZ(N)-POSITIONZ(OLD_N))
IF DIFF_POS < DIFFZ THEN DIFF_POS = DIFFZ
SPEEDX(N)=((DIFFX/DIFF_POS)*SPEED)
SPEEDY(N)=((DIFFY/DIFF_POS)*SPEED)
SPEEDZ(N)=((DIFFZ/DIFF_POS)*SPEED)
NEXT N
COUNT1=MAXPOS '5
interrupt INTERRUPT1, CHANGE_OUTPUT1
interrupt INTERRUPT2, CHANGE_OUTPUT2
interrupt INTERRUPT3, CHANGE_OUTPUT3
DO
POS1=0
POS2=0
POS3=0
PIN(DIR1)=1
DEST1=POSITIONX(COUNT1)
DEST2=POSITIONY(COUNT1)
DEST3=POSITIONZ(COUNT1)
COUNT1=COUNT1+1
IF COUNT1>MAXPOS THEN COUNT1=0
RAMP1=RAMP
INC1=RAMP
IF DEST1<POSITIONX(COUNT1) THEN
DEST1=POSITIONX(COUNT1)-DEST1
PIN (DIR1)=0
ELSE
DEST1=DEST1-POSITIONX(COUNT1)
PIN(DIR1)=1
ENDIF
RAMP2=RAMP
INC2=RAMP
IF DEST2<POSITIONY(COUNT1) THEN
DEST2=POSITIONY(COUNT1)-DEST2
PIN (DIR2)=0
ELSE
DEST2=DEST2-POSITIONY(COUNT1)
PIN(DIR2)=1
ENDIF
RAMP3=RAMP
INC3=RAMP
IF DEST3<POSITIONZ(COUNT1) THEN
DEST3=POSITIONZ(COUNT1)-DEST3
PIN (DIR3)=0
ELSE
DEST3=DEST3-POSITIONZ(COUNT1)
PIN(DIR3)=1
ENDIF
PWM.SETUP step1, 1, 64 ,RAMP1, 8
PWM.SETUP step2, 2, 64 ,RAMP2, 8
PWM.SETUP step3, 3, 64 ,RAMP3, 8
START=3
ASPETTA:
IF START> 0 THEN GOTO ASPETTA
LOOP
CHANGE_OUTPUT1:
IF PIN (INTERRUPT1)=0 THEN RETURN
IF POS1=DEST1 THEN PWM.SETUP STEP1 , OFF :START=START-1:RETURN
POS1=POS1+1
IF (POS1*INC1)<SPEEDX(COUNT1) THEN RAMP1=RAMP1+INC1
IF (DEST1-POS1)*INC1 < SPEEDX(COUNT1) THEN RAMP1=RAMP1-INC1
PWM.SETUP step1, 1, 64 ,RAMP1, 8
RETURN
CHANGE_OUTPUT2:
IF PIN (INTERRUPT2)=0 THEN RETURN
IF POS2=DEST2 THEN PWM.SETUP STEP2, OFF :START=START-1:RETURN
POS2=POS2+1
IF (POS2*INC2)<SPEEDY(COUNT1) THEN RAMP2=RAMP2+INC2
IF (DEST2-POS2)*INC2 < SPEEDY(COUNT1) THEN RAMP2=RAMP2-INC2
PWM.SETUP step2, 2, 64 ,RAMP2, 8
RETURN
CHANGE_OUTPUT3:
IF PIN (INTERRUPT3)=0 THEN RETURN
IF POS3=DEST3 THEN PWM.SETUP STEP3, OFF:START=START-1:RETURN
POS3=POS3+1
IF (POS3*INC3)<SPEEDZ(COUNT1) THEN RAMP3=RAMP3+INC3
IF (DEST3-POS3)*INC3 < SPEEDZ(COUNT1) THEN RAMP3=RAMP3-INC3
PWM.SETUP step3, 3, 64 ,RAMP3, 8
RETURN
END