Se sei già registrato           oppure    

Orario: 07/05/2024 08:36:30  

 

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

VISUALIZZA L'ALBUM

Pagine: (167)  < ...  77   78   79   80   81   82   83   84   85   86   [87]   88   89   90   91   92   93   94   95   96   97  ...>    (Ultimo Msg)


Homemade Inverter "modulo DC/AC"
FinePagina

inverter90

Avatar
MegaWatt


Gruppo:Utente
Messaggi:323

Stato:



Inviato il: 12/03/2015 09:59:10

B.giorno si in realta sono 179 punti totali da 0 a 200 89 e da 200 a 0 altri 89,ma la voglio modificare e arrivare a 200 punti totali..
Tornando al discorso temporizzazione vediamo se ciò capito qualcosa.
Dovrei creare 2 variabili di tipo long una che mi memorizzi il tempo trascorso e una che memorizzi il tempo corrente;Poi creo altre 2 variabili di tipo int per memorizzare lo stato,(pwmState1=LOW);(pwmState2=HIGH);

poi in void loop()
se sono trascorsi 10ms e
se ((pwmState1==LOW)&(pwmState2=HIGH));
pwmState1=HIGH;
pwmState2=LOW;

if (pwmState==HIGH);
OCR1A =(PWM_Out);
else if (pwmState ==LOW);
OCR1A =(LOW);

pwmState2 il contrario;

è tutto sbagliato? Ho il concetto è giusto?



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

 

inverter90

Avatar
MegaWatt


Gruppo:Utente
Messaggi:323

Stato:



Inviato il: 12/03/2015 14:11:41

Un'altra cosa 50 microsecondi equivalgono a 0.05 ms.
Nel programma come li dichiaro? Posso usare la variabile

long temporizzatore = 0.05; ?

oppure meglio

long temporizzatore;

temporizzatore=50/100;?



Modificato da inverter90 - 12/03/2015, 14:19:55


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

 

BellaEli

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:3286

Stato:



Inviato il: 12/03/2015 14:55:37


CITAZIONE

è tutto sbagliato? Ho il concetto è giusto?

No, No, NOOOOOOOOOOOOOOOOO...!!!!!

L'"h" non ci va !!!!!!!!!



Scherzo, naturalmente...

Il concetto è giusto, l'implementazione è da rivedere...


Madonna quanti errori...

CITAZIONE
long temporizzatore = 0.05; ?


Un numero long è intero, non può essere con la virgola, devi usare un float


CITAZIONE
temporizzatore=50/100;?


50/100 = 0,5

al limite dovresti scrivere 5/100

Ora non so cosa ci devi fare con questo valore ma se lo devi dichiarare devi usare la prima espressione, ovvero

float temporizzatore = 0.05;


Ciao...



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

 

inverter90

Avatar
MegaWatt


Gruppo:Utente
Messaggi:323

Stato:



Inviato il: 12/03/2015 15:45:19

CITAZIONE (BellaEli, 12/03/2015 14:55:37 ) Discussione.php?55031252&87#MSG1324


CITAZIONE
è tutto sbagliato? Ho il concetto è giusto?

No, No, NOOOOOOOOOOOOOOOOO...!!!!!

L'"h" non ci va !!!!!!!!!



Scherzo, naturalmente...



Ora non so cosa ci devi fare con questo valore ma se lo devi dichiarare devi usare la prima espressione, ovvero

float temporizzatore = 0.05;


Ciao...


maledette h mi succede sempre

si mi serve per richiamare l'istruzione pgm_read_byte_near ogni 50microsecondi..



Modificato da inverter90 - 12/03/2015, 15:58:12


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

 

inverter90

Avatar
MegaWatt


Gruppo:Utente
Messaggi:323

Stato:



Inviato il: 12/03/2015 15:49:26

Non c'e un sistema per postare un codice senza che si prenda tutta la pagina?

Ennesima domanda ad esempio se voglio dichiarare 1 secondo per il tempo di campionamento mi basta int t=1; o 1000?



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

 

BellaEli

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:3286

Stato:



Inviato il: 13/03/2015 00:40:20


CITAZIONE

Non c'e un sistema per postare un codice senza che si prenda tutta la pagina?


Hai provato il tag "Code" ?

Premesso che non ho mai visto un codice per sintetizzare una forma d'onda né ho fatto esperimenti in tal senso, direi che se vogliamo realizzare un buon codice dobbiamo avvalerci di due tecniche di programmazione un po' più sofisticate del classico IF: sto parlando di Interrupt agganciato al timer e di puntatori.

Il primo fa in modo che ogni tot microsecondi (stabiliti da noi) il codice principale viene sospeso e viene lanciata funzione dell'interrupt che si occuperà di leggere il valore successivo dal vettore e impostarlo come nuovo valore del PWM.

I puntatori, invece, ci permettono di sapere in quale posizione del vettore ci troviamo e quindi possiamo gestire le letture con maggiore flessibilità nel caso in cui dobbiamo aumentare o diminuire la frequenza di qualche decimo di Hz.

Purtroppo hai scelto un progetto difficile per iniziare, ma se vogliamo dei risultati decenti dobbiamo per forza di cose utilizzare gli strumenti adatti...

Elettro che fine hai fatto ???

Che ne pensi ?

Non mi hai risposto all'altro post, tu come gestisci le piccole variazioni di frequenza ?



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

 

inverter90

Avatar
MegaWatt


Gruppo:Utente
Messaggi:323

Stato:



Inviato il: 13/03/2015 06:36:03

Si BellaEli provato, ma lo stesso occupa un intera pagina. Cmq non lo posto perche è anche sbagliato. Ieri son riuscito a lavoro a provare con l'oscilloscopio, ma con risultati pessimi su pin 9 avevo un dente di sega e su pin 10 una linea continua. Comunque niente c'e poco da fare devo aspettare te per un buon codice da solo senza le basi mi sta diventando impossibile!!



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

 

ElettroshockNow

Avatar
GigaWatt


Gruppo:Utente
Messaggi:4656

Stato:



Inviato il: 13/03/2015 06:57:09

Ci sono ... (24h ..sono poche .... una nana bianca forse mi fa' recuperare qualche minuto... mi serve una stella per provare) .

La soluzione migliore è usare un interrupt che cadenza il cambio di pwm , come suggerito da BellaEli.
Arduino , in particolare (mini/nano/uno) usano vome processore un Atmega328 il quale dispone di 3 timer .
Un timer lo stiamo già usando per creare il nostro amato pwm a 15Khz ....
Un secondo timer lo possiamo usare per i campionamenti.

Nei miei scorsi esempi ho evidenziato come calcolare la frequenza di uscita (ricordate 16000000/1/511/2) ...

Stesso discorso , ma ci aggiungiamo qualcosa

Se si analizzano i modi di funzionamento dei timer (tabelle postate da Inverter90) possiamo vedere che il timer si resetta ad un valore preimpostato o scelto dall'utente.

Nel caso "pwm, phase correct 9bit " il valore e' 511 (0x1FF) , ma in altri è OCR ....

Significa che la frequenza in uscita (o il timer) avrà una frequenza pari a :16000000/prescaler/OCR (il diviso 2 non va' messo se il timet si resetta solo sul fronte di salita) .

A questo punto si sceglie il prescalet giusto per avvicinarsi ai 50Hz e si fa' una regolazione fine con l'OCR ....

La risposta alla tua domanda è OCR , oppure fat ripetere uno step pwm o saltare uno step pwm, ottenendo appunto una variazione di fase di 1/200esimo di periodo.

Differenza tra i due metodi di rifasamento:
-nel primo caso non introduco distorsione ,ma vario la frequenza
-nel secondo introduco distorsione , ma non vario la frequenza .

Quale sia il migliore ?
Bo!!!!

Ciao
Elettro

ps:andate forti e nutro ammirazione a Inverter90 che pian pianino raggiungerà dama.

 

inverter90

Avatar
MegaWatt


Gruppo:Utente
Messaggi:323

Stato:



Inviato il: 13/03/2015 07:07:38

Ho trovato questo forse puo essere utile, ma bisogna conoscere l'inglese.
LINK



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

 

ElettroshockNow

Avatar
GigaWatt


Gruppo:Utente
Messaggi:4656

Stato:



Inviato il: 13/03/2015 07:14:28

Perché l'inglese ...è scritto nello stesso linguaggio ... il C

Cmq è ottimo e appunto usa un secondo timer impostato "CTC" per creare la cadenza.

Se noti nel routine loop ... è vuoto
Questo perché fa' tutto la routine interrupt che viene richiamata tramite il timer ...

http://www.energialternativa.info/public/newforum/ForumEA/D/Screenshot_2015-03-13-07-17-10.png

.

 

inverter90

Avatar
MegaWatt


Gruppo:Utente
Messaggi:323

Stato:



Inviato il: 13/03/2015 07:25:13

Ok tanto per capirci lui usa timer 0 per generare l'onda e timer1 per ricreare la cadenza.. Ma nello specifico cosa significa in c questo?ISR(TIMER1_COMPA_vect)



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

 

ElettroshockNow

Avatar
GigaWatt


Gruppo:Utente
Messaggi:4656

Stato:



Inviato il: 13/03/2015 07:44:29

È l'istruzione più importante .....

 

inverter90

Avatar
MegaWatt


Gruppo:Utente
Messaggi:323

Stato:



Inviato il: 13/03/2015 08:29:49



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

 

ElettroshockNow

Avatar
GigaWatt


Gruppo:Utente
Messaggi:4656

Stato:



Inviato il: 13/03/2015 09:20:23

ISR(TIMER1_COMPA_vect)

Questa istruzione gestisce la frequenza (la forma dalla tabella).
In pratica vengono eseguite le istruzioni contenute nella routine ogni volta che il timer1 raggiunge il vettore .

Essendo una cadenza dettata dall'hardware , avrà la stabilità dell'hardware.

Quindi ogni 100 microS o 50 micro nell'esempio di BellaEli (selezionare il giusto prescaler , il giusto ocr , il giusto timer basandosi sul datasheet ....)
Viene richiamata la routine interrupt che modifica il valore pwm .... e con il primo if si resetta l'indice sample per ricominciare la lettura dal sample 0.

Nella routine loop ci metti tutto il resto del programma .... l'onda viene generata e gestita dall'hardware del micro

 

inverter90

Avatar
MegaWatt


Gruppo:Utente
Messaggi:323

Stato:



Inviato il: 13/03/2015 10:08:01

Ci rinuncio



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

 
 InizioPagina
 

Pagine: (167)  < ...  77   78   79   80   81   82   83   84   85   86   [87]   88   89   90   91   92   93   94   95   96   97  ...>    (Ultimo Msg)

Versione Mobile!

Home page       TOP100-SOLAR      Home page forum