La tua idea di partenza è corretta e, a mio avviso, migliorabile in questo modo:
- Utilizzare un partitore di tensione al posto del trasformatore (es. 1 M Ohm e 10 k Ohm , rapporto 1 a 100, tensione sulla R da 10 k di 2,2 VRms, 3,1 Vpp);
- Far passare il segnale proveniente dal partitore attraverso un filtro passa basso (con operazionali) da 12 dB/Oct con ft = 50 Hz e Q = 0,707, per ripulire il segnale da ogni disturbo;
- Inviare il segnale ripulito ad un circuito di condizionamento a operazionali per far si che la tensione vari tra circa 1 e 4 volt (per avere un po' di margine di sicurezza);
- infine inviare il segnale su un Pin analogico del micro.
Solo che tutto quello descritto riguarda la parte Hardware: sul lato software ancora non ho idea di che direzione prendere...
Potremmo ipotizzare di leggere il valore sul Pin analogico ogni 10 ISR chiamate (circa 0,6 mS, circa 32/34 campioni per sinusoide) ma poi di questi valori che ce ne facciamo ?
Andrebbe implementato un algoritmo che comprende se tali valori stanno crescendo o decrescendo, prendendo una serie di almeno 10 valori per escludere errori di lettura, scartando i valori sotto 1,5 V e sopra 3,5 V per tralasciare i picchi superiori e inferiori della sinusoide.
Una volta capita la direzione potremmo "fare qualcosa" tutte le volte che il valore (quando è in crescita) supera la soglia di 512 (pin analogico va da 0 a 1024, 512 corrisponde a 2,5 V). Anche qui occorre fare una media di 5 / 10 valori per ridurre al minimo errori di lettura.
Ma a questo punto ? In "fare qualcosa" che facciamo ?
Potemmo leggere il valore della variabile "Colonna" (Colonna va da 0 a 320, quando è a "0" stiamo partendo con la nostra sinusoide) e se il valore è inferiore a 160 (siamo in ritardo rispetto la rete Enel, dobbiamo aumentare la frequenza) diminuiamo ICR1, altrimenti lo incrementiamo.
Tuttavia tale controllo lo dobbiamo fare ciclicamente e ogni valore varia nel tempo, complicando ogni cosa...
Per esempio potrebbe capitare che noi siamo a 50 Hz, Enel a 50,5, al primo controllo siamo a 130 (in ritardo e dobbiamo diminuire ICR1), al controllo successivo potrebbe capitare che siamo a 180 (in anticipo e dobbiamo aumentare ICR1). In questa situazione il nostro firmware cercherebbe di agganciarsi alla rete Enel non riuscendoci praticamente mai...
Forse in "fare qualcosa" dovremmo implementare un vero frequenzimetro e, quindi, calcolare il tempo trascorso tra un "fare qualcosa" è il successivo. Poi, per diminuire al minimo gli errori di lettura/calcolo, dovremmo fare una media delle ultime 100 o 1.000 letture effettuate e calcolare la frequenza con la classica formula: F = 1 / T.
A questo punto, poiché noi siamo in grado di calcolare la nostra frequenza di uscita in funzione del valore di ICR1 potremmo dapprima settare ICR1 per sintonizzarsi sulla stessa frequenza della rete Enel e, successivamente, anticipare o ritardare la nostra onda per una perfetta messa in fase.
Voi che ne dite ? Ci sono alternative più semplici ? Sarebbe possibile semplificare le cose, che so, con un modello matematico basato su vettori o qualcosa del genere ?
Non mi abbandonate...
|