Se sei già registrato           oppure    

Orario: 08/05/2024 05:24:15  

 

Energia Alternativa ed Energia Fai Da Te > Applicazioni E Realizzazioni Pratiche

VISUALIZZA L'ALBUM

Pagine: (167)  < ...  87   88   89   90   91   92   93   94   95   96   [97]   98   99   100   101   102   103   104   105   106   107  ...>    (Ultimo Msg)


Homemade Inverter "modulo DC/AC"
FinePagina

ElettroshockNow

Avatar
GigaWatt


Gruppo:Utente
Messaggi:4656

Stato:



Inviato il: 31/03/2015 09:07:02

CITAZIONE (inverter90, 31/03/2015 08:25:39 ) Discussione.php?55031252&96#MSG1479


Elettro, ma come mai?Anche con fast pwm 10bit ....


Avevo notato questa curiosa anomalia qualche tempo fà ed è legata alle uscite non invertite.
In pratica ad ogni OVF il pin di uscita OCnx viene posto ad 1 ,ma solo dopo un certo periodo (brevissimo) viene nuovamente settato a 0 se l'OCRnx è a 0.

Ad alta velocità neanche si nota e quando abbiamo un prescaler ad 1 è invisibile ,ma c'è !!!!

http://www.energialternativa.info/public/newforum/ForumEA/D/Dente.jpg

La soluzione che ho adottato e che ora implemento nel codice di BellaEli è di usare uscite settate in invertite


//***********************************************************************************************************************************

int Indice = 0;

const int onda[251]=
{0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 99, 104, 109, 114, 119, 124, 128, 133, 138, 143, 147, 152, 157, 161, 166, 170, 175, 179, 184, 188, 193, 197, 201, 206, 210, 214, 219, 223, 227, 231, 235, 239, 243, 247, 251, 255, 259, 263, 266, 270, 274, 277, 281, 285, 288, 292, 295, 298, 302, 305, 308, 311, 315, 318, 321, 324, 327, 329, 332, 335, 338, 340, 343, 346, 348, 351, 353, 355, 358, 360, 362, 364, 366, 368, 370, 372, 374, 375, 377, 379, 380, 382, 383, 385, 386, 387, 389, 390, 391, 392, 393, 394, 395, 395, 396, 397, 397, 398, 398, 399, 399, 399, 400, 400, 400, 400, 400, 400, 400, 399, 399, 399, 398, 398, 397, 397, 396, 395, 395, 394, 393, 392, 391, 390, 389, 387, 386, 385, 383, 382, 380, 379, 377, 375, 374, 372, 370, 368, 366, 364, 362, 360, 358, 355, 353, 351, 348, 346, 343, 340, 338, 335, 332, 329, 327, 324, 321, 318, 315, 311, 308, 305, 302, 298, 295, 292, 288, 285, 281, 277, 274, 270, 266, 263, 259, 255, 251, 247, 243, 239, 235, 231, 227, 223, 219, 214, 210, 206, 201, 197, 193, 188, 184, 179, 175, 170, 166, 161, 157, 152, 147, 143, 138, 133, 128, 124, 119, 114, 109, 104, 99, 95, 90, 85, 80, 75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25, 20, 15, 10, 5, 0};

void setup() {
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
ICR1 = 640; // Setto il periodo a 40 µS (con Fck 16,0 Mhz, Prescaler 1)
TCCR1A = (1 << WGM11); // Setto la modalità Fast PWM a risoluzione variabile
TCCR1B = (1 << WGM12) | (1 << WGM13);
TCCR1A |= (1 << COM1A1) | (1 << COM1A0)| (1 << COM1B1)| (1 << COM1B0); // Imposto le uscite 9 e 10 come non invertenti
TCCR1B |= (1 << CS10); // Imposto il Prescaler a 1
TIMSK1 |= (1 << TOIE1); // Abilito ISR su OverFlow
OCR1A = ICR1;
OCR1B = ICR1;
sei();
}

void loop() {
}


ISR (TIMER1_OVF_vect){

if ((Indice < 1) || (Indice == 250) || (Indice > 499)) { // Indice 0, 250 o 500 (Valore 0, incrocio delle semionde)
OCR1A = ICR1;
OCR1B = ICR1;
}

if ((Indice > 0) && (Indice < 250)) { // Indice compreso tra 1 e 249 (Valori tra 5..400..5)
OCR1A = ICR1-onda[Indice];
}

if ((Indice > 250) && (Indice < 500)) { // Indice compreso tra 1 e 249 (Valori tra 5..400..5)
OCR1B = ICR1-onda[Indice-250];
}

if (Indice > 499) { // Se l'indice è = 500 lo resetto per ricominciare il ciclo
Indice = 1;
}

else{
Indice++; // Incremento l'Indice
}
}

//***********************************************************************************************************************************

Ed ecco la forma d'onda che genera il codice .... andate forti

http://www.energialternativa.info/public/newforum/ForumEA/D/20150331_091741.jpg

 

inverter90

Avatar
MegaWatt


Gruppo:Utente
Messaggi:323

Stato:



Inviato il: 31/03/2015 09:36:30

Wooaaa . quindi per risolvere quella anomalia basta solo invertire entrambi le fasi!!



---------------
Il niente è impossibile finchè non ci provi!!!

 

inverter90

Avatar
MegaWatt


Gruppo:Utente
Messaggi:323

Stato:



Inviato il: 31/03/2015 09:38:57

Elettro ti posso chiedere una cortesia? Appena puoi mi puoi togliere questa quriosità se riesci a vedere che forma d'onda ha questo codice (mi dai il tuo indirizzo ti mando un uvo di pasqua per il fastidio)

#include < avr/io.h >
#include < avr/interrupt.h >
#include < avr/pgmspace.h >


prog_char onda[250] PROGMEM =
{0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, 114, 119, 124, 129, 134, 138, 143, 148, 152, 157, 162,
166, 171, 175, 180, 185, 189, 193, 198, 202, 207, 211, 215, 219, 224, 228, 232, 236, 240, 244, 248, 252, 256, 260, 264, 267, 271, 275, 278, 282, 286,
289, 292, 296, 299, 303, 306, 309, 312, 315, 318, 322, 324, 327, 330, 333, 336, 339, 341, 344, 346, 349, 351, 354, 356, 358, 361, 363, 365, 367, 369,
371, 373, 374, 376, 378, 379, 381, 383, 384, 385, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 396, 397, 398, 398, 399, 399, 399, 400, 400, 400,
400, 400, 400, 400, 400, 399, 399, 399, 398, 398, 397, 396, 396, 395, 394, 393, 392, 391, 390, 389, 388, 387, 385, 384, 383, 381, 379, 378, 376, 374,
373, 371, 369, 367, 365, 363, 361, 358, 356, 354, 351, 349, 346, 344, 341, 339, 336, 333, 330, 327, 324, 322, 318, 315, 312, 309, 306, 303, 299, 296,
292, 289, 286, 282, 278, 275, 271, 267, 264, 260, 256, 252, 248, 244, 240, 236, 232, 228, 224, 219, 215, 211, 207, 202, 198, 193, 189, 185, 180, 175,
171, 166, 162, 157, 152, 148, 143, 138, 134, 129, 124, 119, 114, 110, 105, 100, 95, 90, 85, 80, 75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25, 20, 15, 10, 5,
};



volatile int Indice = 0;
int DeadTime=0;


void setup() {


pinMode(9,OUTPUT);
pinMode(10,OUTPUT);

TCCR1A = (1 << WGM11)| (1 << COM1A1)|(1 << COM1B1);//PHASSE CORRECT 9 bit, uscite in fase

TCCR1B= (1 << CS10);//prescaler 1

TCNT2=0;
TCCR2A = 0;
TCCR2B = (1 << CS21) |(1 << WGM22);//imposta CTC,prescaler 8
OCR2A = 40; // con 40 il timer scatta ogni 20 mICROs
TIMSK2 = (1 << OCIE2A);// abilità intterrupt
sei();

}

void loop() {


}

ISR (TIMER2_COMPA_vect){


if (Indice == 0) { // Sto iniziando una semionda (Positiva o Negativa)
delayMicroseconds(DeadTime); // Posticipo l'attivazione del relativo Pin di "DeatTime" µS
}


if ((Indice > 0) && (Indice < 250)) {


OCR1A =pgm_read_byte(&onda[Indice]);;
OCR1B =0;
}
else if ((Indice > 250) && (Indice < 500)) {

OCR1B=pgm_read_byte(&onda[Indice-250]);
OCR1A =0;
}

Indice++;

if (Indice > 499) {
Indice = 0;
}

}



---------------
Il niente è impossibile finchè non ci provi!!!

 

ElettroshockNow

Avatar
GigaWatt


Gruppo:Utente
Messaggi:4656

Stato:



Inviato il: 31/03/2015 09:46:05

Di seguito gli spike che vengono generati sul pin OC1A impostando OCR1A a 0 ....

In teoria dovrebbe essere sempre 0
Sono veramente brevi , ma meglio eliminarli.
http://www.energialternativa.info/public/newforum/ForumEA/D/20150331_093905.jpg

Torno al lab con il codice di inverter90..

 

ElettroshockNow

Avatar
GigaWatt


Gruppo:Utente
Messaggi:4656

Stato:



Inviato il: 31/03/2015 09:56:09

Di seguito ...
La forma d'onda dovrebbe assomigliare a quella prodotta dal eg8010.

Ho prelevato il segnale parallelandomi al condensatore della rete rc di filtraggio connessa tra pin9 e pin10 .

http://www.energialternativa.info/public/newforum/ForumEA/D/20150331_095103.jpg

 

inverter90

Avatar
MegaWatt


Gruppo:Utente
Messaggi:323

Stato:



Inviato il: 31/03/2015 10:05:09

muuuu male non mi piace.. 12hz? addirittura un periodo di 80ms quasi.. Forze a causato dal DeadTime?



---------------
Il niente è impossibile finchè non ci provi!!!

 

inverter90

Avatar
MegaWatt


Gruppo:Utente
Messaggi:323

Stato:



Inviato il: 31/03/2015 10:05:31

Comunque grazie tanto Elettro



---------------
Il niente è impossibile finchè non ci provi!!!

 

inverter90

Avatar
MegaWatt


Gruppo:Utente
Messaggi:323

Stato:



Inviato il: 31/03/2015 10:20:07

a no ho capito quel'è il problema su OCR2A mi è rimasto il numero 40(della vecchia tabella) quindi il timer scattava ogni 20 microsecondi, ma con 250 valori siamo a 40 microsecondi per metà periodo quindi il numero per 20ms sarà 160 impulsi per OCR2A .. E dovrebbe corrispondere 12.5250hz * 4 =50.1hz; invece il periodo siamo 79.8403ms/4=19.96mS..



---------------
Il niente è impossibile finchè non ci provi!!!

 

BellaEli

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:3286

Stato:



Inviato il: 31/03/2015 12:12:36

O mamma quanta post !!!

Dunque, vediamo di risolvere un po' di questioni...


CITAZIONE

Ho trovato un errore: ... Indice = 250 ...


Noooo !!!

Abbagliato dai Timer non ho controllato per bene il codice...

CITAZIONE
scusami BellaEli, ma sta cosa no mi è chiara io pensavo diversamente.
Icr1 che funzione ha? E 640 con quale formula lo ricavi?


Settando il Timer1 nel "Mode 14", il Timer1 conta da 0 fino a ICR1 per poi ripartire

http://www.energialternativa.info/public/newforum/ForumEA/D/PWM3.png



Poichè il prescaler è a 1, il Timer conterà con la velocità data dalla frequenza di Clock, ovvero:

1/16.000.000 = 62,5 nS

Poichè io voglio ottenere un campionamento di 40 µS, quanti cicli da 62.5 nS occorrono per arrivare a 40 µS ?

N_Cicli = 40 µS / 0.0625 µS = 640 !

In questo modo a che frequenza lavorerà il PWM ?

f = 1 / T

sostituendo abbiamo:

f = 1 / 0.000040 = 25 kHz

Tutto chiaro ?

CITAZIONE
Elettro, ma come mai? Anche con fast pwm 10bit il led non si spegne del tutto. Anche mettendo gli OCRXX=0 rimane leggermente acceso. Invece ho provato modalità phase correct 9bit e si spegne con ocrxx= 0 è tutto spento.. C'e una spiegazione per questo?


CITAZIONE
Avevo notato questa curiosa anomalia qualche tempo fà ed è legata alle uscite non invertite.
In pratica ad ogni OVF il pin di uscita OCnx viene posto ad 1 ,ma solo dopo un certo periodo (brevissimo) viene nuovamente settato a 0 se l'OCRnx è a 0.


La spiegazione di Elettro non è del tutto corretta:

Ipotizziamo che OCR1A è impostato a 10.

Il Timer parte a contare da 0, 1, 2...

Il comparatore, ad ogni ciclo di clock, confronta il valore di TCNT1 con quello di OCR1A.

Quando i valori sono identici, al successivo ciclo di clock, l'uscita viene modificata !

Quindi impostando OCR1A a 0, quando il Timer parte (o si resetta), il Pin 9 viene posto a 1, il comparatore si accorge che TCNT1 = OCR1A (che sono entrambi a 0) e al successivo impulso di clock (esattamente dopo 62,5 nS) l'uscita sarà riportata a 0.

Questo è il motivo degli spike.

CITAZIONE
La soluzione che ho adottato e che ora implemento nel codice di BellaEli è di usare uscite settate in invertite


Risolto il problema in un batter d'occhio !

CITAZIONE
Ed ecco la forma d'onda che genera il codice .... andate forti


Wow !!!

Ma hai già applicato un filtro RC ?

E come hai unito le 2 semionde per formare un'onda intera ?

Inoltre, leggo:

Frequenza: 50,1 Hz
Periodo: 19.9601 ms
DutyCycle: 49 %

I valori sono esatti ? Sono errori del codice o tolleranze dell'oscilloscopio ?

CITAZIONE
Di seguito gli spike che vengono generati sul pin OC1A impostando OCR1A a 0 ....


Come fai a beccarli ?

Vedo la scritta "Stopped", è una funzionalità dell'oscilloscopio ???



Comunque ora abbiamo una base per partire, pian piano vediamo di aggiungere i
vari pezzi...


P.S. Grazie Elettro !!!



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

 

ElettroshockNow

Avatar
GigaWatt


Gruppo:Utente
Messaggi:4656

Stato:



Inviato il: 31/03/2015 12:56:11

Limiti dell'oscilloscopio (responsabile anche il filtraggio)

Per unire e filtrare le due semionde ho connesso una rc tra i due pin di uscita ed ho misurato la tensione sul condensatore.

 

BellaEli

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:3286

Stato:



Inviato il: 31/03/2015 14:22:50


CITAZIONE

Limiti dell'oscilloscopio


Penso ti riferisci ai valori letti...

Solo che mi sorgono alcuni dubbi, vediamo:

C'è un ciclo di clock ogni 62,5 nS, in teoria il Timer conta da 0 a 639 (compreso), quindi 640 valori.

Se facciamo 62,5 * 640 = 40 µS

Indice, tranne il primo ciclo, andrà da 1 a 500 (compreso) quindi 500 campionamenti, che fanno:

40 µS * 500 = 20 mS esatti.


Se per qualche errore nel codice l'indice contasse solo 499 campioni avremmo:

40 µS * 499 = 19.9600 mS (Contro 19.9601 mS letti dall'oscilloscopio)

La frequenza sarebbe:

f = 1 / T = 1 / 0.01996 = 50.100 Hz

il DutyCycle sarebbe di sicuro <> 50 % ma non mi trovo in nessun caso con 49 %


O anche, se per qualche strano motivo il Timer contasse 639 valori anzichè 640 avremmo:

62,5 nS * 639 = 39,9375 µS

che per 500 campionamenti fanno:

39,9375 µS * 500 = 19,96875 mS (Contro 19.9601 mS letti dall'oscilloscopio)

La frequenza sarebbe:

f = 1 / T = 1 / 0.0196875 = 50.078 Hz

il DutyCycle dovrebbe essere esattamente del 50 %

Tu che ne pensi ?



Modificato da BellaEli - 31/03/2015, 14:31:29


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

 

ElettroshockNow

Avatar
GigaWatt


Gruppo:Utente
Messaggi:4656

Stato:



Inviato il: 31/03/2015 14:34:49

Penso che se vuoi un livello di analisi più alto bisogna sostituire l'oscilloscopio.
Cmq i campioni sono 500 (1-2-3-4-5.....496-497-498-499-500-1-2-3-4-5-6....) ,li ho controllati con un print dell'indice e i 40 microS è un valore certo .. quindi mi è difficile pensare che non siano 50Hz

Ho dei dubbi solo sull' else indice++

 

BellaEli

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:3286

Stato:



Inviato il: 31/03/2015 14:36:55

Un'altra domanda importantissima prima di andare avanti:

Qual'è il valore ideale del PWM ???

10 kHz ?
20 kHz ?
30 kHz ?

Per ridurre il filtro (e fischi vari) meglio valori alti, per ridurre le perdite di commutazione meglio valori bassi, quindi ci vorrebbe una via di mezzo.

Ma qual'è ?????



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

 

ElettroshockNow

Avatar
GigaWatt


Gruppo:Utente
Messaggi:4656

Stato:



Inviato il: 31/03/2015 14:40:26

Bella domanda ...

Appena sopra l'udibile è il miglior compromesso .

Io che son mezzo sordo mi accontento di 15Khz ,ma non mi sbilancerei oltre i 20Khz altrimenti le perdite da commutazione sono troppo alte

 

BellaEli

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:3286

Stato:



Inviato il: 31/03/2015 14:42:52


CITAZIONE

Cmq i campioni sono 500 (1-2-3-4-5.....496-497-498-499-500-1-2-3-4-5-6....) ,li ho controllati con un print dell'indice


Anch'io ho ricontrollato varie volte il codice, ma dai calcoli semprerebbe che ci sfugge qualcosa, secondo i valori letti dal tuo oscilloscopio sembra proprio che conta 499 valori al posto di 500 !

CITAZIONE
e i 40 microS è un valore certo .. quindi mi è difficile pensare che non siano 50Hz


Vediamo:

Il Timer parte da 0, ogni 62,5 nS incrementa.

A 639 TCNT1 = ICR1 e sono esattamente 640 valori, quindi 40 µS.

Il successivo ciclo di clock riparte da 0.

Dovrebbe essere corretto.

CITAZIONE
Ho dei dubbi solo sull' else indice++


Cioè ?



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

 
 InizioPagina
 

Pagine: (167)  < ...  87   88   89   90   91   92   93   94   95   96   [97]   98   99   100   101   102   103   104   105   106   107  ...>    (Ultimo Msg)

Versione Mobile!

Home page       TOP100-SOLAR      Home page forum