Funzione PID e PIC

« Older   Newer »
  Share  
TheMrLucas
view post Posted on 3/7/2012, 14:21




Salve,
nel poco tempo libero, continuo ancora a divertirmi con i pic, e pensavo di provare a realizzare un piccolo sistemino PID.
Mi sono documentato su vari siti, e o anche trovato un pdf che in modo semplice spiega una funzione PID base.
www.fabbrimarco.com/droboitalia/Le%...D%20facile1.pdf

Quindi, ho preso dal cassettino dei componenti un accelerometro a 3 assi, un servo RC e un pic 12F, giusto per fare i primi test.
L'accelerometro è fissato su una barretta metallica attaccata al perno del servo, che è poi comandato dal pic 12F. Così, uno spostamento del servo mi modifica l'inclinazione dell'accelerometro. Monitorando un solo asse, quello X per esempio, posso sapere se l'accelerometro è parallelo al suolo oppure no, e di conseguenza modificare la posizione del servo per riportare l'accelerometro alla posizione corretta.

Il tutto tramite una funzione PID naturalmente...
Il servo è controllato in pwm, aumentando o diminuendo la parte alta dell'onda quadra posso decidere in che posizione deve stare.
Supponiamo che, con il registro del pwm caricato con "72" il servo stia nella posizione centrale, e che questa posizione centrale sia la posizione in cui l'accelerometro è perfettamente parallelo a terra.

A questo punto, il mio procedimento sarà:
- Acquisisco il dato fornito dall'accelerometro
- calcolo l'errore
- lo inserisco nella parte proporzionale funzione PID
- in base all'uscita della funzione vario la posizione del perno del servo RC

Pero ora sto provando con la sola parte Proporzionale.
Di seguito un pò di codice in C:
CODICE
unsigned int   Kp = 72;
unsigned int   Max_Out = 79, Min_Out = 65;

       //Acquisisco il dato dall'accelerometro
       GO = 1;
       while(GO);
       Acc = ((ADRESL + (ADRESH << 8)));

       //Calcolo dell'errore
       Err = ((Acc*10) / 327);

       //Proporzionale
       Pf = (Kp * Err);

       //Uscita
       Out = ((Pf)/10);

       //Massimi e minimi dell'uscita
       if(Out > Max_Out)
           Out = Max_Out;
       if(Out < Min_Out)
           Out = Min_Out;

       if(Err == 0)
           Kp = Out;

       --> Invio l'uscita alla funzione che regola il PWM


Naturalmente, prima di inviare alla funzione che gestisce il pwm il valore, verifico che non esca dal range consentito dal servo, nel qual caso limito il valore entro il suo range.
Moltiplico e divido per 10 per aumentare la risoluzione nel lavorare i dati.

Veniamo ad un esempio pratico, ma prima qualche dato sull'accelerometro.
In stato di "zero", l'accelerometro mi fornisce 1.6V in uscita, e ha una sensibilità di 800mV/G
Quindi, quando sono su Zero, sul modulo ADC mi ritrovo con:
Risoluzione: Vcc (5) / (2^10) = 0,004882812 V
Valore in Decimale = Vin / Ris. = 1.6/0,004882812 = 327

A questo 327, che indica lo zero dell'accelerometro, dovrà corrispondermi un "72" nella funzione del PWM.
Prendiamo il caso in cui l'accelerometro sia parallelo al suolo:

- Abbiamo in ingresso: Acc = 327
- Err = ((Acc*10) / 327);
- Err = 10 ( 1 nel caso non aumentassi la risoluzione moltiplicando per 10)
// Funzione P
- Pf = (Kp * Err);
- Out = Pf/10
A questo punto, mi pare ovvio che, non avendo 10 come errore, che corrisponde ad un 1, per avere 72 in uscita e mantenere quindi il servo in questa posizione debba avere un Kp di 72, e su Out avrò, giustamente 72.

Ora, non sto a fare anche un esempio nel caso l'accelerometro non sia nella posizione giusta, comunque questa parte di codice funziona perfettamente, il PIC mi mantiene l'accelerometro parallelo al terreno.
Il problema è che è un pò instabile, e non raggiunge quasi mai uno stato di quiete. Quindi ho cercato di inserire anche una parte D e una parte I usando le seguenti formule:
- If = (If +(Ki * Err));
- Df = (Kd * (Err/Err1));
Err1 = Err;
- Out = ((Pf + If + Df)/10);
Ma a questo punto, a meno che non vada su coeficenti Ki e Kd inferiori allo 0, il servo non mi trova più la posizione giusta perchè il valore Out si distacca troppo dal valore in cui vi è lo Zero.

Quindi, arriviamo al problema :P
Probabilmente, ormai sono passati 3 anni dall'ultima volta che ho fatto sistemi, e non mi riesce più di modificare e adeguare le formule per la parte P, I e D per rendere stabile il sistema, o forse procedo in maniera errata nella scelta dei coefficenti...
Insomma, chiedo a voi se avete una qualche linea da seguire per procedere nel progettino, consigli su come procedere e come affrontare il problema, insomma, un vostro parere ^_^
Se poi trovate che i sistemi PID ancora non mi sono abbastanza chiari, se avete link o testi postate pure ^_^

Grazie ^_^


Edited by TheMrLucas - 3/7/2012, 20:57
 
Top
Elemento 38
view post Posted on 3/7/2012, 16:11




Sembra la mia tesina della maturità, avevo fatto un inverted pendulum <3
Però io l'avevo fatto ad operazionali :lol:
Ti linko una AN Microchip, il progetto è un inverted pendulum, ma la teoria del pid in digitale è fatta abbastanza bene (parlo del codice)!
www.microchip.com/stellent/idcplg?I...ppnote=en021807
Avevo un PDF ancora migliore su un sistema in grado di tenere in equilibrio una matita, una cosa spettacolare, solo che non mi ricordo che università l'aveva progettato ><
 
Top
TheMrLucas
view post Posted on 3/7/2012, 20:09




Ciao Elemento38,
Ricordo il tuo inverter pendulum, leggevo in silenzio il thread :P
L'AN964 lo conoscevo già, ma ora che me l'hai linkato ci ridò un occhiata per vedere se m'aiuta ^_^
...
E leggendo, mi pare di capire che le funzioni che usa lui, e quelle che uso io sono pressochè le stesse...
Ma il mio problema rimane sempre nella scelta del valore dei coefficenti :unsure:

Edit. Mi pare di capire che loro arrivino ai coefficenti per tentativi...
Aumentando prima P, poi I ed infine D... O.o
 
Top
Elemento 38
view post Posted on 3/7/2012, 20:18




Per i coefficienti ci sono le regole di Ziegler-Nichols .... ma andare per tentativi funziona sempre xD
Il mio progetto non trovava nemmeno lui la posizione di stabile sempre, ma perché la parte meccanica non era delle migliori ...
EDIT: trovato www.lsr.ei.tum.de/fileadmin/publica...09-JConradt.pdf ho scelto di studiare elettronica per cose come questa ahah
 
Top
TheMrLucas
view post Posted on 3/7/2012, 21:01




Tenere in piedi una matita :o:
Con microprocessore a 32bit con clock a 64Mhz :o:

Io volavo più basso, pensavo a qualcosa del genere dopo aver fatto pratica con i sistemi PID:
www.youtube.com/watch?v=FBy_e4yvqhQ
Anche perchè il touch ce l'ho, e leggo già senza problemi le coordinate...
Infatti l'ho già usato per farmi un pannellino con vari comandi...
Sotto il touch un foglio con evidenziate le zone dei tasti o dei "potenziometri virtuali" e andando a premere in quelle zone il pic fa il suo lavoro :P

Per tentativi...ok si può fare, mi metto 3 potenziometri anch'io e mando il pic in debug, così controllo anche i valori nel quale il sistema resta stabile.
Secondo te, mi conviene avere dei coefficenti con o senza decimali?
Perchè, prendiamo l'esempio di prima con Kp = 72, e mettiamo un Ki di 2, e mettiamo anche un errore, quindi l'accelerometro invece di 327 mi da 325.

1) Solo P
- Abbiamo in ingresso: Acc = 325
- Err = ((Acc*10) / 327);
- Err = 9.93
// Funzione P
- Pf = ((Kp * Err)/10);
- Pf = 71.4
La funzione che gestisce il PWM caricherà il valore 71

2) P e I
- Abbiamo in ingresso: Acc = 325
- Err = ((Acc*10) / 327);
- Err = 9.93
// Funzione P
- Pf = ((Kp * Err)/10);
- Pf = 71.4
//Funzione I, nel caso in cui prima If fosse 0
- If = ((If +(Ki * Err))/10);
- If = 1.98
- Out = Pf + If = 73.3
La funzione PWM caricherà il valore 73.

Che in un range del servo che va da 65 a 79, non è poca la differenza dal 71 della sola parte P.
A mio avviso, già con un Ki = 2 il sistema mi diventa più instabile che stabile...
e, nel caso in cui il servo sia nella posizione Zero, con 327 in ingresso sul pic, la parte I mi da 2, sempre avendo come If pari a zero prima di procedere al calcolo.
Out = Pf + If = 72 + 2 = 74
e l'accelerometro non sta nella posizione Zero.

Quindi, parto con un Ki di 0.01 e da li salgo?
Idem per Kd.
 
Top
Elemento 38
view post Posted on 4/7/2012, 06:52




CITAZIONE
Tenere in piedi una matita
Con microprocessore a 32bit con clock a 64Mhz

Era solo per fare vedere un'applicazione spettacolare ** E solo le "fotocamere" sono 1500$, quindi ... :lol:
CITAZIONE
Io volavo più basso, pensavo a qualcosa del genere dopo aver fatto pratica con i sistemi PID:
www.youtube.com/watch?v=FBy_e4yvqhQ
Anche perchè il touch ce l'ho, e leggo già senza problemi le coordinate...
Infatti l'ho già usato per farmi un pannellino con vari comandi...

Bellissimo il ball&plate, me lo ero guardato quando lavoravo alla tesina :) C'è solo un problema con quello: se mi ricordo bene il sistema viene controllato da un PID non lineare, o peggio ancora da un controllo ad hoc. Mi pare usassero una scheda con non so che controllore, comandata da un programma Scilab.
CITAZIONE
Secondo te, mi conviene avere dei coefficenti con o senza decimali?

Dipende dalla velocità che vuoi. Se fossi in te, con un PID così semplice, farei un programmino in Assembler sfruttando i consigli della Microchip dell'AN (divisioni/moltiplicazioni per 2 con gli shift, ecc ...). Se pensi che la velocità non sia un problema vai di decimali con un programma C.
CITAZIONE
A mio avviso, già con un Ki = 2 il sistema mi diventa più instabile che stabile...

Se guardi la mia tesina (mi pare di averla caricata in giro), c'erano veramente tanti problemi con la parte I, mi andavano perennemente in saturazione gli operazionali perché c'era un evidente problema della costante di integrazione sbagliata.Io ho risolto bloccando l'uscita dell'operazionale con degli zener sul condensatore di retroazione, te hai un programma da gestire, quindi forse ti conviene lavorare anche sui tempi di integrazione/derivazione e non solo sulle costanti ;)

Metti qualche foto :lol:
 
Top
TheMrLucas
view post Posted on 4/7/2012, 14:20




Oggi ho fatto qualche modifica all'accrocchio...
Via il servo, che era un pò troppo ballerino e con un range troppo basso, ed eccolo sostituito da un motoriduttore e il driver per pilotarlo in PWM...
Ed ecco i tre potenziometri per i coefficendi P, I e D...

http://i47.tinypic.com/nn1kxi.jpg
http://i49.tinypic.com/eu1r8g.jpg

Ora qualche modifica al codice, e vediamo...
 
Top
view post Posted on 22/7/2012, 15:33
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


interssante davvero, ma l'accelerometro è digitale o analogico?
 
Top
7 replies since 3/7/2012, 14:21   490 views
  Share