Encoder che comanda motore

Ciao a tutti ragazzi, sono nuovo del forum, e ho appena messo mani per la prima volta su Arduino, approfitto per fare i complimenti un po' a tutti per la vostra preparazione in campo :relaxed:
Devo regolare la velocità di un motore a spazzole comandato da una scheda pwm la quale ha un controllo di velocità mediante potenziometro (il pin centrale fornisce 0-5V su scala 0-100%)
Il mio scopo è quello di mettere arduino al posto del potenziometro (mediante un potenziometro elettronico tipo MC41xxx) e comandare la velocità tramite la velocità di rotazione di un encoder.
Il valore del potenziometro digitale deve variare al variare della velocità di rotazione in senso orario dell'encoder Incrementale (nel mio caso da 500 impulsi giro)
Per ora ho interfacciato l'encoder ad arduino riuscendo a visualizzare sulla seriale i valori ma poi non so come procedere.
Riassumendo a blocchi il mio quesito sarebbe il seguente:

Encoder incrementale
contatore di impulsi orari in 200ms (ho bisogno di un aggiornamento di 5 volte al secondo)
dimensionamento scala ad es 200imp/200ms = 100% (poi lo dimensiono per bene in campo)
comando potenziometro digitale (preferisco utilizzare il potenziometro digitale perchè in automatico otterrei l'isolamento elettrico di arduino dalla scheda di comando) se l'utilizzo del potenziometro digitale mi complica la vita allora vado con un uscita variabile direttamente alla scheda..

Scusate se mi sono dilungato ma è solo per essere chiaro. Grazie a tutti :relaxed:

Il mio scopo è quello di mettere arduino al posto del potenziometro (mediante un potenziometro elettronico tipo MC41xxx) e comandare la velocità tramite la velocità di rotazione di un encoder.
Il valore del potenziometro digitale deve variare al variare della velocità di rotazione in senso orario dell'encoder Incrementale (nel mio caso da 500 impulsi giro)

Oppure un DAC. Però non ho capito se l'encoder è accoppiato all'asse del motore così da ricavare un errore setpoint-currentSpeed per correggere il PWM.

Inoltre arduino può generare PWM (anche se la frequenza è bassina) da 0 a 100%.

PS: non conosco il potenziometro digitale in questione, MC41??.

Ciao.

Potresti accoppiare questo al potenziometro:
Servo a rotazione continua

Chiedo scusa, il codice esatto del potenziometro digitale è MCP41xxx (le tre x indicano il valore in ohm) accetta il comando in digitale su bus SPI con i tre pin CS SCK e SI avente la la risoluzione di 256 step

L'encoder costituisce il comando della velocità del motore che è un 24v 2000w in sostanza il motore ripete cio' che avviene sull'encoder.. ripeto, sono nuovo su arduino datemi qualche dritta

Non so perché non mi è venuta in mente microchip, bastava aggiungere un P, tra l'altro di recente ho cercato potenziometri digitali anche se per uso audio.

Ok, ho riletto e credo di avere capito (quasi), scusa ma per me è una applicazione non usuale.
Mi spiego solitamente si usa l'ecoder applicato all'asse del motore per farlo girare a velocità costante indipendentemente dal carico meccanico.

contatore di impulsi orari in 200ms (ho bisogno di un aggiornamento di 5 volte al secondo)
dimensionamento scala ad es 200imp/200ms = 100% (poi lo dimensiono per bene in campo)

Quindi 1 impulso in 200ms equivale a 1%.

Intanto posta il codice che stai usando per leggere l'encoder così vediamo di accumulare il numero di impulsi ogni 200ms e stamparlo su seriale. Dovrebbe bastare usare millis() che ritorna il tempo in millesimi di secondo da quando arduino è stato alimentato. Se millis() non dovesse bastare c'è anche micros(). Per l'uso di millis() puoi vedere il programma BlinkWithoutDelay.ino tra gli esempi.

PS: le richieste di spiegazioni su millis sono tra le più gettonate.

Ciao.

Si si comprendo, sta volta è un'impiego un po' inusuale.. ora sono sul cell, appena mi metto sul fisso cerco di postare il codice che mi fa funzionare l'encoder, l'ho praticamente copiato da una gentile spiegazione di un grandissimo prof su yt (non so se posso fare il nome) quello che vorrei fare in altre parole non è un sistema retroazionato, arduino non sa effettivamente a quanti giri è il motore, l'encoder sarebbe un po' come una ruota di comando.. quello che ho è di 500 impulsi a rotazione, e quindi si 2 impulsi avvenuti nell'arco di 200msec equilvarrebbero al 2% della scala del potenziometro (ho fatto il calcolo comodo, poi lo dimensiono a dovere) grazie 1000 per l'aiuto :relaxed:

Si si comprendo, sta volta è un'impiego un po' inusuale..

Grazie, vero che sono stanco e rinco tanto che ho pensato pure al servo comando, poi ho letto che l'econder lo giri sempre in un senso e ho escluso il servo. Ora hai chiarito ancora meglio.

Ok aspettiamo il codice che usi anche per vedere quale (se ne usi una) libreria usi per leggere l'encoder.

Ciao.

Ciao, scusate il ritardo, rieccomi qui, allora il codice che utilizzo è questo:

int valore = 0;

void setup()
{pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);

Serial.begin (9600);}

int letturaPrecedente = HIGH;

void loop()
{
int n = digitalRead(3);
if ((letturaPrecedente == HIGH) && (n == LOW))
if (digitalRead(4)) {valore–;}
else {valore++;}
Serial.println(valore);
}

l’ho copiato e incollato (non lo so se è il giusto metodo per postare un codice)

questo codice mi permette di vedere il numero di impulsi crescere e decrescere muovendo in orario e antiorario…

>Audivi: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non avrai sistemato il codice come richiesto, nessuno ti potrà rispondere, quindi ti consiglio di farlo al più presto. :wink: