Loading...
Pages: 1 [2] 3 4 5   Go Down
Author Topic: PWM VELOCE  (Read 1883 times)
0 Members and 1 Guest are viewing this topic.
Cagliari
Offline Offline
Faraday Member
**
Karma: 49
Posts: 3001
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Online
Brattain Member
*****
Karma: 219
Posts: 16447
Don't know what I do
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Offline Offline
Newbie
*
Karma: 0
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Grazie mille e a presto!
Logged

Vicenza, Italy
Offline Offline
God Member
*****
Karma: 4
Posts: 829
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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

Riccardo Ertolupi of the "Vicenza Thunders" Robotics Team
ƎR like no other.

Forum Moderator
Italy
Online Online
Brattain Member
*****
Karma: 219
Posts: 16447
Don't know what I do
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
God Member
*****
Karma: 4
Posts: 829
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink 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 smiley-wink
Logged

Riccardo Ertolupi of the "Vicenza Thunders" Robotics Team
ƎR like no other.

Forum Moderator
Italy
Online Online
Brattain Member
*****
Karma: 219
Posts: 16447
Don't know what I do
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
God Member
*****
Karma: 4
Posts: 829
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Riccardo Ertolupi of the "Vicenza Thunders" Robotics Team
ƎR like no other.

Forum Moderator
Italy
Online Online
Brattain Member
*****
Karma: 219
Posts: 16447
Don't know what I do
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
God Member
*****
Karma: 4
Posts: 829
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink domani provo se riesco a fare qualcosa smiley-wink
Logged

Riccardo Ertolupi of the "Vicenza Thunders" Robotics Team
ƎR like no other.

Vicenza, Italy
Offline Offline
God Member
*****
Karma: 4
Posts: 829
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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... smiley-sad
Logged

Riccardo Ertolupi of the "Vicenza Thunders" Robotics Team
ƎR like no other.

Forum Moderator
Italy
Online Online
Brattain Member
*****
Karma: 219
Posts: 16447
Don't know what I do
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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... smiley-sad
Beh, la formula l'hai capita.  smiley-wink
Per ottenere altre frequenze giochi col prescaler e con il valore iniziale del contatore.
Logged


Vicenza, Italy
Offline Offline
God Member
*****
Karma: 4
Posts: 829
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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... smiley-sad
Beh, la formula l'hai capita.  smiley-wink
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! smiley-wink
Logged

Riccardo Ertolupi of the "Vicenza Thunders" Robotics Team
ƎR like no other.

Forum Moderator
Italy
Online Online
Brattain Member
*****
Karma: 219
Posts: 16447
Don't know what I do
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Se mi dici la frequenza che ti serve ed il timer da usare, te la posso passare io la configurazione per i registri.  smiley-wink
Logged


Pages: 1 [2] 3 4 5   Go Up
Print
 
Jump to: