EnergiAlternativa

Page Index Toggle Pages: 1 ... 119 120 [121] 122 123 ... 219 Send TopicPrint
Very Hot Topic (More than 500 Replies) Homemade Inverter (Read 1249151 times)
NonSoloBolleDiAcqua
Ex Member
*****


--------

Gender: Male
Zodiac sign: Scorpio
Re:Homemade Inverter "modulo DC/AC"
Reply #1800 - 25.04.15 at 07:22:48
Print Post  
CITAZIONE (ElettroshockNow, 25/04/2015 07:01:38 ) Quote:
Per farlo mi sono basato sul lavoro di BellaEli implementando una matrice bidirezionale e quindi mentre il micro lavora sulla matrice 1 viene  calcolata la 2 oppure l'opposto.
Sulla carta funziona, ma nella pratica succede qualcosa di imprevisto  che crea incroci sui finali !!!

non ho capito...hai utilizzato l'algoritmo di BellaEli? non dovrebbe essere possibile una cosa del genere...pensiamoci su! :huh:
  
Back to top
 
IP Logged
 
kekko.alchemi
Forum Administrator
*****
Offline


EA Lab

Posts: 1690
Location: Tusculum
Gender: Male
Zodiac sign: Scorpio
Re:Homemade Inverter "modulo DC/AC"
Reply #1801 - 25.04.15 at 16:03:12
Print Post  
Quante cose saranno possibili nella realtà che nella teoria non sono contemplate Smiley
Pensa che io sto litigando con qualcosa che sembra un bug del microcontrollore. Possibile? E pure così sembra...
  
Back to top
 
IP Logged
 
ElettroshockNow
Forum Administrator
*****
Offline


yottawatt

Posts: 3920
Location: Roma
Gender: Male
Zodiac sign: Gemini
Re:Homemade Inverter "modulo DC/AC"
Reply #1802 - 25.04.15 at 20:31:02
Print Post  
CITAZIONE (NonSoloBolleDiAcqua, 25/04/2015 16:03:12 ) Quote:
non ho capito...hai utilizzato l'algoritmo di BellaEli? non dovrebbe essere possibile una cosa del genere...pensiamoci su! :huh:

Sisi ho usato il metodo di BellaEli.
Ad inizio setup ho calcolato la matrice 1 ,poi durante il normale funzionamento (viene gestito in automatico dall'interrupt del timer2 che incrementa l'indice della matrice in uso)nel Main ho letto il valore analogico del picco (tensione raddrizzare e livellata  dall'uscita).
In base a questo valore ricalcolo la matrice che non viene usata (calcolo che viene esuguito tra un interrupt e un'altro) e appena finita alza una flag .
Nel l'interrupt del timer 2 c'è  un If che controlla ad ogni ciclo di interrupt (nel mio caso 100uS ) se la matrice è  pronta .
Se è  pronta e mi trovo ad indice 0 ,allora cambio la matrice in uso e abbasso la flag.
Nel loop se la flag è  abbassata riparte il calcolo ma della matrice che fino a poco prima era la principale.
Questo è  il principio di BellaEli che sfrutta il 100% della velocità  del micro.
Sicuramente se la matrice fosse composta da meno elementi andrebbe a vantaggio .
Però  non capisco i piccoli incroci che si creano .... Per niente  belli.

A dimenticavo che il metodo BellaEli è  perfetto per un inverter basato sul pwm tipo il mio  è che quindi non deve preoccuparsi della forma d'onda .

Più  avanti se riuscirò  in questa impresa aggiungerò  un doppio feedback per le due semionde.

Per la cronaca ,oggi ho misurato direttamente i tempi di ritardo ...
Bé  bisogna introdurre 3uS di anticipo e 3uS di ritardo  ai due pwm per avere 0uS di deadtime.
Poi va' aggiunto un deadtime per sicurezza.
Io ho aggiunto 1,5uS .
Più  tardi allego foto ... ;P
  

Il Tempo non lo vede nessuno,il lavoro lo vedono tutti (Mamma)
Impara a rubare con gli occhi (Papà)
Back to top
YouTube  
IP Logged
 
NonSoloBolleDiAcqua
Ex Member
*****


--------

Gender: Male
Zodiac sign: Scorpio
Re:Homemade Inverter "modulo DC/AC"
Reply #1803 - 25.04.15 at 21:50:37
Print Post  
CITAZIONE (ElettroshockNow, 25/04/2015 20:31:02 ) Quote:
A dimenticavo che il metodo BellaEli è  perfetto per un inverter basato sul pwm tipo il mio  è che quindi non deve preoccuparsi della forma d'onda .

Questa è un'ottima notizia che si dava per scontata a livello teorico...

CITAZIONE (ElettroshockNow, 25/04/2015 20:31:02 ) Quote:
Sicuramente se la matrice fosse composta da meno elementi andrebbe a vantaggio.

Si potrebbe tentare di capire fino a che valori si potrebbe arrivare...un esempio potrebbe essere il 256...ma l'algoritmo dovrebbe essere cambiato, più o meno come avevo anticipato mediante una interpolazione a media pesata.Vediamo cosa ne pensa BellaEli.

CITAZIONE (ElettroshockNow, 25/04/2015 20:31:02 ) Quote:
Però non capisco i piccoli incroci che si creano .... Per niente belli.

Potrebbe esserci un bug a livello di algoritmo che è sfuggito...una foto potrebbe aiutare...


CITAZIONE (ElettroshockNow, 25/04/2015 20:31:02 ) Quote:
Per la cronaca ,oggi ho misurato direttamente i tempi di ritardo ...
Bé  bisogna introdurre 3uS di anticipo e 3uS di ritardo  ai due pwm per avere 0uS di deadtime.
Poi va' aggiunto un deadtime per sicurezza.
Io ho aggiunto 1,5uS

Avrei detto che i tempi si dovevano agirare sui 100-200ns ...3 micro mi sembrano un'enormità...ottimo lavoro...ridurranno drasticamente la stesura del codice.
  
Back to top
 
IP Logged
 
ElettroshockNow
Forum Administrator
*****
Offline


yottawatt

Posts: 3920
Location: Roma
Gender: Male
Zodiac sign: Gemini
Re:Homemade Inverter "modulo DC/AC"
Reply #1804 - 25.04.15 at 22:24:56
Print Post  
Ecco i ritardi che entrano in gioco :

Il metodo pwm phase correct è  bellissimo perché  non obbliga l'inseguimento della forma ,ma come svantaggio ha l'alto rischio di danneggiare il finale inquanto  basta che per un attimo i due finali siano entrambi in conduzione e il danno è  fatto.
In teoria se non venissero introdotti ritardi asimmetrici dovremo trovare gli stessi tempi in ingresso e in uscita,ma non è  così. ...

Dal bellissimo  Arduino configurato in phase correct genero i due pwm sfasati  di 180° (senza deadtime ) e li vado a misurare sui Gate :


Oooo mio orrore ... INCROCIO
C'è  bisogno di un deadtime per correggere i ritardi introdotti  dal sistema ....
Quindi ho introdotto una differenza tra i due OCR1A e OCR1B di 52 (equivalente a 3,2uS) a favore  di OCR1A

Smiley ... molto meglio ,ora niente incrocio ,ma manca niente
Per sicurezza ho confermato il non incrocio anche sulla Vce (ho separato il ponte pilotati singolarmente un finale accendendo un lampada da 20W ,quindi nel grafico sono entrambi in fase )



Ok .. per essere sicuro ho aggiunto qualche uS (3 uS .. Forse troppi ,più  avanti scendo )


Ora sono contento e rilassato ..

Quindi tirando le somme bisogna prevedere un deadtime minimo imposto dall'hardware che personalmente  ho chiamato correct_time perché  nella realtà  non crea momenti morti tra i due finali.

Volete sapere da dove vengono quei 3.2uS ...
Di seguito l'uscita Pwm del micro e la tensione sul Gate ...


Ciao e buoni deadtime  a tutti dopo un buon correct_time Smiley
ElettroshockNow
  

Il Tempo non lo vede nessuno,il lavoro lo vedono tutti (Mamma)
Impara a rubare con gli occhi (Papà)
Back to top
YouTube  
IP Logged
 
ElettroshockNow
Forum Administrator
*****
Offline


yottawatt

Posts: 3920
Location: Roma
Gender: Male
Zodiac sign: Gemini
Re:Homemade Inverter "modulo DC/AC"
Reply #1805 - 25.04.15 at 22:33:23
Print Post  
Quote:
Avrei detto che i tempi si dovevano agirare sui 100-200ns ...3 micro mi sembrano un'enormità...ottimo lavoro...ridurranno drasticamente la stesura del codice.

Sisi si può  scendere a 200/300nS ...
La difficoltà  è  trovare  il valore di correct_time per mettere i due fronti sullo stesso asse....
Poi si  và  di fino e si sceglie  il deadtime in funzione di quanto aumenta l'asimmetria Ton e Toff dei finali in funzione della corrente.
Io direi di non scendere sotto 1uS ...
Chi ha più  esperienza di me che dice ?
  

Il Tempo non lo vede nessuno,il lavoro lo vedono tutti (Mamma)
Impara a rubare con gli occhi (Papà)
Back to top
YouTube  
IP Logged
 
BellaEli
Ex Member
****


--------

Gender: Male
Zodiac sign: Leo
Re:Homemade Inverter "modulo DC/AC"
Reply #1806 - 25.04.15 at 22:51:21
Print Post  
CITAZIONE (NonSoloBolleDiAcqua, 25/04/2015 20:31:02 ) Quote:
Sto semplicemente dicendo che basta trasformare il tuo vettore in una coda circolare (più o meno già fai una cosa del genere) , fai scorrere un indice su questa coda (il tuo semaforo) 'lokkando' un solo elemento e non metà vettore.

Se l'altro processo necessita di quell'elemento (visto che è sotto semaforo) prendi l'ultimo valore valido che salverai in una apposita variabile.

Tutto questo ti permetterà il dimezzamento della memoria e svincolerai i due processi in modo asincrono:

la coda circolare (cioè la funzione loop) procederà con i tempi di lettura del convertitore a/d,

mentre l'altro processo analizzerà i valori retroazionandoli.


Solo per ragionare, non ti scaldare...

Il primo "Se l'altro processo necessita di quell'elemento" chi è la funzione loop o l'interrupt ?

Il secondo "mentre l'altro processo analizzerà i valori retroazionandoli." a chi è riferito ? Non abbiamo mai parlato di retroazione, che vuoi dire ?

Comunque, ipotizziamo di avere una struttura del genere:

Loop {

___Funzione1 (Es. Gestione ADC)
___Funzione2 (Es. Gestione Display)
___Funzione3 (Es. Gestione Protezioni)
___Funzione4 (Es. Gestione Input)
___Funzione5 ...
___Funzione6 ...
___Funzione7 ...
___Funzione8 (Ricalcolo riga matrice, la nostra attuale Calcola_Vet())

}

Interrupt() {

// scorre l'indice da 0 a 319. Indice è una variabile globale, quindi vista dalla funzione Calcola_Vet() che potrebbe rappresentare il semaforo.

}

Calcola_Vet() {

// Supponiamo che vogliamo lavorare su un solo vettore di 160 elementi
// E supponiamo che la variabile Indice sta a 100,
// tale funzione ricalcolerà tutti i valori da da 0 a 99 e poi troverà
// il semaforo rosso (variabile indice) quindi ha 2 possibilità:

Opzione 1:
Aspetta che la variabile indice si incrementa e man mano che lo fa ricalcola i restanti valori del vettore fino all'indice 319, quindi termina la funzione.

Da notare che se questa funzione viene eseguita quando l'indice sta a 0 occorrerà aspettare ben 20 ms per uscire dalla funzione, un vero spreco !

Opzione 2:
Memorizza il valore 99, alza un flag di ricalcolo incompleto ed esce dalla funzione, quindi il ciclo loop potrà procedere con le Funzione1, Funzione2, etc, fino alla Funzione8 che continuerà il calcolo dal valore 100 fino al valore indice di quell'istante, a meno che il valore indice di quel momento non sia inferiore di 99 (vuol dire che ha ricominciato da 0).

In questo secondo caso, per funzionare correttamente, dobbiamo avere la certezza che la nostra Funzione8 deve essere richiamata entro 20ms, altrimenti ci saranno problemi sui valori ricalcolati.

}

Il secondo metodo è sicuramente quello più performante, tuttavia visto che attualmente la nostra funzione loop ha solo la Funzione8 è prematuro progettare un simile meccanismo, solo per questo dico di rimandare tale ottimizzazione...



CITAZIONE (NonSoloBolleDiAcqua, 25/04/2015 20:31:02 ) Quote:
Ok, mi hai convinto...


So benissimo che non è così (e ti ringrazio per l'eleganza con cui mi hai dato la possibilità di andare avanti) ma faccio finta che ci credo e quindi accolgo la tua richiesta e si va avanti !!!



CITAZIONE (kekko.alchemi, 25/04/2015 21:50:37 ) Quote:
Dovete partire dall'Hardware, definendo solo a livello filosofico il firmware, definirlo in tutti i suoi componenti, realizzarlo, e solo dopo iniziare a stendere il firmware.
...
Così invece scrivendo tutto da zero senza un riscontro pratico sull'Hardware (carichi applicati sull'inverter, distorsione effettiva, feedback...) si rischia di perdere un sacco di tempo.


E' vero quello che dici, tuttavia stiamo ancora agli albori, stiamo ancora lavorando sui blocchi logici del firmware siamo ancora lontani da tutte quelle ottimizzazioni relative all'hardware...
Inoltre, sicuramente in maniera più limitata, è comunque possibile "simulare" l'hardware con piccoli circuiti (nel mio video, ad esempio, ho simulato la variazione di frequenza con un semplice potenziometro, testando di fatto quella specifica parte di firmware).

In ogni caso ti ringrazio per il "warning", cercherò di tenerne conto adeguatamente...

CITAZIONE (kekko.alchemi, 25/04/2015 21:50:37 ) Quote:
Posso aggiungere una cosa, senza scoraggiare nessuno?


Nooooooo !!! Stai zitto !!!


CITAZIONE (ElettroshockNow, 25/04/2015 22:24:56 ) Quote:
Per farlo mi sono basato sul lavoro di BellaEli implementando una matrice bidirezionale e quindi mentre il micro lavora sulla matrice 1 viene calcolata la 2 oppure l'opposto.


Ehi, come hai osato senza permesso ?!? Vabbeh, per questa volta chiudo un occhio...


CITAZIONE (ElettroshockNow, 25/04/2015 22:24:56 ) Quote:
Sulla carta funziona, ma nella pratica succede qualcosa di imprevisto che crea incroci sui finali !!!


Mmmh... viene da pensare a un piccolo errore o inaccortezza nella stesura del codice, non perchè è una idea mia, ci mancherebbe, ma semplicemente perchè è una operazione che non ha nulla a che vedere con gli incroci...



CITAZIONE (ElettroshockNow, 25/04/2015 22:24:56 ) Quote:
A dimenticavo,per aumentare la protezione ho impiegato un pin interrupt che blocca tutto se sente un Fail da uno dei driver ...


Siii... questa è un'ottima idea: utilizzare un Pin da agganciare ad un interrupt con priorità più alta per bloccare istantaneamente l'inverter !

Ne terrò conto per quanto passeremo a gestire le protezioni...


CITAZIONE (ElettroshockNow, 25/04/2015 22:24:56 ) Quote:
Si il sincro non può usare un interrupt con priorità più alta del timer1 e 2.


E' vero, l'idea che ci sia qualcosa che ha priorità superiore alla generazione dell'onda non mi piace affatto (a parte la protezione)... Vediamo come andrà a finire...


CITAZIONE (NonSoloBolleDiAcqua, 25/04/2015 22:33:23 ) Quote:
Si potrebbe tentare di capire fino a che valori si potrebbe arrivare...un esempio potrebbe essere il 256...ma l'algoritmo dovrebbe essere cambiato, più o meno come avevo anticipato mediante una interpolazione a media pesata.Vediamo cosa ne pensa BellaEli.


Eccolo che riparte... Cos'è sta storia della media pesata ? A cosa ti riferisci ?

CITAZIONE (NonSoloBolleDiAcqua, 25/04/2015 22:33:23 ) Quote:
Potrebbe esserci un bug a livello di algoritmo che è sfuggito...una foto potrebbe aiutare...


Quoto...


CITAZIONE (ElettroshockNow, 25/04/2015 22:33:23 ) Quote:
Il metodo pwm phase correct è bellissimo perché non obbliga l'inseguimento della forma ,ma come svantaggio ha l'alto rischio di danneggiare il finale inquanto basta che per un attimo i due finali siano entrambi in conduzione e il danno è fatto.


Non ricordo dove ho trovato queste due animazioni:




Per gestire il DeadTime con il Phase Correct è un po' più complicato, potrebbe sfuggire qualche piccolo dettaglio che porta a mandare in conduzione tutti e due i finali quando ci si avvicina a valori alti di PWM...

In ogni caso, come ogni volta, complimenti per la qualità di tutto ciò che fai e condividi !

A presto, Eligio.
  
Back to top
 
IP Logged
 
ElettroshockNow
Forum Administrator
*****
Offline


yottawatt

Posts: 3920
Location: Roma
Gender: Male
Zodiac sign: Gemini
Re:Homemade Inverter "modulo DC/AC"
Reply #1807 - 25.04.15 at 23:55:52
Print Post  
Quote:
Per gestire il DeadTime con il Phase Correct è un po' più complicato, potrebbe sfuggire qualche piccolo dettaglio che porta a mandare in conduzione tutti e due i finali quando ci si avvicina a valori alti di PWM

Nel dubbio ho mandato in seriale le matrici  per vedere se ci fossero errori.
Niente ,i calcoli sono tutti corretti,ma il micro non digerisce il cambio di matrice.
O meglio.
Se le due matrici sono uguali l'inverter non si lamenta invece nelle variazioni ,cioè  quando le matrici cambiano valori (pur restando nei valori ) si sentono degli incroci ,difficili da misurare anche con l'oscilloscopio.
Però  ci sono .

Ho pensato anche alla possibilità  che il problema potenziale sul sincro lo potrei avere anche adesso con il Timer2.
Mi spiego.
Uso il Timer2 per comodità  e per non perdere le funzioni millis () ,delay() micros () di arduino ,altrimenti usavo il Timer0 con priorità  più  bassa del Timer1 ed ero sicuro che non rompeva le scatole.
Forse penso che sia lui il problema ,perché  ho aggiunto un If e qualche altra stupidaggine ,ma cmq ho appesantito l'interrupt.
Ora quando viene richiamata l'interrupt del Timer2 essa prenderà  la gestione del micro per il tempo necessario ,ma se l'ho appesantita ne aumenterà  di conseguenza anche il tempo.
Ma in tutto questo il TCNT1  continua a contare .... e quando finisce l'interrupt forse ho già superato le soglie OCR e quindi il micro immediatamente commutava salutando il deadtime... incrocio. .
Forse è  lui il problema che risulta  presente nel codice senza l'implementazione di BellaEli ,ma meno evidente.
Che dite può  essere ?
Bo!!! Altro non mi viene in mente

@BellaEli :grazie per la dritta del bidimensionale  .. mi piace ... mi piace vedere il micro sudare Cheesy
  

Il Tempo non lo vede nessuno,il lavoro lo vedono tutti (Mamma)
Impara a rubare con gli occhi (Papà)
Back to top
YouTube  
IP Logged
 
BellaEli
Ex Member
****


--------

Gender: Male
Zodiac sign: Leo
Re:Homemade Inverter "modulo DC/AC"
Reply #1808 - 26.04.15 at 01:55:32
Print Post  
Scusa Elettro, mi riepiloghi la logica del tuo firmware ?

Il timer 2 conta da 0 fino a ? 200 ?

In overflow cambia il valore di ?

Il timer 1 si occupa del PWM in phase correct, conta da 0 a 511, poi torna indietro e cambia i pin in funzione di ocr1x ?
  
Back to top
 
IP Logged
 
ElettroshockNow
Forum Administrator
*****
Offline


yottawatt

Posts: 3920
Location: Roma
Gender: Male
Zodiac sign: Gemini
Re:Homemade Inverter "modulo DC/AC"
Reply #1809 - 26.04.15 at 02:26:40
Print Post  
CITAZIONE (BellaEli, 26/04/2015 01:55:32 ) Quote:
Scusa Elettro, mi riepiloghi la logica del tuo firmware ?

il Timer1 si preoccupa delle due uscite a 15Khz e varia il duty variando gli OCR1A o B che possono avere valori da 0 a 511.
Per il canale A 0 è il minimo e 511 è il massimo ,per il b  l'opposto.
Il Timer 2 crea la cadenza per modificare l'indice e lo fà richiamando una interrupt per COMPA ogni 100uS :

ISR(TIMER2_COMPA_vect){
  if (pos == 200 && Flag_Vet_Pronto) {                               
    Flag_Vet_Pronto = false;                                             
    Sin ^= 1;   
}
    if(pos==200) pos=0; 
    OCR1A= constrain ((S[Sin][pos]-deadtime),0,511);
    OCR1B= constrain ((S[Sin][pos]+deadtime),0,511);
    pos++;
}


La matrice bidimensionale S[] è composta da 200 elementi nei quali è presente tutta la forma sinusoidale (100 per la semionda positiva e 100 per la negativa)

Nel loop invece:
if(!Flag_Vet_Pronto)Calcola_Sin();

La quale routine calcola la Matrice Stby equivalente a Sin^1.

Fila tutto .. tranne quel Timer2 che interrompe il Timer1 troppo spesso ... e non mi piace
  

Il Tempo non lo vede nessuno,il lavoro lo vedono tutti (Mamma)
Impara a rubare con gli occhi (Papà)
Back to top
YouTube  
IP Logged
 
NonSoloBolleDiAcqua
Ex Member
*****


--------

Gender: Male
Zodiac sign: Scorpio
Re:Homemade Inverter "modulo DC/AC"
Reply #1810 - 26.04.15 at 03:49:06
Print Post  
hai capito te Elettro zitto zitto...hai messo decisamente a fuoco Cheesy

quindi sei sceso con valori del vettore bidimensionale e 200 e la forma d'onda ancora 'tiene'...hai verificato il limite inferiore? :rolleyes:

Quote:
Fila tutto .. tranne quel Timer2 che interrompe il Timer1 troppo spesso ... e non mi piace

deve filar tutto...a meno che ci sia un problema che non dipenda dall'algoritmo ma nel modo in cui agisce l'interrupt...cioè forse si da per scontato che l'interruzione avvenga a linee di codice C...mentre l'interruzione avviene su una qualsiasi linea di codice in linguaggio macchina e quindi le variabili condivise potrebbero essere lette in modo errato perchè interrotte nel punto di aggiornamento..
Questo punto è fondamentale...potrebbe avvenire una cosa del genere...se non è chiaro faccio un esempio.

Se invece pensi che sia un problema di Timer2 troppo frequente e lo vuoi abbassare ma non tornano gli indici...occorre interpolare con delle medie.

Tutto chiaro?
  
Back to top
 
IP Logged
 
ElettroshockNow
Forum Administrator
*****
Offline


yottawatt

Posts: 3920
Location: Roma
Gender: Male
Zodiac sign: Gemini
Re:Homemade Inverter "modulo DC/AC"
Reply #1811 - 26.04.15 at 09:37:19
Print Post  
Variabili condivise ....:unsure: potrebbe anche essere ...
Con calma domani ricontrollo  ed evito le variabili condivise.

Per il discorso Timer2 volevo sostituirlo con il Timer0 che ha priorità  più  bassa ,così  sono sicuro che nessuna interrupt interrompa le comparazioni sul Timer1.

200 elementi ,100 per semionda non solo male ,meno non ho provato Smiley
  

Il Tempo non lo vede nessuno,il lavoro lo vedono tutti (Mamma)
Impara a rubare con gli occhi (Papà)
Back to top
YouTube  
IP Logged
 
BellaEli
Ex Member
****


--------

Gender: Male
Zodiac sign: Leo
Re:Homemade Inverter "modulo DC/AC"
Reply #1812 - 26.04.15 at 15:11:31
Print Post  
Un momento, ma Timer1 lavora in hardware, non può sbagliare o no ? Voglio dire che una volta impostati i due valori OCR1A e B, il timer, il comparatore e tutto ciò che riguarda il timer1 funzionerà in maniera del tutto indipendente dal firmware...

L'unica vera incertezza è il momento in cui vai ad impostare i valori OCR1A e B, facciamo un esempio:

Ipotizziamo che ci troviamo nella seconda metà della semionda positiva, quindi i valori del PWM, ad ogni ISR, diminuiranno.

Ipotizziamo che il valore attuale del vettore S è 150 e che il valore di DeadTime è 5, quindi OCR1A sarà stato impostato a 145, OCR1B a 155.

In queste condizioni, il valore del pin 9 sarà 1 fino a 145 e 0 fino a 511.
Il valore del pin 10 sarà 0 fino a 155, 1 fino a 511.

Ipotizziamo che il prossimo valore del vettore S, da impostare come PWM in uscita sia 140, quindi 135 e 145 per OCR1A e B.

Ipotesi 1:

Ipotizziamo che la ISR venga chiamata quando il TCNT1 è a 100, quindi imposterai i valori di ICR1A e B a 135 e 145 e tutto funzionerà correttamente.


Ipotesi 2:

Ipotizziamo che la ISR venga chiamata quando il TCNT1 è a 200, quindi imposterai i valori di ICR1A e B a 135 e 145 e tutto funzionerà correttamente.


Ipotesi 3:

Ipotizziamo che la ISR venga chiamata quando il TCNT1 è a 143, quindi imposterai i valori di ICR1A e B a 135 e 145 e... cosa succederà ???

Il comparatore di ICR1A si accorge che TCNT1 ha superato il valore di ICR1A, quindi al ciclo di clock successivo imposta il pin 9 a 0, e dopo solo 2 cicli di clock/prescaler imposta il pin 10 a 1, saltando di fatto il DeadTime !!!

Quindi il problema si verifica solo perché non tieni conto di TCNT1, non perché c'è un timer con priorità più alta...

Che ne pensi ?
  
Back to top
 
IP Logged
 
ElettroshockNow
Forum Administrator
*****
Offline


yottawatt

Posts: 3920
Location: Roma
Gender: Male
Zodiac sign: Gemini
Re:Homemade Inverter "modulo DC/AC"
Reply #1813 - 26.04.15 at 16:51:06
Print Post  
Penso che non fa' una piega Smiley
Soluzione ,gestire tutto da OVF del timer1 come hai fatto te .
  

Il Tempo non lo vede nessuno,il lavoro lo vedono tutti (Mamma)
Impara a rubare con gli occhi (Papà)
Back to top
YouTube  
IP Logged
 
BellaEli
Ex Member
****


--------

Gender: Male
Zodiac sign: Leo
Re:Homemade Inverter "modulo DC/AC"
Reply #1814 - 26.04.15 at 17:13:54
Print Post  
In realtà potresti aggiungere un IF tipo:
if (TCNT1 - S[pos] - deadtime > 0) {
// Procedi normalmente...
}

Magari al posto dello 0 potresti mettere 1 o 2 se vuoi considerare anche i tempi di esecuzione della ISR...

Se non ci sono le condizioni per entrare nell'if, in uscita resterà il valore precedente... Sempre meglio di un incrocio !!!

Va solo considerata l'ipotesi assurda che a ogni chiamata dell'ISR non ci sono le condizioni per entrare nell'if !!!

Complessivamente dovrebbe comunque funzionare... Che dici ???
  
Back to top
 
IP Logged
 
Page Index Toggle Pages: 1 ... 119 120 [121] 122 123 ... 219
Send TopicPrint
 

TOP100-SOLAR Galleria Immagini EnergiAlternativa