PWM INTERRUPTS

Recurrent H/W and software problems
Post Reply
charlie
Posts: 39
Joined: Thu Jul 28, 2022 11:36 am
Location: MANTOVA ITALY
Been thanked: 3 times
Contact:

PWM INTERRUPTS

Post by charlie »

Salve a tutti, ho scritto un software in basic per far girare 3 Stepper Motor utilizzando 3 driver DRV8825. Questi richiedono solo lo step di avanzamento e la direzione. Producono un'onda molto silenziosa e priva di risonanze. Il software calcola anche le velocità dei motori così da impiegare lo stesso tempo ad arrivare a destinazione pur partendo da distanze diverse. Ho usato 3 uscite PWM alle quali ho collegato 3 pin interrupt. Il problema sta nel fatto che non riesco mai a fare funzionare contemporaneamente i tre motori. Sembra che annex32 supporti non più di 2 PWM+INTERRUPT nello stesso istante. Allego il file. Se a qualcuno è capitato lo stesso problema... Grazie in anticipo

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
You do not have the required permissions to view the files attached to this post.
Post Reply