Come avevo promesso, vediamo di analizzare lalgoritmo di feedback implementato da Bolle nel suo simulatore 1.10:
In Grigio il codice di Bolle, in Verde la traduzione in Italiano, in nero le spiegazioni
// ---- Circolar Queue Algoritm by Bolle (alfa feedback)-----// (Beep Beep Beep !!!, Beep Beep Beep !!! (il correttore funziona anche per linglese !!!, 3 Beep per ogni errore !!!))
Algoritmo di Bolle a Coda Circolare (Feedback Alfa)Per coda circolare si intende un vettore di "ELEFCN" elementi che viene letto dallinizio alla fine per poi ricominciare, questo il motivo di Coda Circolare
// Len QueueLunghezza della Codaovvero del Vettore: il valore è modificabile tramite apposito pulsante "Modify ELEFCN"
ELEFCN = 40;Numero di Elementi del Vettore
// VAC is the last VEff arrivedNella variabile VAC cè lultimo valore letto dal Feedback(in pratica corrisponde allAnalogRead delluscita dellInverter)
NFCN = (NFCN + 1) % ELEFCNQuesta è pià complicata da spiegare: abbiamo detto che lalgoritmo utilizza un vettore (coda circolare), la variabile "NFCN" è lindice di questo vettore, ovvero la cella che stiamo leggendo.
Analizziamo la prima parte delluguaglianza, Bolle scrive:
NFCN = NFCN + 1
in pratica ad ogni chiamata lindice viene incrementato di una unità, ovvero si scorre nel vettore dallalto verso il basso.
E alla fine del vettore, cosa dobbiamo fare ? Semplice, dobbiamo azzerare lindice per ripartire dalla prima cella.
Normalmente si userebbe la formula:
if (NFCN = ELEFCN)
NFCN = 0
Ma Bolle usa un metodo più elegante, ovvero loperatore modulo (%)
Cosa fa ? Se scrivo x = 5 % 2, nella variabile x verrà messo il valore 1, vale a dire il resto della divisione 5/2 = 2 col resto di 1
E se ho una variabile "i" che partendo da "0" si incrementa sempre e faccio "i % 5" cosa succede ?
0 % 5 = 0 (0/5 = 0 col resto di 0)
1 % 5 = 1 (1/5 = 0 col resto di 1)
2 % 5 = 2
3 % 5 = 3
4 % 5 = 4
5 % 5 = 0 (5/5 = 1 col resto di 0)
6 % 5 = 1
7 % 5 = 2
8 % 5 = 3
9 % 5 = 4
10 % 5 = 0
e così via, quindi Bolle cosa ha fatto: incrementa NFCN (NFCN + 1), effettua l'operazione di modulo (% ELEFCN) e mette il valore nella variabile NFCN (NFCN =). In pratica equivale a scrivere:
if (NFCN = ELEFCN)
NFCN = 0
else
NFCN = NFCN + 1
Ok ??? Bene, proseguiamo...
ErrorCorrection[NFCN] = 230 VACNel vettore (o coda circolare) viene messo il valore 230 - VAC, ovvero l'errore riscontrato, spieghiamo: 230 è il valore atteso, ovvero il valore che mi aspetto ci sia in uscita dall'inverter, VAC è il valore letto dal feedback, quindi la sottrazione mi restituirà un valore pari a 0 se l'uscita è di 230 V, un valore positivo se l'uscita è inferiore a 230 V (carico collegato) un valore negativo se l'uscita è maggiore di 230 V (stacco un carico, batterie supercariche, PWM free, etc.).
Quindi ad ogni chiamata della funzione nel vettore viene inserito l'ultimo errore riscontrato (che può essere nullo, negativo o positivo).
// Set Correct Value PWMCalcolo del valore di correzione del PWMFPN = 0;la variabile FPN viene inizializzata a 0
for (j = 0; j < ELEFCN; j++)Viene lanciato un ciclo for da 0 al valore del numero di elementi del vettore
FPN = FPN + ErrorCorrection[j];Nel ciclo for, alla variabile FPN (inizializzata a 0) vengono sommati tutti gli errori contenuti nel vettore che rappresentano le ultime ELEFCN letture
FPN = FPN / ELEFCNInfine viene effettuato il calcolo della media dei valori letti.
Per esempio, ipotizziamo un vettore di 5 elementi con le seguenti letture
1° = 5
2° = 0
3° = -15
4° = 25
5° = 10
Il ciclo for somma tutti i valori, quindi 5 + 0 + (-15) + 25 + 10 = 25, la divisione calcola la media, quindi 25 / 5 = 5.
Quindi il valore 5 rappresenta il valore di PWM che bisogna aggiungere al valore corrente del PWM.
Tutto chiaro ? Se ci sono dubbi ho se o scritto cavolate sono qui !
Alla prox, Elix.
P.S. il mio correttore ha fatto di nuovo beep beep beep: chi trova l'errore ???