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

[11] Re: PID della libreria DSP microchip

Messaggioda Foto UtenteSandroCalligaro » 7 set 2016, 15:34

peppe855 ha scritto: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_/

Nel caso che descrivi, la corrente misurata, dentro l'algoritmo di controllo, dovrà valere in realtà 5/6 = 0.8333 p.u. (o meglio un valore vicino a questo, nella rappresentazione Q15), non 107.
E' qui che sta l'utilità della scalatura.
Naturalmente la cosa è comoda davvero se il watch nel tuo debugger ti permette di visualizzare le variabili scalate secondo il formato Q che ti serve, altrimenti diventa parecchio complicato.

PS: Il valore base dovrebbe essere confrontabile con il massimo valore misurabile, solitamente è scelto pari alla corrente nominale del motore.
Se hai un caso con corrente base pari a 6 A e la misura di corrente dà 104 mV/A, allora hai scelto male il sensore (o la sua amplificazione), oppure il valore base non è adeguato, oppure ancora stai usando un motore molto sottodimensionato rispetto all'hardware...
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

[12] Re: PID della libreria DSP microchip

Messaggioda Foto Utentepeppe855 » 9 set 2016, 23:37

Ciao Sandro perdona il ritardo!
Allora ho ragionato su quello che mi dicesti nel penultimo intervento e ho studiato un po' le operazioni nel formato Qx.y in pratica supponendo che il mio ADC sia a 10bit e decido di ricevere la misura come fractional signed vorrebbe dire avere la lettura nel formato Q11.5 supponiamo che io stia leggendo x=1000, questo nel formato Q11.5 sarebbe 1000*2^5=32000
Adesso potrei portare quel numero in ampere (tra -6 +6) moltiplicandolo per una costante, ovviamente tale costante è un numero minore di 1, che pero' io posso portare in formato Q1.15, da qui eseguire il prodotto con 32000 e ottenere un numero in Q12.20 che dopo opportuni shift a sx e dx riportero' in un numero in formato Qx.y in cui x sia adeguato a contenere la parte intera che mi aspetto dal prodotto e y sara' una conseguenza (Y=16-x).
Da qui posso fare lo stesso giochetto moltiplicando il risultato per (1/6)*2^15 cioè in pratica mi saro' portato la lettura dell'adc in p.u. in formato Q1.15 e da qui in poi posso lavorare in questo formato che mi garantira' la massima precisione nei calcoli.
Un po' caotico nella spiegazione ma spero si sia intuito :D O_/ O_/
Avatar utente
Foto Utentepeppe855
20 2 7
Frequentatore
Frequentatore
 
Messaggi: 159
Iscritto il: 13 mar 2012, 19:40

0
voti

[13] Re: PID della libreria DSP microchip

Messaggioda Foto Utentepeppe855 » 9 set 2016, 23:50

"Naturalmente la cosa è comoda davvero se il watch nel tuo debugger ti permette di visualizzare le variabili scalate secondo il formato Q che ti serve, altrimenti diventa parecchio complicato"
Guarda effettivamente non so' se questa funzione è implementata nel watch, quello che io sto' facendo è mettermi nelle situazioni in cui mi aspetto i massimi valori e quindi in simulazione step by step verifico che non ci siano overlow e che i risultati siano quelli attesi.
E' un lavoraccio shiftare dopo ogni prodotto per riportarsi al formato che permette il piu' alto numero possibile di cifre dopo la virgola, pero' almeno evito eccessive approssimazioni specie nei calcoli ricorsivi
Avatar utente
Foto Utentepeppe855
20 2 7
Frequentatore
Frequentatore
 
Messaggi: 159
Iscritto il: 13 mar 2012, 19:40

0
voti

[14] Re: PID della libreria DSP microchip

Messaggioda Foto UtenteSandroCalligaro » 10 set 2016, 6:57

Non lo so, a me sembra che tu la stia facendo ancora troppo complicata...

Prendiamo l'esempio della misura a 10 bit.
L'ADC, concettualmente, ti dà già un valore in p.u. (riferito al suo fondo scala) che può andare per definizione da 0 a 1 p.u., ed è in formato Q10 (10 bit frazionari).

Per riportare la grandezza nel tuo riferimento p.u., puoi tener conto del fatto che la misura reale (supponiamo in ampere), deve essere sempre la stessa, una volta moltiplicata per il valore base con cui stai rappresentando.

Per ora non preoccuparti del formato numerico con cui rappresenti i numeri, di quello dovrebbe occuparsi una libreria che ti permetta di fare moltiplicazioni, addizioni ecc tra numeri espressi nello stesso o in diversi formati, oltre che di trasformare valori da un formato all'altro (compresa la conversione di costanti scritte come numeri con la virgola in numeri QN).
Se non è così, effettivamente la cosa diventa pesante, e forse ti conviene crearti la libreria, magari "ispirandoti" a quelle già fatte da qualcun altro (ad es. Texas Instruments).

La misura dell'ADC X_{adc}, che hai riportato in QN, moltiplicata per il suo valore base (cioè appunto il fondo scala dell'ADC {X_{adc}}_B), deve essere uguale al valore reale della misura (cioè valore p.u. riferito alla grandezza base della corrente X_{pu} moltiplicato per il suo valore base X_B)
X_{adc} {X_{adc}}_{B} = X_{pu} X_B
che significa
X_{pu} = X_{adc} (\frac{{X_{adc}}_B} {X_B})
Nota che il secondo termine, se hai scelto in modo sensato X_B (cioè minore o uguale al range di misura) è sempre minore o uguale a 1.

A dire il vero sarebbe meglio, prima della scalatura, sottrarre il valore di offset della misura, che avrai impostato a 0.5 rispetto al fondo scala dell'ADC, oppure al valore misurato quando sai che la corrente è certamente nulla.
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

[15] Re: PID della libreria DSP microchip

Messaggioda Foto Utentemarioursino » 12 set 2016, 11:56

Per prima cosa ricordati che lavorando in Q15 può direttamente ricevere dall'ADC un valore fractional centrato tra V_{ref+} e V_{ref-} tramite il campo FORM del registro ADCON1:

sa.PNG

questo può semplificarti la vita.

Ora passiamo alla mia esperienza: ho lasciato perdere la libreria DSP :D

A parte gli scherzi, ho trovato piuttosto scomodo dover rispettare i limiti imposti dal range del tipo Q15 in quanto avevo costanti per il regolatore piuttosto atipiche e scalare il segnale in ingresso provocava perdite di risoluzione inaccettabili.

Per quanto l'implementazione di Microchip sia eccellente con la virgola fissa (nel mio caso 30 istruzioni per il calcolo dell'output, includendo gli overhead di chiamata alla funzione) sono tornato agli interi utilizzando il moltiplicatore 17x17 e gli accumulatori integrati tramite le funzioni __builtin (compilatore XC16, dsPIC33).
In pratica queste ultime di occupano di utilizzare il DSP senza fartene preoccupare troppo, se sei interessato cerca nella cartella del compilatore la documentazione relativa.

Se scrivi in ASM conoscerai già l'istruzione MPY, non ho letto DS di PIC30 ma credo cambi poco.

IMHO la struttura PID proposta va molto bene quando non devi maneggiare troppo il segnale per mantenere i segnali nel range [~1, -1].

Ultima cosa: se l'anello chiuso non deve rispettare particolari margini di stabilità e vuoi salire in frequenza usa solo operazioni di shift.
Avatar utente
Foto Utentemarioursino
5.687 3 9 13
G.Master EY
G.Master EY
 
Messaggi: 1598
Iscritto il: 5 dic 2009, 4:32

0
voti

[16] Re: PID della libreria DSP microchip

Messaggioda Foto Utentepeppe855 » 13 set 2016, 17:48

Ragazzi grazie per i preziosi interventi ma purtroppo devo fare un passo indietro perché mi rendo conto di NON aver capito una cosa fondamentale, in pratica facciamo il caso che devo regolare una velocità agendo su una tensione (so' che si mette un anello di corrente piu' interno ma tralasciamo perché è altro che voglio capire), quindi mi disegno su carta questo schema:



Adesso so' che nella realtà c'è il trasduttore (supponiamo una dinamo tachimetrica che a 3600rpm mi dia 5v) e c'è l'adc (supponiamo a 10bit) che portero' in contro tramite la costante riassuntiva K, inoltre il PI posso scriverlo in modo diverso, il tutto nella seguente immagine:

Ultima modifica di Foto Utentepeppe855 il 13 set 2016, 17:50, modificato 1 volta in totale.
Avatar utente
Foto Utentepeppe855
20 2 7
Frequentatore
Frequentatore
 
Messaggi: 159
Iscritto il: 13 mar 2012, 19:40

0
voti

[17] Re: PID della libreria DSP microchip

Messaggioda Foto Utentepeppe855 » 13 set 2016, 17:48

Spezzo in due il post perché non entra.

Per cui il primo schema si modifica diventando il seguente (ovviamente nel nodo sommatore devono arrivare due grandezze della stessa unità di misura):



Adesso voglio fare la taratura del regolatore applicando il luogo delle radici e per questo mi serve portare lo schema in retroazione unitaria, operazione fattibile portando il K in catena diretta ed a monte del nodo sommatore come 1/K, cioè:



Sono giunto a ricavarmi i miei parametri Kp Ki.
Adesso viene la parte poco chiara per me, cioè voglio scriverlo sul dsp senza falsare i valori del mio PI vediamo:

- Impongo da potenziometro il massimo, decidendo di visualizzare il risultato come un integer senza segno cioè ADCBUF=0000001111111111;
- Shifto ADCBUF0 a sx di 5 bit caricandolo nella variabile Rif= ADCBUF0<<5; Rif=0111111111100000;
- In pratica sto considerando Rif nel formato Q11.5;
- Voglio riportare Rif in rpm usando Z=3600/1023 ------>Z=3.51906;
- Per non perdere in risoluzione porto Z nel formato Q3.13 cioè Z*2^13=28829;
- Svolgo il prodotto Rif*Z cosi': ((signed long)Rif*Z)>>15;
- Il risultato è nella forma Q13.3 cioè sarebbe (3600*2^3)=28800;
- Faccio lo stesso iter per la misura di velocità da resolver e avro' Speed= Q13.3;
Adesso devo calcolare l'errore di velocità, operazione che posso fare poiché ho il punto decimale nella stessa posizione, quindi Ew sara' nel formato Q13.3.
- Il mio Kp facciamo finta sia venuto Kp=0.3 (mi serve che sia inferiore ad 1 per rendere il discorso piu' generale) e facciamo anche finta che sia un regolatore con solo Kp;
- Non lavorando con i float mi porto quel Kp nel formato Q1.15 facendo 0.3*2^15=9831;
-Tocca eseguire il prodotto tra Ew (che in formato Q13.3) e Kp (in formato Q1.15);
- Nella peggiore delle ipotesi tale prodotto nella realtà varra' 3600*0.3=1080 ovvero basteranno 10+1 bit per la parte intera (1 per il segno), quindi quel prodotto sara' fatto cosi' : ((signed long)Ew*Kp)>>14; cioè avro' il risultato nella forma Q11.5;
- Adesso quel risultato posso portarlo in Q11.0 cioè prendermi la sola parte intera e vedere se è soggetta a saturazione e poi farne calcolarne il dutycycle.

Facendo queste operazioni secondo voi ho alterato il PI di partenza e il risultato finale?
Grazie infinite
Avatar utente
Foto Utentepeppe855
20 2 7
Frequentatore
Frequentatore
 
Messaggi: 159
Iscritto il: 13 mar 2012, 19:40

Precedente

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti