Go Down

Topic: PWM VELOCE (Read 5436 times) previous topic - next topic

PaoloP

La definizione della funzione delay la trovi nel file wiring.c nella cartella hardware/arduino/cores/arduino/..
Usa il timer 0.

Burt

PaoloP:
A ecco, allora forse è per quello che non lavora correttamente. Oggi vado a vedere e provo se riesco a risolvere il problema utilizzando un altro timer.

Grazie molte e a presto.

leo72

Usa il timer 2, è a 8 bit come lo 0.

Burt

... Infatti ho provato proprio con il timer 2 e tutto funziona correttamente.

Grazie mille e a presto!

ƎR

mi collego a questo topic perchè il mio problema è simile, io volevo fare dei segnali pwm ad una frequenza compresa tra 15 e 20 khz per controllare dei motori... io uso un arduino mega quindi i registri dei timer abbinati ai pin sono un po' diversi e mi sono ispirato a quello che ho trovato qui: http://sobisource.com/?p=195 per scrivere questo codice che mi da circa 31khz sul pin 9
Code: [Select]
void setup()
{
TCCR2B = (TCCR2A & 0xF8) | 0x01 ;
pinMode(9, OUTPUT);
analogWrite(9,127);
}

void loop(){}

per me però sono troppi perchè ho degli integrati che sopra i 20khz non vanno e quindi quello è il mio limite massimo...
ho provato a leggere vari post per capire come "giocare" con i timer e ho provato varie cose, come dicono qua: http://it.emcelettronica.com/fast-pwm-su-arduino-valida-alternativa-all%E2%80%99istruzione-analogwrite#_ che cambiano la frequenza diminuendo la sensibilità del pwm, ma non sto ottenendo risultati...
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

leo72

Imposta il timer 2 in modalità Phase Correct PWM ad 8 bit.
La frequenza in questa modalità la calcoli così:
Fclk/(2*prescaler*max_val_cont)
Ora se metti un prescaler di 8 ed usi un valore massimo del contatore di 56 ottieni
160000000/(2*8*56)=17857,qualcosa e ci saresti pienamente.

Per ottenere un valore max del contatore di 56 basta farlo partire da 200, dato che (256-56)=200.
Quindi metti una ISR che reimposta il contatore a 200 ad ogni overflow.

ƎR


Imposta il timer 2 in modalità Phase Correct PWM ad 8 bit.
La frequenza in questa modalità la calcoli così:
Fclk/(2*prescaler*max_val_cont)
Ora se metti un prescaler di 8 ed usi un valore massimo del contatore di 56 ottieni
160000000/(2*8*56)=17857,qualcosa e ci saresti pienamente.

Per ottenere un valore max del contatore di 56 basta farlo partire da 200, dato che (256-56)=200.
Quindi metti una ISR che reimposta il contatore a 200 ad ogni overflow.


ok grazie mille ;) teoricamente ho capito cosa dovrei riuscire a fare, cos' quando vado a fare l'analogWrite posso arrivare solo fino a 56? o devo partire da 200? o posso andare direttamente sui registri OCRnB?

vale lo stesso processo anche per tutti gli altri timer? per il timer 0 che ha una frequenza doppia mi basta raddoppiare il range del pwm da 56 a 112?
grazie ancora ;)
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

leo72

No no...il 200 lo devi impostare come base nel timer all'interno della ISR. 56 sono gli aggiornamenti che il contatore farà prima di andare in overflow. All'overflow, rimetti il contatore a 200.

Con l'analogWrite gestisci il duty cicle e basta.

Se non hai bisogno di modificare il duty cicle, puoi semplicemente agganciare o sganciare il segnale mettendo il pin in output o input, rispettivamente.

ƎR


No no...il 200 lo devi impostare come base nel timer all'interno della ISR. 56 sono gli aggiornamenti che il contatore farà prima di andare in overflow. All'overflow, rimetti il contatore a 200.

Con l'analogWrite gestisci il duty cicle e basta.

Se non hai bisogno di modificare il duty cicle, puoi semplicemente agganciare o sganciare il segnale mettendo il pin in output o input, rispettivamente.


io devo gestire dei motori, è quindi ho bisogno di poterlo variare da 0 al massimo... nell'analogWrite mi basta mettere valori da 0 a 255 come al solito?
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

leo72

Sì, nell'analogWrite metti valori da 0 a 255. Il mio "no no.." era riferito alla tua precedente domanda in cui chiedevi se dovevi mettere un valore max di 56 nell'analogWrite.

ƎR


Sì, nell'analogWrite metti valori da 0 a 255. Il mio "no no.." era riferito alla tua precedente domanda in cui chiedevi se dovevi mettere un valore max di 56 nell'analogWrite.

ok grazie mille ;) domani provo se riesco a fare qualcosa ;)
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

ƎR

purtroppo ho appena scoperto che il mio sistema non funziona sopra gli 8khz, adesso devo capire perchè e cercare di risolvere questo problema prima di poter pensare di alzare ulteriormente la frequenza... :(
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

leo72


purtroppo ho appena scoperto che il mio sistema non funziona sopra gli 8khz, adesso devo capire perchè e cercare di risolvere questo problema prima di poter pensare di alzare ulteriormente la frequenza... :(

Beh, la formula l'hai capita.  ;)
Per ottenere altre frequenze giochi col prescaler e con il valore iniziale del contatore.

ƎR



purtroppo ho appena scoperto che il mio sistema non funziona sopra gli 8khz, adesso devo capire perchè e cercare di risolvere questo problema prima di poter pensare di alzare ulteriormente la frequenza... :(

Beh, la formula l'hai capita.  ;)
Per ottenere altre frequenze giochi col prescaler e con il valore iniziale del contatore.

si, l'ho capita, anche se non ho proprio le idee chiare sui registri, magari provando riesco a fare qualcosa, grazie mille! ;)
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

leo72

Se mi dici la frequenza che ti serve ed il timer da usare, te la posso passare io la configurazione per i registri.  ;)

Go Up