Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

PID della libreria DSP microchip

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] PID della libreria DSP microchip

Messaggioda Foto Utentepeppe855 » 20 ago 2016, 12:51

Buon giorno a tutti, sto' utilizzando un dspic30f6010a ed ho "scoperto" la libreria DSP che tra le altre cose contiene la funzione PID. Senza dilungarmi troppo vedo che il calcolo dell'OUTPUT viene cosi' implementato:

controlOutput[n] = controlOutput[n-1]
+ controlHistory[n] * abcCoefficient[0]
+ controlHistory[n-1] * abcCoefficient[1]
+ controlHistory[n-2] * abcCoefficient[2]
where,
abcCoefficient[0] = Kp + Ki + Kd
abcCoefficient[1] = -(Kp + 2*Kd)
abcCoefficient[2] = Kd
ControlHistory[n] =
MeasuredOutput[n] - ReferenceInput[n]

dove il calcolo di abcCoefficient se lo fa' lui richiamando una delle tre funzioni PID mentre a me tocca inserire Kp Ki e Kd (dichiarate come fractional) percui mi chiedo ma il Td è sottointeso nel valore da me inserito in Ki e Kd visto che nel calcolo di abcCoefficient non c'è traccia?

Inoltre aprendo un esempio microchip dove si fa uso delle tre funzioni PID noto che Kp Ki Kd sono forniti nel seguente modo:

kCoeffs[0] = Q15(0.7);
kCoeffs[1] = Q15(0.2);
kCoeffs[2] = Q15(0.07);

il vettore che contiene i kCoeffs è dichiarato fractional.
Aprendo l'Header file dsp.h mi accorgo che chiamando Q15(x) lui fa' questo calcolo:

#define Q15(X) \
((X < 0.0) ? (int)(32768*(X) - 0.5) : (int)(32767*(X) + 0.5))

che non ho assolutamente compreso, perché se la interpreto come una divisione allora qualsiasi valore ci metta ad X il risultato mi viene sempre uguale ad 1 per via del casting int fatto al dividendo e divisore comunque facendo un debug vedo che ad esempio Q15(0.7) viene trasformato in un numero pari a 0.7x2^15 cioè nel formato Q15 PERO' visto che sicuramente il mio Kp sarà maggiore di 1 come lo si riporta in formato Q15? (Non credo si faccia ad esempio se Kp=30 allora 30x2^15)
Un saluto
Avatar utente
Foto Utentepeppe855
20 2 7
Frequentatore
Frequentatore
 
Messaggi: 159
Iscritto il: 13 mar 2012, 19:40

1
voti

[2] Re: PID della libreria DSP microchip

Messaggioda Foto UtenteeAlucarD » 20 ago 2016, 14:08

O_o

#define Q15(X) \
((X < 0.0) ? (int)(32768*(X) - 0.5) : (int)(32767*(X) + 0.5))

equivale a

Codice: Seleziona tutto
funzione Q15( X )
{
  se (X è minore di 0.0)
   {
      return 32768*X-0.5;
   }
  altrimenti
   {
      return 32767*X+0.5;
   }
}


c'è una beata molto popolare :mrgreen:
E l’uomo si addormentò e nel sogno creò il mondo
Avatar utente
Foto UtenteeAlucarD
1.210 3 5
Expert
Expert
 
Messaggi: 560
Iscritto il: 4 lug 2014, 11:01

0
voti

[3] Re: PID della libreria DSP microchip

Messaggioda Foto Utentepeppe855 » 20 ago 2016, 14:21

Per cominciare grazie :D ! Quindi in pratica non fa' altro che moltiplicare x (che puo' variare tra -1 e +1-2^-15) con 2^15 ok, pero' se il mio Kp per fare un esempio dovesse valere piu' di 1 come faccio??
Avatar utente
Foto Utentepeppe855
20 2 7
Frequentatore
Frequentatore
 
Messaggi: 159
Iscritto il: 13 mar 2012, 19:40

0
voti

[4] Re: PID della libreria DSP microchip

Messaggioda Foto Utentepeppe855 » 21 ago 2016, 10:16

Praticamente quello che succede è che mi incasino con i guadagni e le scalature dei coefficienti. Cioè se ho tarato il mio regolatore su carta e Kp=20; Ki'=ki*Td=0.2; e voglio lavorare con interi ho capito come fare invece lavorando in formato Q15 non riesco a capire come posso portare numeri tipo Kp=20; in un numero minore dell'unita' da portare poi in Q15.
Ma cosa mi sfugge?
Avatar utente
Foto Utentepeppe855
20 2 7
Frequentatore
Frequentatore
 
Messaggi: 159
Iscritto il: 13 mar 2012, 19:40

0
voti

[5] Re: PID della libreria DSP microchip

Messaggioda Foto Utentepeppe855 » 21 ago 2016, 10:54

Io penso che andrebbe fatta una scalatura a monte mi spiego:
ho Kp=20; Ki'=Ki*Td=0.2; Kd'=Kd/Td=0.04; allora faccio Kp+Kd+Ki'=20.24; quindi assumo Base=20.24; e faccio Kp'=20/BASE
Ki''=0.2/BASE
Kd'=0.04/BASE
La funzione PID() nei suoi calcoli si va a prendere Riferimento=Q15(x);
Output=Q15(x);
e quindi mi chiedo come scalo questi valori? usando Base=20.24 non avrei un valore <1 poiché il riferimento ad esempio viene dall'ADC e restituisce un valore da 0-1024;
Io farei una cosa del genere:
Scalo i parametri del regolatore come detto sopra invece per il setpoint (che proviene da adc a 10bit) e la misura dell'uscita (in questo caso velocità motore che esce con un numero compreso tra +- 600) farei cosi: La misura da adc me la faccio dare in formato Q15 cioè con il MSB in posizione [15] ovvero ad esempio 0111111111 000000;
La misura di velocità per confrontarla con il numero dell'adc la shifterei di 5 bit a sinistra esempio 0110001101 000000;
Il PID mi restituira' l'uscita a 16 bit in formato Q15 che io dovro' manipolare per darlo in pasto al mio PWM che per le scelte fatte accetta un valore da 0-4096, e questo lo faccio cosi: (uscitaPID<<1)>>4; (nella prima parentesi elimino il segno, con la seconda operazione scalo tra 0-4096) che chiaramente si puo' fare UscitaPID>>3;
Resta' pero' il fatto che i parametri del pid sono stati scalati con BASE e non avendo io accesso alle operazioni intermedie fatte dalla funzione PID che mi da' direttamente l'uscita come tengo conto di quella scalatura fatta prima?
Spero si sia capito qualcosa.
Avatar utente
Foto Utentepeppe855
20 2 7
Frequentatore
Frequentatore
 
Messaggi: 159
Iscritto il: 13 mar 2012, 19:40

1
voti

[6] Re: PID della libreria DSP microchip

Messaggioda Foto UtenteeAlucarD » 22 ago 2016, 1:37

ho capito che:

sostanzialmente hai le idee confuse su cosa stai facendo e probabilmente anche sul perché le fai

ad esempio il perché di quella funzione Q15

a parte questo il problema di quella funzione è che se il tuo X è grande poco importa la parentela con 1, il risultato potrebbe essere un Q30 :mrgreen:
se il tuo dsp usa un accumulatore a 32bit per farlo da qualche parte muore una farfalla ma vai avanti :mrgreen:

altrimenti devi stabilire tu cosa vuoi fare, se scalare X, mappare il risultato di quella funzione, o quello che vuoi combinare

nota: quella funzione usa sia 2^{15} che non ti conviene più di tanto scrivere così quando programmi :mrgreen:, che 2^{15-1}, ed usa l'uno per i numeri positivi e l'altro per i negativi, ti sei chiesto perché ? :mrgreen:
E l’uomo si addormentò e nel sogno creò il mondo
Avatar utente
Foto UtenteeAlucarD
1.210 3 5
Expert
Expert
 
Messaggi: 560
Iscritto il: 4 lug 2014, 11:01

0
voti

[7] Re: PID della libreria DSP microchip

Messaggioda Foto Utentepeppe855 » 22 ago 2016, 8:51

Ciao eAlucarD grazie per l'intervento in primis.
Allora il risultato di quella Q15(X) va a finire in una variabile di tipo fractional che nell'header è dichiarata come int percui immagino che se ci mettessi un numero superiore ad 1 otterrei il taglio dei bit eccedenti i 16 previsti.
Ora io vorrei sapere da te quando si lavora con questo formato Q15 bisogna in pratica lavorare come se fossimo in P.U. e scalare qualsiasi dato di qualsiasi punto del programma con tale base scelta, sia che si tratti del risultato di una conversione A/D che di un semplice parametro?
perché con gli interi posso scalare qualsiasi numero come voglio l'importante che prima di una somma riporti i valori scalati con il giusto peso dei bit ma qui? cioè qual è la linea da seguire?
Sara' che sono io un po' tardo boh
Avatar utente
Foto Utentepeppe855
20 2 7
Frequentatore
Frequentatore
 
Messaggi: 159
Iscritto il: 13 mar 2012, 19:40

0
voti

[8] Re: PID della libreria DSP microchip

Messaggioda Foto UtenteEcoTan » 22 ago 2016, 8:58

peppe855 ha scritto:viene dall'ADC e restituisce un valore da 0-1024

Il mio ADC (dsPic33) può restituire i valori anche in Q15.
Ma in effetti non ho mai capito che vantaggi offra, elimina il rischio di overflow nelle moltiplicazioni ma non nelle somme comunque ripeto che io non lo ho capito.
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5420
Iscritto il: 29 gen 2014, 8:54

0
voti

[9] Re: PID della libreria DSP microchip

Messaggioda Foto UtenteSandroCalligaro » 31 ago 2016, 22:06

peppe855 ha scritto:Ciao eAlucarD grazie per l'intervento in primis.
Ora io vorrei sapere da te quando si lavora con questo formato Q15 bisogna in pratica lavorare come se fossimo in P.U. e scalare qualsiasi dato di qualsiasi punto del programma con tale base scelta

La base deve essere scelta a seconda del tipo di variabile che si deve rappresentare.

Faccio un esempio per provare a chiarire.
Supponiamo di voler controllare con un regolatore PI una corrente (che verrà quindi misurata) e di farlo attuando una tensione (un "attuatore" si occuperà di generarla).
La misura di corrente, il riferimento e quindi anche la loro differenza, cioè l'errore, saranno scalate secondo il valore base della corrente, I_b. L'uscita del regolatore, che rappresenta un valore di tensione, sarà invece scalata per il valore base della tensione, V_b.
Se il regolatore, realizzato in grandezze "naturali" (non scalate) ed in virgola mobile avesse guadagni K_p e K_i, allora il regolatore implementato in p.u., per avere lo stesso effetto sul mondo reale, dovrà avere gli stessi guadagni moltiplicati per \frac{I_b}{V_b}, per compensare il fatto che il suo ingresso, rispetto al caso precedente, è stato diviso per I_b, mentre l'attuatore moltiplicherà la sua uscita per V_b.

Scegliendo bene i valori base, ad esempio pari ai valori massimi che le variabili possono raggiungere, è possibile evitare overflow, e mantenere una risoluzione adeguata sempre. Purtroppo ci sono dei casi (ad esempio dove interviene il tempo) nei quali bisogna fare attenzione, e magari utilizzare per certe variabili una risoluzione maggiore.

Normalmente si creano delle macro (solitamente il produttore del micro ci ha già pensato!) per effettuare direttamente le varie operazioni matematiche con numeri in rappresentazione Q (frazionaria).

Sull'argomento numeri frazionari Texas Instruments ha un bel po' di documentazione.
Avatar utente
Foto UtenteSandroCalligaro
2.970 2 4 5
G.Master EY
G.Master EY
 
Messaggi: 1181
Iscritto il: 6 ago 2015, 19:25

0
voti

[10] Re: PID della libreria DSP microchip

Messaggioda Foto Utentepeppe855 » 5 set 2016, 9:25

Ciao Sandro perdona il ritardo, allora facciamo un esempio:
- ho una corrente massima che scelgiero' come base pari a 6A;
- ho un tensione massima che scelgo come base pari a 230V;
- ho tarato un regolatore su carta con Kp=70 e Ki'=0,03 (numeri a caso);
- ho un sensore di corrente con un guadagno di 104mV/A;
- ho un adc a 10bit quindi con 5V/1024 di risoluzione;

Adesso io suppongo che siamo ad un certo istante in cui la corrente reale nel motore vale 5A mentre il set point è di 6A, il tutto nel mondo digitale si traduce nell'avere la corrente misurata pari a (5A*104mV)/(5/1024)=107 cioè nel buffer dell'ADC leggero' 107,numero che potro' farmi restituire come integer (cioè tutto a destra) oppure in formato Q1.15(cioè tutto sx), per il set point sara' un discorso analogo. Bene è a questo punto che intervengono le sclature? O_/
Avatar utente
Foto Utentepeppe855
20 2 7
Frequentatore
Frequentatore
 
Messaggi: 159
Iscritto il: 13 mar 2012, 19:40

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti