Cagliari
Offline
Faraday Member
Karma: 49
Posts: 3001
|
 |
« Reply #15 on: January 24, 2012, 03:53:03 pm » |
La definizione della funzione delay la trovi nel file wiring.c nella cartella hardware/arduino/cores/arduino/.. Usa il timer 0.
|
|
|
|
|
Logged
|
IDE 1.0.4 - Arduino UNO R3 - Ethernet Shield R3 - DCF77 Module - Adafruit Data Loggin Shield - LCD 16x2 RGB positive backlight - i2c LCD backpack - RTC 1307 Board - Saleae Compatibile Logic Analyzer 8ch 24Mhz - ATtiny2313 ProtoBoard - Xino Board - ATtiny 4313 - Arduino 2009 - Arduino USB Serial Ligth - DS18B20 - LM35DZ - ShiftRegister - TL431 - ATtiny 85 Ultimi acquisti: CodeBender: http://codebender.cc/register/?referrer=PaoloP
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 10
|
 |
« Reply #16 on: January 25, 2012, 05:05:18 am » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16447
Don't know what I do
|
 |
« Reply #17 on: January 25, 2012, 07:46:42 am » |
Usa il timer 2, è a 8 bit come lo 0.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 10
|
 |
« Reply #18 on: January 27, 2012, 04:53:16 am » |
... Infatti ho provato proprio con il timer 2 e tutto funziona correttamente.
Grazie mille e a presto!
|
|
|
|
|
Logged
|
|
|
|
|
Vicenza, Italy
Offline
God Member
Karma: 4
Posts: 829
ƎR like no other.
|
 |
« Reply #19 on: October 12, 2012, 09:07:19 am » |
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 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...
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16447
Don't know what I do
|
 |
« Reply #20 on: October 12, 2012, 09:47:45 am » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Vicenza, Italy
Offline
God Member
Karma: 4
Posts: 829
ƎR like no other.
|
 |
« Reply #21 on: October 12, 2012, 10:40:35 am » |
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 
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16447
Don't know what I do
|
 |
« Reply #22 on: October 12, 2012, 11:09:48 am » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Vicenza, Italy
Offline
God Member
Karma: 4
Posts: 829
ƎR like no other.
|
 |
« Reply #23 on: October 12, 2012, 11:26:59 am » |
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?
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16447
Don't know what I do
|
 |
« Reply #24 on: October 12, 2012, 12:05:30 pm » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Vicenza, Italy
Offline
God Member
Karma: 4
Posts: 829
ƎR like no other.
|
 |
« Reply #25 on: October 12, 2012, 01:44:47 pm » |
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 
|
|
|
|
|
Logged
|
|
|
|
|
Vicenza, Italy
Offline
God Member
Karma: 4
Posts: 829
ƎR like no other.
|
 |
« Reply #26 on: October 13, 2012, 04:49:16 am » |
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... 
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16447
Don't know what I do
|
 |
« Reply #27 on: October 13, 2012, 08:35:19 am » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Vicenza, Italy
Offline
God Member
Karma: 4
Posts: 829
ƎR like no other.
|
 |
« Reply #28 on: October 13, 2012, 08:37:45 am » |
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! 
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16447
Don't know what I do
|
 |
« Reply #29 on: October 13, 2012, 09:11:42 am » |
Se mi dici la frequenza che ti serve ed il timer da usare, te la posso passare io la configurazione per i registri. 
|
|
|
|
|
Logged
|
|
|
|
|
|