Conteggio tick motore passo-passo

Buongiorno a tutti
volevo chiedervi un consiglio sul conteggio degli "step" eseguiti da un motore nema17.
In un progetto simile si utilizza un motere DC dotato di encoder magnetico, ma sul mio progetto utilizzando un motore passo-passo dovrei riuscire fare a meno dell'encoder poiché dovrebbe riuscire a non perdere passi.
Il mio progetto di base utilizza il progetto YABR quindi la frequenza degli impulsi è data dal timer configurato a codice OCR2A = 39 (ogni 20us), il singolo passo del nema17 è 1,8° avendo fissato il microstepping sul drv4988 ( MS1=L/MS2=H/MS3=L => 1/4 ), lo step per impulso è 1,8°/4 corretto?
La mia confusione nasce dal fatto che non capisco a pieno il codice YABR utilizzato nella funzione ridefinita per interrupt.

loop{
 throttle_left_motor = Valore definito dal PID controller
}


ISR(TIMER2_COMPA_vect){ 
  //Left motor pulse calculations
  throttle_counter_left_motor ++;                                           //Increase the throttle_counter_left_motor variable by 1 every time this routine is executed
  if(throttle_counter_left_motor > throttle_left_motor_memory){             //If the number of loops is larger then the throttle_left_motor_memory variable
    throttle_counter_left_motor = 0;                                        //Reset the throttle_counter_left_motor variable
    throttle_left_motor_memory = throttle_left_motor;                       //Load the next throttle_left_motor variable
    if(throttle_left_motor_memory < 0){                                     //If the throttle_left_motor_memory is negative
      //PORTD &= 0b11110111;   
      PORTH &= 0b11111100;  //_BV(PH3);                                               //Set output 3 low to reverse the direction of the stepper controller
      throttle_left_motor_memory *= -1;                                     //Invert the throttle_left_motor_memory variable
    }
    else 
      //PORTD |= 0b00001000; 
      PORTH |= 0b00000011; //~_BV(PH3);                                              //Set output 3 high for a forward direction of the stepper motor
  }
  else if(throttle_counter_left_motor == 1)
    PORTH |= 0b00001000; //_BV(PH4);              //Set output 2 high to create a pulse for the stepper controller
  else if(throttle_counter_left_motor == 2)
    PORTH &= 0b11110111; //~_BV(PH4);              //Set output 2 low because the pulse only has to last for 20us 

//....parte di codice uguale per controllo motore destro
  

La domanda è la seguente: per conteggiare i tick (e pubblicarli come messaggio ROS) basta semplicemente verificare la condizione

else if(throttle_counter_left_motor == 1)

mentre la direzione viene determinata da quest'altra condizione

if(throttle_left_motor_memory < 0)

Spero di essere stato chiaro nella domanda??
grazie :slight_smile:

@devillino

Buongiorno,

... so che sei un vecchio utente della sezione Italiana del forum :slight_smile: , ma ... purtroppo non riesco a trovare il tuo post di presentazione :confused:, per cui, cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO di detta sezione, che negli anni è piuttosto cambiato (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE (... quello che vedi in blu è un link, fai click su di esso per raggiungere la discussione) spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

ciao
si hai ragione sorry, ho rimediato subito con molto piacere :slight_smile:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.