Applicazioni E Realizzazioni Pratiche
Homemade Inverter "modulo DC/AC"

VISUALIZZA L'ALBUM

Pag: (167)  < ...  118   119   120   [121]   122   123   124  ...>    (Ultimo Msg)


FinePagina

NonSoloBolleDiA...

Avatar
PetaWatt


AMMINISTRATORE
Msg:13786

Stato:



Inviato il: 25/04/2015 07:22:48

CITAZIONE (ElettroshockNow, 25/04/2015 07:01:38 ) Discussione.php?55031252&120#MSG1851


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!



---------------
Chi sa raccontare bene le bugie ha la verità in pugno (by PinoTux).
Un risultato se non è ripet...

 

kekko.alchemi

Avatar
GigaWatt


Utente
Msg:5226

Stato:



Inviato il: 25/04/2015 16:03:12

Quante cose saranno possibili nella realtà che nella teoria non sono contemplate
Pensa che io sto litigando con qualcosa che sembra un bug del microcontrollore. Possibile? E pure così sembra...



---------------
L'universo è dominato dagli estremi, l'infinitamente grande e l'infinitamente piccolo.
 

ElettroshockNow

Avatar
GigaWatt


Utente
Msg:4656

Stato:



Inviato il: 25/04/2015 20:31:02

CITAZIONE (NonSoloBolleDiAcqua, 25/04/2015 16:03:12 ) Discussione.php?55031252&121#MSG1853


non ho capito...hai utilizzato l'algoritmo di BellaEli? non dovrebbe essere possibile una cosa del genere...pensiamoci su!

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

 

NonSoloBolleDiA...

Avatar
PetaWatt


AMMINISTRATORE
Msg:13786

Stato:



Inviato il: 25/04/2015 21:50:37

CITAZIONE (ElettroshockNow, 25/04/2015 20:31:02 ) Discussione.php?55031252&121#MSG1855


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 ) Discussione.php?55031252&121#MSG1855

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 ) Discussione.php?55031252&121#MSG1855

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 ) Discussione.php?55031252&121#MSG1855

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.



---------------
Chi sa raccontare bene le bugie ha la verità in pugno (by PinoTux).
Un risultato se non è ripet...

 

ElettroshockNow

Avatar
GigaWatt


Utente
Msg:4656

Stato:



Inviato il: 25/04/2015 22:24:56

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 :

http://www.energialternativa.info/public/newforum/ForumEA/E/Gate%20senza%20Deadtime.jpg
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
http://www.energialternativa.info/public/newforum/ForumEA/E/Gate%20con%20+-26%20deadtime.jpg
... 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 )

http://www.energialternativa.info/public/newforum/ForumEA/E/Vce%20con%20+-26%20deadtime.jpg

Ok .. per essere sicuro ho aggiunto qualche uS (3 uS .. Forse troppi ,più avanti scendo )
http://www.energialternativa.info/public/newforum/ForumEA/E/Gate%20con%20+-50%20Deadtime.jpg

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 ...
http://www.energialternativa.info/public/newforum/ForumEA/E/ChA%20pwm%20e%20gate%20Toff.jpg

Ciao e buoni deadtime a tutti dopo un buon correct_time
ElettroshockNow

 

ElettroshockNow

Avatar
GigaWatt


Utente
Msg:4656

Stato:



Inviato il: 25/04/2015 22:33:23


CITAZIONE

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 ?

 

BellaEli

Avatar
GigaWatt


MODERATORE
Msg:3286

Stato:



Inviato il: 25/04/2015 22:51:21

CITAZIONE (NonSoloBolleDiAcqua, 25/04/2015 20:31:02 ) Discussione.php?55031252&120#MSG1846


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 ) Discussione.php?55031252&120#MSG1846
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 ) Discussione.php?55031252&120#MSG1847

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 ) Discussione.php?55031252&120#MSG1847

Posso aggiungere una cosa, senza scoraggiare nessuno?


Nooooooo !!! Stai zitto !!!


CITAZIONE (ElettroshockNow, 25/04/2015 22:24:56 ) Discussione.php?55031252&120#MSG1851

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 ) Discussione.php?55031252&120#MSG1851

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 ) Discussione.php?55031252&120#MSG1851

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 ) Discussione.php?55031252&120#MSG1851

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 ) Discussione.php?55031252&121#MSG1856

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 ) Discussione.php?55031252&121#MSG1856
Potrebbe esserci un bug a livello di algoritmo che è sfuggito...una foto potrebbe aiutare...


Quoto...


CITAZIONE (ElettroshockNow, 25/04/2015 22:33:23 ) Discussione.php?55031252&121#MSG1857

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:

http://www.energialternativa.info/public/newforum/ForumEA/E/Fast_PWM_anim.gif


http://www.energialternativa.info/public/newforum/ForumEA/E/Phase_Correct_Mode_PWM_anim.gif



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.



Modificato da BellaEli - 25/04/2015, 22:58:40


---------------
C'è un limite al fai da te ???
Si, ma lo stabiliamo noi !!!






 

ElettroshockNow

Avatar
GigaWatt


Utente
Msg:4656

Stato:



Inviato il: 25/04/2015 23:55:52


CITAZIONE

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

 

BellaEli

Avatar
GigaWatt


MODERATORE
Msg:3286

Stato:



Inviato il: 26/04/2015 01:55:32

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 ?



---------------
C'è un limite al fai da te ???
Si, ma lo stabiliamo noi !!!






 

ElettroshockNow

Avatar
GigaWatt


Utente
Msg:4656

Stato:



Inviato il: 26/04/2015 02:26:40

CITAZIONE (BellaEli, 26/04/2015 01:55:32 ) Discussione.php?55031252&121#MSG1861

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

 

NonSoloBolleDiA...

Avatar
PetaWatt


AMMINISTRATORE
Msg:13786

Stato:



Inviato il: 26/04/2015 03:49:06

hai capito te Elettro zitto zitto...hai messo decisamente a fuoco

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


CITAZIONE

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?



---------------
Chi sa raccontare bene le bugie ha la verità in pugno (by PinoTux).
Un risultato se non è ripet...

 

ElettroshockNow

Avatar
GigaWatt


Utente
Msg:4656

Stato:



Inviato il: 26/04/2015 09:37:19

Variabili condivise .... 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

 

BellaEli

Avatar
GigaWatt


MODERATORE
Msg:3286

Stato:



Inviato il: 26/04/2015 15:11:31

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 ?



---------------
C'è un limite al fai da te ???
Si, ma lo stabiliamo noi !!!






 

ElettroshockNow

Avatar
GigaWatt


Utente
Msg:4656

Stato:



Inviato il: 26/04/2015 16:51:06

Penso che non fa' una piega
Soluzione ,gestire tutto da OVF del timer1 come hai fatto te .

 

BellaEli

Avatar
GigaWatt


MODERATORE
Msg:3286

Stato:



Inviato il: 26/04/2015 17:13:54

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 ???



---------------
C'è un limite al fai da te ???
Si, ma lo stabiliamo noi !!!






 
 InizioPagina
 

Pag: (167)  < ...  118   119   120   [121]   122   123   124  ...>    (Ultimo Msg)

Versione Completa!

Home page     TOP100-SOLAR    Home page forum