Closing loop controllo motore DC

Buongiorno, vi spiego il mio problema vorrei riuscire a comandare la posizione di un motore DC tramite un encoder nel senso che dato un numero di giri il motore si blocchi a quella determinata posizione, il motore è controllato tramite la motor shield rev3 e la scheda arduino è Arduino mega.
Vi posto il codice scritto da me se qualcuno mi potrebbe dire dove sbaglio e se si può migliorare.
Grazie a tutti.

void StopMotor(){
  int numerogiri1=200;
  int numerogiri2=100;
  
  if(abs(encoderCount)==numerogiri1){
     digitalWrite(9, HIGH);   // Attivazione del brake del motore per il canale A
     digitalWrite(12, LOW);  // Impostazione della direzione “indietro” del motore collegato al canale A
     digitalWrite(9, LOW);    // Disattivazione del brake del motore per il canale A
     analogWrite(3, 255);     // Metà della velocità massima del motore collegato al canale A
     if(encoderCount<=-numerogiri2){   
     digitalWrite(9, HIGH);   // Attivazione del brake del motore per il canale A
     encoderCount=0;
     }
  }
  //Serial.print("counter: ");
  Serial.print(encoderCount);
}

Questa è la funzione che utilizzo con il timertwo interrupts per determinare la posizione del motore.
Il problema è che una volta entrato nell' if non esce più dal ciclo e non riazzera il contatore.

Prima di tutto con analogWrite(3,255) non stai andando a metà della velocità del motore, ma alla massima velocità dato che i valori che puoi assegnare sono da 0 a 255.
Prova a mettere break; sotto a encodercount =0;

ma questo segno "-" (meno) davanti a numerogiri2 è voluto?

if(encoderCount<=-numerogiri2)

toglilo...

Grazie per la risposta, si ho sbagliato ha scrivere il commento!!
Proverò a mettere il break.
Si l’ho messo apposta ma pensandoci è vero è sbagliato avrei dovuto mettere: if(endercount<=0)
Perché probabilmente mi sono spiegato male, il motore per esempio deve fare 168 giri e poi tornare indietro degli stessi giri.

facciamo una cosa... perché mi sembra che ci siano delle equivocità... Prima di tutto quale libreria stai usando per gestire la motorShield V3? non mi sembra che sia la libreria AFMotor...
Da come hai scritto il codice mi sembra che non ti sia ben chiaro come stai gestendo il motore...
Le shield per i motori dc hanno un ponte-h (ic) per gestire velocità e direzione del motore, che ha una sua semplicità di gestione disarmante... Te la spiego brevemente: i motori dc hanno una loro polarità (+ e -) che garantiscono il senso di rotazione in un senso piuttosto che nel senso opposto se opportunamente cablati con + e - di una batteria per farli girare. Detto questo cosa succede se inverti la polarità sulla batteria? Semplice: il motore gira al contrario. Bene... Questi ponte-h fanno proprio questo sulla base di segnali logici, ovvero invertono la polarità del "cablaggio" senza farti invertire i poli fisicamente, e non si fermano qui... Infatti, tramite un pin dedicato, generando un segnale pwm ti permette di gestire anche la velocità di rotazione del motore.

Finita la premessa passiamo ai fatti.
Il nostro ponte h ha bisogno (come detto in precedenza) di segnali logici (+5v, o 0v) per capire come far girare il motore. Supponiamo quindi di collegare pin 3 e pin 4 a questi due ingressi dell'ic (che in modo molto volgare) possiamo supporre siano i nostri 2 poli del motore...
Qui iniziano le prove: metto il 3 in HIGH (simulando il positivo del motore) e il 4 in LOW (simulando il negativo) il motore inizierà a girare in un senso (metti un grande asterisco qui che ci tornerò più tardi)
Ovviamente cambiando il 3 in LOW ed il 4 in HIGH, il motore girerà al contrario.
Ottimo, ho quasi finito. Cosa succede se metto tutti e 2 in HIGH o in LOW?? Semplice, crei il così detto stallo del motore, ovvero il motore non girerà in nessuno dei due sensi, ma offrirà una resistenza alla rotazione manuale... (quello che tu hai chiamato brake che probabilmente intendevi per break).
quindi
3 = HIGH; 4 = LOW; (GIRO A DESTRA AD ESEMPIO)
3 = LOW; 4 = HIGH; (GIRO A SINISTRA)
3 = LOW; 4 = LOW; (STALLO)
3 = HIGH; 4 = HIGH (STALLO)

Dato per scontato che hai compreso questo ritorniamo al grande asterisco segnato prima.
Di fatto in condizione 3 = HIGH e 4 = LOW un ponte H non fa girare il motore nonostante conosca la direzione di rotazione, sai perché??? semplice, non sa a quale velocità farlo girare. Ecco, il pin 5 collegato all'ic il quale pilotato in pwm possiamo dirgli a che velocità farlo girare... oppure possiamo dirgli semplicemente 5 = HIGH (gira al massimo della velocità).
Ecco perchè hai 3 pin diversi per pilotare il motore DC.
Adesso che abbiamo ben chiaro vediamo cosa hai combinato nel codice...
i 2 pin utilizzati per "i poli del motore" sono 9 e 12 da come sembra di intuire.
Cosa hai fatto nel primo if? hai posto il pin 9 HIGH e il pin 12 in LOW (quindi gli hai dato una direzionalità alla rotazione, ma fino a quando non gli dirai a che velocità girare il motore sarà fermo)...
subito dopo rimetti il pin 9 in LOW (quindi 9 e 12 sono in LOW di conseguenza anche se imposti la velocità il motore in è stallo e non girerà)... infatti scrivendo analogWrite(2, 255) il motore in quelle condizioni non girerà mai.
Solo quando si verificherà vero il secondo if il motore inizierà a girare poiché all'interno di quest'ultimo poni il pin 9 in HIGH e dato che il 12 è in LOW e il 3 sta continuando a manda in pwm 255 il ponte H farà girare il motore alla massima velocità disponibile.
Ben comprendi che tutti i tuoi commenti non sono adeguati al codice che stavi scrivendo...
Adesso che hai le nozioni di base, riscrivi il codice con un senso più logico e postalo se hai problemi che continuiamo a sbrogliare nodi...

EDIT: per vedere se hai capito il concetto ti pongo una domanda... ammesso che il motore sta girando a destra alla massima velocità, come lo fermi senza agire sulla polarità del motore??? :smiley:

Vorrei fare un discorso un po più generale.
Un closing loop oltre di avere un trasduttore "encoder" dovrebbe avere un regolatore, di solito un PID.
La cosa è più complicata, non basta solo gestire, pilotare il motore.

Tu nel tuo primo post parli di giri e posizione da mantenere, a me non è ben chiaro cosa vuoi ottenere, un regolatore di giri o un sistema di posizionamento di un asse, macchina. Perché sono approcci diversi, in uno dobbiamo regolare come grandezza il numero di giri, nel secondo caso dobbiamo regolare come grandezza lo spostamento.

Poi mi chiedo, se dovessi fare un sistema di spostamento di un asse, perché non usare un motore passo passo e un loop aperto. Sarebbe più facile ottenendo buoni risultati, perché la volontà di usare un motore dc e encoder??