new PWM module

Give it a try, it costs you nothing !
Post Reply
charlie
Posts: 39
Joined: Thu Jul 28, 2022 11:36 am
Location: MANTOVA ITALY
Been thanked: 3 times
Contact:

new PWM module

Post by charlie »

Ciao, sono qui a proporre un nuovo tipo di PWM per poter pilotare i driver DRV8825. Ecco un esempio

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
You do not have the required permissions to view the files attached to this post.
User avatar
cicciocb
Site Admin
Posts: 1900
Joined: Mon Feb 03, 2020 1:15 pm
Location: Toulouse
Has thanked: 407 times
Been thanked: 1271 times
Contact:

Re: new PWM module

Post by cicciocb »

La migliore strategia é di implementare una libreria adatta a questa applicazione, tipo questa
https://github.com/laurb9/StepperDriver

Utilizzare gli interrupt usando il PWM, non credo sia realmente una soluzione.
charlie
Posts: 39
Joined: Thu Jul 28, 2022 11:36 am
Location: MANTOVA ITALY
Been thanked: 3 times
Contact:

Re: new PWM module

Post by charlie »

Ciao CiccioCb, capisco ma intendevo rimanere nello stile di Annex32. Se dai un'occhiata all'allegato vedi subito quante poche istruzioni sono necessarie nella call di ciascun motore.

Saluti,
Charlie,
User avatar
cicciocb
Site Admin
Posts: 1900
Joined: Mon Feb 03, 2020 1:15 pm
Location: Toulouse
Has thanked: 407 times
Been thanked: 1271 times
Contact:

Re: new PWM module

Post by cicciocb »

Integrare una libreria non é un problema, é proprio questa la forza di Annex, semplificare quanto più possibile.

Utilizzare gli interrupt, considerando tutta l'attività gestita dal sistema operativo, non garantisce che sia real time.
Ecco perché questo tipo di attività deve essere fatto a livello C/C++ usando veri interrupts oppure usando i vari H/W moduli che l'ESP32 include (per esempio, il pulse counter).
charlie
Posts: 39
Joined: Thu Jul 28, 2022 11:36 am
Location: MANTOVA ITALY
Been thanked: 3 times
Contact:

Re: new PWM module

Post by charlie »

Per me le opzioni non devono essere molte, Ad esempio il settaggio dei microstep è già hardware. Se un domani tu intendessi Implementarlo.
Usare il PULSE è stato il mio primo pensiero ma devi contare gli impulsi comunque. Poi qualsiasi sistema usato dovrebbe comandare almeno 3 motori X,Y,Z.Pulse è previsto per due.
charlie
Posts: 39
Joined: Thu Jul 28, 2022 11:36 am
Location: MANTOVA ITALY
Been thanked: 3 times
Contact:

Re: new PWM module

Post by charlie »

Per me le opzioni non devono essere molte, Ad esempio il settaggio dei microstep è già hardware. Se un domani tu intendessi Implementarlo.
Usare il PULSE è stato il mio primo pensiero ma devi contare gli impulsi comunque. Poi qualsiasi sistema usato dovrebbe comandare almeno 3 motori X,Y,Z.Pulse è previsto per due.
User avatar
cicciocb
Site Admin
Posts: 1900
Joined: Mon Feb 03, 2020 1:15 pm
Location: Toulouse
Has thanked: 407 times
Been thanked: 1271 times
Contact:

Re: new PWM module

Post by cicciocb »

In effetti mùi riferivo al modulo PCNT che esiste all'interno dell'ESP32.
SI tratta di un modulo che conta gli impulsi e puo' essere utilizzato per encoders, misurare frequenze eccetera.

A proposito, hai visto questo semplice esempio che avevo fatto sul simulatore wokwi ?

https://wokwi.com/projects/343314500981621331
charlie
Posts: 39
Joined: Thu Jul 28, 2022 11:36 am
Location: MANTOVA ITALY
Been thanked: 3 times
Contact:

Re: new PWM module

Post by charlie »

Ciao, qualsiasi idea che tu ritenga più adatta va bene. Bella l'applicazione che hai creato!
charlie
Posts: 39
Joined: Thu Jul 28, 2022 11:36 am
Location: MANTOVA ITALY
Been thanked: 3 times
Contact:

Re: new PWM module

Post by charlie »

Scusa, cimenticavo, in un altro post chiedevo se il sistema rendeva possibile gestire più di due PWM e DUE interrupt collegati insieme . Con tre, sembra non funzionare...

Charlie.
Post Reply