CITAZIONE (kekko.alchemi, 01/05/2015 00:29:50 )
Quote:Per sperimentare un po', ho replicato l'idea di Elettro con il suo inverter ad alta tensione. Ho aggiunto lo setp-up (proprio come sta facendo lui), e integrato il travaso misto di energie rete-batterie.
Detto così sembra che dovevi semplicemente avvitare una lampadina...
Hai realizzato un completo Inverter, è fantastico !!!
Ed anche la reattività e il travaso batterie/Enel lascia senza fiato !!!
Complimenti per tutto !!!
CITAZIONE (NonSoloBolleDiAcqua, 01/05/2015 00:29:50 )
Quote:basta una variabile che si incrementa se il valore del segno non cambia...arrivati a un valore (esempio 3) c'è il cambio di stato certo.
Semplice ed efficace, grazie per la dritta !!!
CITAZIONE (NonSoloBolleDiAcqua, 01/05/2015 00:29:50 )
Quote:la conversione impiega diversi colpi di clock (va in parallelo e non 'rallenta' il processore...
Avere la certezza che una conversione non blocca il codice ci permette di pianificare i passi successivi.
Possiamo, ad esempio, lanciare una conversione alla 1a chiamata della ISR, leggere il valore alla 2a chiamata e contemporaneamente lanciare una nuova conversione per acquisirla alla 3a chiamata e così via.
I valori letti sono in ritardo di circa 62,5 uS ma tale ritardo è fisso e ci permette di fare i nostri calcoli
CITAZIONE (NonSoloBolleDiAcqua, 01/05/2015 00:29:50 )
Quote:per capire occorre vedere come viene effettuata una conversione dai processori...se interessa la spiego cmq servono conferme da chi conosce arduino...
Qualche accenno di teoria, visto che prima o poi dobbiamo affrontare seriamente l'ADC, fa comodo... vai pure con la lezioncina (con software inutile o senza ?!?
)
CITAZIONE (NonSoloBolleDiAcqua, 01/05/2015 00:29:50 )
Quote:non serve nemmeno il codice perchè da quello che si vede BellaEli al momento è il migliore a scriverlo.
Di la verità, ci sei rimasto male per la storia della media senza vettore ? Prometto che la prossima volta non mi permetto più !!!
CITAZIONE (ElettroshockNow, 01/05/2015 00:29:50 )
Quote:Cmq stiamo sui 100uS riducibile a 50uS ... fino a spingersi al limite a 20uS
A parità di bit, c'è differenza di precisione tra una lettura di 100 o 50 uS ?
CITAZIONE (NonSoloBolleDiAcqua, 01/05/2015 00:29:50 )
Quote:I video non li posso vedere...non ho banda...
Come non hai banda ?!? Cioè un pazzo come te che frequenta il forum di EA non ha banda ? Forse si tratta di un disservizio temporaneo, non posso credere che hai una connessione così limitata...
CITAZIONE (kekko.alchemi, 01/05/2015 00:29:50 )
Quote:PS: Il Grande sei te che l'hai pensata!!
Se la memoria non mi inganna, tale soluzione è stata proposta per prima da Scinty...
Ma su 127 (!!!) pagine di topic potrei sbagliarmi...
Ora vorrei tornare un po' al discorso del Sincro, oggi ho fatto qualche altra prova.
Il codice è solo una bozza concettuale scritto senza ottimizzazioni, senza utilizzare #define e mostrando tutti i passaggi per le varie operazioni, proprio per poter scorgere i difetti.
Se ricordate il concetto espresso nella pagina precedente ci sono 3 if:
- Il primo utilizzato solo per l'inizializzazione;
- Il secondo utilizzato quando il segnale in ingresso diventa LOW;
- Il terzo che fa il calcolo del Delta_Time e reimposta il flag per tornare al 2 if.
Bene, il primo if lo eliminiamo inizializzando il valore della variabile Time_Old nella sua dichiarazione (nella ISR):
static unsigned long Time_New, Time_Old = micros(), Delta_Time;
static float Val, ICR1_Media = 999 * 100.0;
static boolean Flag_Enel = false;
static int ICR1_New;
Gli altri 2 if rimanenti sono quindi:
[color=gray]// Se sono su un fronte di discesa mi rimetto in attesa del fronte di salita[/color]
if (Flag_Enel == false && digitalRead(5) == 0) {
_Flag_Enel = true;
}
[color=gray]// Se sono su un fronte di salita procedo...[/color]
if (Flag_Enel == true && digitalRead(5) == 1) {
[color=gray]// Salvo il valore attuale di micros() per avere la certezza di leggerlo sempre allo stesso punto dell'algoritmo[/color]
_Time_New = micros();
[color=gray]// Poichè il valore micros() si resetta ogni 70 secondi circa, gestisco tale evento saltando il calcolo di una sinusoide.[/color]
if (Time_New < Time_Old) {
_Flag_Enel = false;
_Time_Old = Time_New;
}
else {
_Delta_Time = Time_New - Time_Old;
[color=gray]// Come suggerito da Elettro verifico che il Delta_Time abbia dei valori corretti (Tempi corrispondenti a 45...55 Hz)[/color]
if (Delta_Time > 18181 && Delta_Time < 22222) {
[color=gray]// A questo punto posso procedere a calcolare il valore di ICR1 con la misteriosa formula (Delta_Time / 20 - 1), ma vediamo di spiegarla:
Il Delta_Time rappresenta il periodo della sinusoide Enel, che dovrebbe essere di 20 mS.
Tale sinusoide viene suddivisa in 320 campioni, quindi ogni campione avrà una durata di: Delta_Time / 320 (nel caso di 20 mS, sarà 62,5 uS).
Quanto impiega il Timer 1 a contare fino a 62,5 uS ? Semplice:
62,5 uS / 0,0625 uS (tempo di un ciclo di clock)
quindi 1.000.
Ma il contatore va da 0 a 999, quindi al 1.000 dobbiamo ricordare di sottrarre un 1 !
Quindi, ricapitolando, abbiamo:
ICR1_New = ((Delta_Time / 320) / 0,0625) - 1
ICR1_New = ((Delta_Time / 320) * (1 / 0,0625)) - 1
ICR1_New = (Delta_Time / 320 * 0,0625) - 1
ICR1_New = (Delta_Time / 20) - 1
Giusto ???
Bene, ma dobbiamo ricordarci di lavorare con numeri a virgola mobile:
[i]P.S. Ricordo che noi entriamo un questo laborioso calcolo solo sul fronte di salita, ovvero solo 50 volte al secondo[/i][/color]
_Val = (double(Delta_Time) / 20.0) - 1.0;
[color=gray]// A questo punto abbiamo il tempo impiegato da una singola sinusoide Enel, se vogliamo evitare errori di lettura dobbiamo necessariamente fare una media con il metodo del "[URL=www.energialternativa.org/Public/NewForum/Discussione.php?55031252&126#MSG1938]Calderone[/URL]" ! Ecco di seguito il codice:[/color]
ICR1_Media -= ICR1_Media / 100.0;
ICR1_Media += Val;
ICR1_New = int(round(ICR1_Media / 100.0));
[color=gray]// Utilizzando il metodo della media degli ultimi 100 valori si ottiene un valore ultra-stabile, senza alcuna oscillazione.
Da notare che variando la frqeuenza il valore ICR1_New varierà dapprima rapidamente e man mano che si avvicina al valore definitivo la variazione risulta più lenta.
In ogni caso il valore si stabilizza dopo una manciata di secondi[/color]
[color=gray]// A questo punto non ci resta che variare la frequenza in uscita del nostro inverter per sincronizzarla con quella dell'onda in ingresso ma come ?!?
Riflettendoci bene il nostro valore di ICR1 deve variare lentamente, non di colpo, per evitare distorsioni in uscita, quindi:[/color]
if (ICR1 < ICR1_New) ICR1++;
if (ICR1 > ICR1_New) ICR1--;
else "Ho sincronizzato la frequenza !!!"
Ora che abbiamo visto un po' di teoria veniamo alla pratica: le onde hanno frequenza diversa !!!
Non ho ancora scoperto il perchè ma l'onda generata dell'inverter e sincronizzata con l'algoritmo appena descritto è a frequenza leggermente più bassa del segnale in ingresso...
Se qualcuno mi da qualche suggerimento ne sarei davvero felice...