inverter90
| 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
| 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
| 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
| Inviato il: 12/03/2015 15:45:19
|
CITAZIONE (BellaEli, 12/03/2015 14:55:37 )
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
| 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
| 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
| 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!!!
| | | | | | | inverter90
| 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!!!
| | | | | | | inverter90
| 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
| Inviato il: 13/03/2015 07:44:29
|
È l'istruzione più importante ..... | | | | | | | ElettroshockNow
| 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 | | | |
Versione Mobile!
|
|
|
|
|
|
|
|
|
|
|
|
|
|