Quote:su questo presto ti renderai conto che non è un sogno ma una realtà non inarrivabile
Ottima notizia... Speriamo di riuscirci !!!
Elettro ma il codice scritto fino a questo punto può funzionare sul tuo inverter o ci sono problemi con i Pin ?
E poi mi spieghi perché hai il problema del Dead-Time ? Nel mio codice sembra non esserci, nel tuo in quale situazione si presenta ?
Tornando a noi vediamo di fare due conti:
I vettori sono degli int, quindi 2 byte.
Attualmente abbiamo:
- 1 vettore di riferimento da 160 elementi: 320 byte;
- 1 Matrice 160x2, ovvero 2 vettori da 160 elementi per la semionda positiva: 640 byte;
- 1 Matrice 160x2, ovvero 2 vettori da 160 elementi per la semionda negativa: 640 byte;
In totale 1.600 byte su 2048 solo di vettori !!!
Decisamente troppi, vediamo dove possiamo economizzare...
Come prima punto dobbiamo considerare che, trattandosi di un sistema "mono-task", possiamo ricalcolare un vettore per volta, o quello relativo alla semionda positiva o a quella negativa, mai contemporaneamente.
Quindi, modificando opportunamente il codice, anziché utilizzare due matrici 160x2, una per la semionda positiva e una per quella negativa, possiamo utilizzare una sola matrice matrice 160x3 dove 2 righe sono quelle utilizzate indifferentemente dalla semionda positiva e negativa e l'altra riga rappresenta quella di appoggio per il ricalcolo.
Naturalmente potrà capitare che ogni semionda leggerà, a seconda dei casi (in funzione del numero di ricalcoli eseguiti), i valori dalla riga 0, 1 o 2 in base ad opportuni Flag.
In questo modi risparmiamo i primi 320 byte !
Altra complicazione per il codice che ci permette di risparmiare ulteriore spazio e ci farà risparmiare tempo per il calcolo è la seguente:
scegliendo opportunamente il valore di ICR1 per far si che il numero di campionamenti sia un numero pari possiamo dimezzare la lunghezza del vettore.
Nel nostro caso, l'intera sinusoide è formata da 320 elementi, 160 per la semionda superiore e 160 per quella inferiore.
In realtà, i 160 elementi della semionda superiore sono ulteriormente divisibili in 2 poichè i valori che vanno dalla colonna 0 alla colonna 79 sono identici ai valori che vanno dalla colonna 81 alla 159, solo in ordine invertito !
Cioè il primo quarto di sinusoide è speculare (ma identico come valori) al secondo quarto !
Inoltre, nel ricalcolo del vettore, ci troveremo a calcolare solo 80 elementi rispetto ai precedenti 160, dimezzando i tempi di ricalcolo !!!
Se utilizziamo questo approccio possiamo risparmiare:
- 1 vettore di riferimento da 80 elementi: 160 byte;
- 1 Matrice 80x3, ovvero 3 vettori da 80 elementi per la semionda positiva: 480 byte;
In totale solo 640 byte rispetto ai precedenti 1600 !!!
L'idea mi sembra buona, sarà un impiccio implementarla ma è fattibile.
Quello che invece no so, e chiedo l'aiuto di chi ha già sperimentato, è la seguente cosa:
può capitare che con carichi particolari sono costretto a correggere il primo quarto di onda in maniera totalmente differente dal secondo quarto ? Se si, in quali situazioni ?
Complessivamente che ne pensate ?