PS avevo messaggiato a CiccioCb per chiedergli se poteva aggiungere al modulo PWM dei parametri per creare le funzioni presenti nel mio software.
Cosi com'è non supera 30Hz. E' troppo poco se si lavora in microstep. Arriverebbe anche a 300 Hz senza bloccarsi ma si crea un doppio impulso all'interno di quelli "regolari". Solo CiccioCb conosce la struttura delle chiamate per capire cosa succede.
Charlie.
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