- Messaggi: 293
- Ringraziamenti ricevuti 29
Robotank piccolo rover
11 Anni 5 Mesi fa #6
da shinshi
Risposta da shinshi al topic Robotank piccolo rover
Ciao,
Bel cingolato, mi farebbe comodo per trasportare la legna.
Comunque che motori hai usato?
Il BEMF che io sappia si usa nei motori brushless, ma è necessaria una certa velocità di rotazione perchè il campo elettromagnetico si possa rilevare correttamente. Comunque ammetto che quello che sò l'ho letto nell'AN970 Microchip.
Saluti
Bel cingolato, mi farebbe comodo per trasportare la legna.
Comunque che motori hai usato?
Il BEMF che io sappia si usa nei motori brushless, ma è necessaria una certa velocità di rotazione perchè il campo elettromagnetico si possa rilevare correttamente. Comunque ammetto che quello che sò l'ho letto nell'AN970 Microchip.
Saluti
Ringraziano per il messaggio: ilas
Si prega Accedi o Crea un account a partecipare alla conversazione.
- shinshi
- Elite Member
Riduci
Di più
11 Anni 5 Mesi fa #7
da ilas
Risposta da ilas al topic Robotank piccolo rover
In rete ho visto molti giocattoli simili al mio.. Sono felice di non essere l'unico matto...
Il controllo bemf è fattibile anche su semplici motori brushed in dc, almeno da quanto ho appreso in questi ultimi anni..
Al momento,se non erro l'unico metodo per fare un controllo bemf senza encoder in un motore dc è quello di interrompere completamente il pwm verso il motore per qualche ms e misurare la tensione generata da esso, questa poi ti serve per leggere l'errore e a sua volta correggerlo. Come? Usando la tecnica detta PID.
Ecco uno pseudo codice copiato pari pari da un manuale di Livio S. Orsini e che a sua volta hanno usato come riferimento(per questo tipo di controllo) i ragazzi di robotitalia un bel po' di anni fa...
L'unica differenza è che nel mio caso non uso l'encoder ma adotto la tecnica descritta prima.
Ovvio che questo tipo di controllo non è idoneo per sistemi dove la precisione è importante, ma per il mio robotank sarebbe+che sufficente.. Le basse velocità entro certi limiti si possono raggiungere con una certa stabilità(dipende da un sacco di fattori anche dal tipo di motore,meccanica ecc, ecc,)
Ecco il pseudocodice
int PID (int val_cons)
{
/*La funzione PID è richiamata dall’interrupt del timer di sistema; la chiamata avviene ogni 10 msec., pertanto z
-1
= 10 msec. La
funzione PID riceve un valore intero che rappresenta il valore diconsegna “val_cons “, la funzione restituisce un valore intero
“DA_conv” che rappresenta il valore di riferimento perl’attuatore.
Le variabili:
float Upper_P_limit, Upper_I_limit, Upper_D_limit, Upper_Total_limit
float Lower_P_limit, Lower _I_limit, Lower _D_limit, Lower _Total_limit
float Kp, Ki, Kd
sono globali; sono introdotte e modificate tramite interfaccia HMI
*/
static int AD_Conv = 0; /*Lettura convertitore A/D: acquisisce la variabile di ingresso*/
static int DA_Conv = 0; /*Scrittura convertitore D/A: scrive la variabile di uscita*/
static int error = 0; /*differenza tra valore di consegna e valore reale */
static int old_error = 0; /*differenza tra valore di consegna e valore reale @ z
-1
*/
float P=0; /* componente proporzionale */
float I=0; /* componente integrale */
float D=0; /* componente differenziale */
float i_inst = 0; /* parte istantanea del processo di integrazione*/
float Out = 0; /* Totale regolazione */
error = val_cons - AD_Conv;
P = error * Kp;
if (P > Upper_P_Limit) P = Upper_P_Limit;
if (P < Lower_P_Limit) P = Lower_P_Limit;
if Ki > 0 {
i_inst = error * Ki;
I = I + i_inst;
if (I > Upper_I_Limit) I = Upper_I_Limit;
if (I < Lower_I_Limit) I = Lower_I_Limit; }
else
I = 0;
if Kd > 0 {
D = Kd * (error – old_error);
old_error = error;
if (D > Upper_D_Limit) D = Upper_D_Limit;
if (D < Lower_D_Limit) D = Lower_D_Limit;}
else
D = 0;
Out = P + I + D;
if ( Out > Upper_Total_limit) Out = Upper_Total_limit;
if (Out < Lower_Total_limit) Out = Lower_Total_limit;
DA_Conv = Out;
Return (DA_Conv);
}
La routine di gestione dell’interrupt, legata alla scadenza del System Timer, che richiama PID sarà simile a:
void RT_G( )
{
static int Out_DA = 0; /*uscita D/A per riferimento)
static int valore_di_consegna = 0;
valore_di_consegna = act_val;
Out_DA = act_ref_val;
act_ref_val = PID(valore_di_consegna);
}
Tempo fà ho testato il tutto ma non sono riuscito ad ottenere i risultati che speravo in termini di stabilità e controllo..
Di sicuro ho fatto qualche errore di ottimizzazione o altro.
In rete ho stracercato qualcuno che ha fatto quello che vorrei io ma al momento l'unico indirizzo che mi ha dato qualche spunto è stato questo www.acroname.com/robotics/info/articles/back-emf/back-emf.html
io però voglio leggere la tensione solo in un ramo del motore(vedi ponte h di potenza a canale N che ho fatto) e so che si può fare..
Qualcuno di voi non si è mai imbattuto in questo tipo di problematica?
Meglio che cambi post o continuo su questo??
Saluti
ilas
Il controllo bemf è fattibile anche su semplici motori brushed in dc, almeno da quanto ho appreso in questi ultimi anni..
Al momento,se non erro l'unico metodo per fare un controllo bemf senza encoder in un motore dc è quello di interrompere completamente il pwm verso il motore per qualche ms e misurare la tensione generata da esso, questa poi ti serve per leggere l'errore e a sua volta correggerlo. Come? Usando la tecnica detta PID.
Ecco uno pseudo codice copiato pari pari da un manuale di Livio S. Orsini e che a sua volta hanno usato come riferimento(per questo tipo di controllo) i ragazzi di robotitalia un bel po' di anni fa...
L'unica differenza è che nel mio caso non uso l'encoder ma adotto la tecnica descritta prima.
Ovvio che questo tipo di controllo non è idoneo per sistemi dove la precisione è importante, ma per il mio robotank sarebbe+che sufficente.. Le basse velocità entro certi limiti si possono raggiungere con una certa stabilità(dipende da un sacco di fattori anche dal tipo di motore,meccanica ecc, ecc,)
Ecco il pseudocodice
int PID (int val_cons)
{
/*La funzione PID è richiamata dall’interrupt del timer di sistema; la chiamata avviene ogni 10 msec., pertanto z
-1
= 10 msec. La
funzione PID riceve un valore intero che rappresenta il valore diconsegna “val_cons “, la funzione restituisce un valore intero
“DA_conv” che rappresenta il valore di riferimento perl’attuatore.
Le variabili:
float Upper_P_limit, Upper_I_limit, Upper_D_limit, Upper_Total_limit
float Lower_P_limit, Lower _I_limit, Lower _D_limit, Lower _Total_limit
float Kp, Ki, Kd
sono globali; sono introdotte e modificate tramite interfaccia HMI
*/
static int AD_Conv = 0; /*Lettura convertitore A/D: acquisisce la variabile di ingresso*/
static int DA_Conv = 0; /*Scrittura convertitore D/A: scrive la variabile di uscita*/
static int error = 0; /*differenza tra valore di consegna e valore reale */
static int old_error = 0; /*differenza tra valore di consegna e valore reale @ z
-1
*/
float P=0; /* componente proporzionale */
float I=0; /* componente integrale */
float D=0; /* componente differenziale */
float i_inst = 0; /* parte istantanea del processo di integrazione*/
float Out = 0; /* Totale regolazione */
error = val_cons - AD_Conv;
P = error * Kp;
if (P > Upper_P_Limit) P = Upper_P_Limit;
if (P < Lower_P_Limit) P = Lower_P_Limit;
if Ki > 0 {
i_inst = error * Ki;
I = I + i_inst;
if (I > Upper_I_Limit) I = Upper_I_Limit;
if (I < Lower_I_Limit) I = Lower_I_Limit; }
else
I = 0;
if Kd > 0 {
D = Kd * (error – old_error);
old_error = error;
if (D > Upper_D_Limit) D = Upper_D_Limit;
if (D < Lower_D_Limit) D = Lower_D_Limit;}
else
D = 0;
Out = P + I + D;
if ( Out > Upper_Total_limit) Out = Upper_Total_limit;
if (Out < Lower_Total_limit) Out = Lower_Total_limit;
DA_Conv = Out;
Return (DA_Conv);
}
La routine di gestione dell’interrupt, legata alla scadenza del System Timer, che richiama PID sarà simile a:
void RT_G( )
{
static int Out_DA = 0; /*uscita D/A per riferimento)
static int valore_di_consegna = 0;
valore_di_consegna = act_val;
Out_DA = act_ref_val;
act_ref_val = PID(valore_di_consegna);
}
Tempo fà ho testato il tutto ma non sono riuscito ad ottenere i risultati che speravo in termini di stabilità e controllo..
Di sicuro ho fatto qualche errore di ottimizzazione o altro.
In rete ho stracercato qualcuno che ha fatto quello che vorrei io ma al momento l'unico indirizzo che mi ha dato qualche spunto è stato questo www.acroname.com/robotics/info/articles/back-emf/back-emf.html
io però voglio leggere la tensione solo in un ramo del motore(vedi ponte h di potenza a canale N che ho fatto) e so che si può fare..
Qualcuno di voi non si è mai imbattuto in questo tipo di problematica?
Meglio che cambi post o continuo su questo??
Saluti
ilas
Si prega Accedi o Crea un account a partecipare alla conversazione.
- ilas
- Autore della discussione
- New Member
Riduci
Di più
- Messaggi: 14
- Ringraziamenti ricevuti 0
11 Anni 5 Mesi fa #8
da shinshi
Risposta da shinshi al topic Robotank piccolo rover
Interessante, non ne ero a conoscenza. seguirò con interesse il tuo progetto.
Facci sapere gli sviluppi.
Grazie
Luca
Facci sapere gli sviluppi.
Grazie
Luca
Si prega Accedi o Crea un account a partecipare alla conversazione.
- shinshi
- Elite Member
Riduci
Di più
- Messaggi: 293
- Ringraziamenti ricevuti 29
11 Anni 5 Mesi fa #9
da ilas
Risposta da ilas al topic Robotank piccolo rover
Devi avere moooooolta pazienza.....
Provo ad aspettare per sapere se qualcuno di voi ha già usato questa tecnica... E magari ha già la soluzione....
Intanto carico le pile.....
Saluti
Provo ad aspettare per sapere se qualcuno di voi ha già usato questa tecnica... E magari ha già la soluzione....
Intanto carico le pile.....
Saluti
Si prega Accedi o Crea un account a partecipare alla conversazione.
- ilas
- Autore della discussione
- New Member
Riduci
Di più
- Messaggi: 14
- Ringraziamenti ricevuti 0
11 Anni 5 Mesi fa #10
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Robotank piccolo rover
Ciao,
hai fatto fare un crash test al passeggino!
La BEMF puo' essere usata anche per motori DC ma certamente e' un metodo grossolano.
Normalmente viene usato in motori BLCD in applicazioni come trapani.
Oltre al PID poi realizzare un sistema di controllo PI o P...
Probabilmente per un sistema grossolano un sistema P (proporzionale) puo' essere sufficiente,
...e ti semplifichi la vita...
Saluti,
Mauro
hai fatto fare un crash test al passeggino!
La BEMF puo' essere usata anche per motori DC ma certamente e' un metodo grossolano.
Normalmente viene usato in motori BLCD in applicazioni come trapani.
Oltre al PID poi realizzare un sistema di controllo PI o P...
Probabilmente per un sistema grossolano un sistema P (proporzionale) puo' essere sufficiente,
...e ti semplifichi la vita...
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.