Go Down

Topic: Cambiare frequenza PWM Arduino Mega (Read 1 time) previous topic - next topic

leo72

#5
Jan 24, 2013, 08:05 am Last Edit: Jan 24, 2013, 10:19 pm by leo72 Reason: 1
Mi spiace che tu colga le battute come bacchettate.
Sinceramente non mi spiace che tu abbia visto in me una punta di superiorità. Ti ho consigliato una libreria già fatta per semplificarti il compito, non perché non volevo spiegarti le cose. Un timer è una cosa molto complicata da gestire. Se noti sul datasheet ci sono decine e decine di pagine che spiegano come programmarlo. Se ti avessi detto, senza una sola cognizione in merito da parte tua,  "devi scrivere il bit CS50 nel registro TCCR5A perché così facendo hai un prescaler di /1024 invece di /1." Avresti capito qualcosa?

Spiegare i timer in un posto non è semplice.

ibbba


Mi spiace che tu colga le battute come bacchettate.
Sinceramente non mi spiace che tu abbia visto in me una punta di superiorità. Ti ho consigliato una libreria già fatta per semplificarti il compito, non perché non volevo spiegarti le cose. Un timer è una cosa molto complicata da gestire. Se noti sul datasheet ci sono decine e decine di pagine che spiegano come programmarlo. Se ti avessi detto, senza una sola cognizione in merito da parte tua,  "devi scrivere il bit CS50 nel registro TCCR5A perché così facendo hai un prescaler di /1024 invece di /1." Avresti capito qualcosa?

Spiegare i timer in un posto non è semplice.


Guarda la mia e' una elettronica spicciola, imparata da poca scuola( terza media) ma tanta passione ( ho 40 anni ),basata su pochi calcoli ma un'esperienza diretta fatta di saldatore e stagno da quando ho 10 anni!!... Quindi fai molto bene a sentirti superiore a me ,in effetti ci va ben poco!!.. Comunque negli anni ho imparato l'architettura degli ST6 grazie a Nuova Eetteonica e dei Pic grazie a buon Tanzilli e da un anno a questa parte mi sto dedicando ad Arduino,anche un po' per amor di patria, visto che abito a 20 km da Ivrea e mi piace l'idea dell'open.... In ogni modo un Timer in un micro so cos'è e so cos'è un prescaler,ma leggendo il datasheet ci posso impiegare una vita a capire quale sia il registro che lo governa e cosa va impostato... Ecco perché ho fatto una domanda specifica, non ho presentato un problema generale... Ormai comunque è' risolto,grazie ancora della risposta.

Testato

ibba sbagli candeggio,

non solo hai colto male i consigli, poi te ne esci con grazie ho risolto ?
la frase giusta e' "Grazie, ho risolto cosi'..."
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72

@ibba:
ok. quindi se hai già un'infarinatura, allora posso approfondire il discorso.
Sugli Atmel i timer sono ad 8 o a 16 bit.

Fondamentalmente, un timer lo puoi usare in 3 modi:
come contatore: il contatore riparte da zero una volta arrivato al max valore;
in modalità CTC, ossia il contatore viene resettato quando il suo valore raggiunge un registro di confronto;
come generatore di PWM, con diverse modalità: Fast PWM, Phase Correct PWM ecc...

Quello che segue vale per l'Atmega2560 ma con le dovute modifiche anche per tutti gli altri chip.
Un timer è governato da un segnale di clock: ad ogni "colpo" il contatore viene incrementato. Il segnale proviene generalmente dal sistema stesso (è il clock del micro). Può essere usato il clock così com'è oppure tramite un divisore, il "prescaler".
Il prescaler si governa col registro TCCRxB (x è il numero di timer). Nel tuo caso sarebbe stato TCCR5B (timer 5). I flag che lo impostano sono CS50, CS51 e CS52. La loro combinazione varia il fattore di divisione.

Scelto il prescaler, che serve ad avere il range di frequenze, si sceglie la modalità.
Se devi usarlo per generare un segnale PWM si sceglie Fast PWM o Phase Correct PWM. La prima genera un'onda a dente di sega mentre la Phase Correct PWM genera un'onda triangolare, più simmetrica. Si usa generalmente per pilotare motori o simili.
La modaità la imposti tramite il registro TCCRxA ed a volte anche TCCRxB, a seconda di quante modalità gestisce il timer. Facciamo il caso di usare la modalità Phase Correct PWM con top fissato da OCRxA. Questa modalità fa contare il timer finché il valore del suo contatore non raggiunge il valore fissato dal registro OCR5A. Per far ciò si imposta la modalità n° 11 tramite i flag WGM50/51/52/53.
Poi metti nel registro OCR5A il valore a cui invertire la direzione di incremento del contatore.
Una volta fatto questo devi collegare i pin al timer in modo che sia il timer stesso a pilotarne lo stato.
Questo lo fai agendo sui flag COMxAx, COMxBx e COMxCx del registro TCCRxA.
Ad esempio, per far sì che il pin 45 dell'Arduino MEGA cambi stato, bisogna trovare a cosa corrisponde.
Esso è il piedino OC5B, significa che è il canale "B" del timer 5. Quindi si governa con i flag COM5B0 e COM5B1.
Guardando il datasheet si vede che impostando il flag COM5B0 a 1 si fa in modo che al raggiungimento di OCR5A il timer cambi lo stato al pin OC5B.

Ecco fatto. Adesso non resta che mettere il pin in output ed hai il tuo PWM.

ibbba


@ibba:
ok. quindi se hai già un'infarinatura, allora posso approfondire il discorso.
Sugli Atmel i timer sono ad 8 o a 16 bit.

Fondamentalmente, un timer lo puoi usare in 3 modi:
come contatore: il contatore riparte da zero una volta arrivato al max valore;
in modalità CTC, ossia il contatore viene resettato quando il suo valore raggiunge un registro di confronto;
come generatore di PWM, con diverse modalità: Fast PWM, Phase Correct PWM ecc...

Quello che segue vale per l'Atmega2560 ma con le dovute modifiche anche per tutti gli altri chip.
Un timer è governato da un segnale di clock: ad ogni "colpo" il contatore viene incrementato. Il segnale proviene generalmente dal sistema stesso (è il clock del micro). Può essere usato il clock così com'è oppure tramite un divisore, il "prescaler".
Il prescaler si governa col registro TCCRxB (x è il numero di timer). Nel tuo caso sarebbe stato TCCR5B (timer 5). I flag che lo impostano sono CS50, CS51 e CS52. La loro combinazione varia il fattore di divisione.

Scelto il prescaler, che serve ad avere il range di frequenze, si sceglie la modalità.
Se devi usarlo per generare un segnale PWM si sceglie Fast PWM o Phase Correct PWM. La prima genera un'onda a dente di sega mentre la Phase Correct PWM genera un'onda triangolare, più simmetrica. Si usa generalmente per pilotare motori o simili.
La modaità la imposti tramite il registro TCCRxA ed a volte anche TCCRxB, a seconda di quante modalità gestisce il timer. Facciamo il caso di usare la modalità Phase Correct PWM con top fissato da OCRxA. Questa modalità fa contare il timer finché il valore del suo contatore non raggiunge il valore fissato dal registro OCR5A. Per far ciò si imposta la modalità n° 11 tramite i flag WGM50/51/52/53.
Poi metti nel registro OCR5A il valore a cui invertire la direzione di incremento del contatore.
Una volta fatto questo devi collegare i pin al timer in modo che sia il timer stesso a pilotarne lo stato.
Questo lo fai agendo sui flag COMxAx, COMxBx e COMxCx del registro TCCRxA.
Ad esempio, per far sì che il pin 45 dell'Arduino MEGA cambi stato, bisogna trovare a cosa corrisponde.
Esso è il piedino OC5B, significa che è il canale "B" del timer 5. Quindi si governa con i flag COM5B0 e COM5B1.
Guardando il datasheet si vede che impostando il flag COM5B0 a 1 si fa in modo che al raggiungimento di OCR5A il timer cambi lo stato al pin OC5B.

Ecco fatto. Adesso non resta che mettere il pin in output ed hai il tuo PWM.


OK....allora io ho impostato il timer 5 canle B a 61 Hz con:
TCCR5B |= 0x05; ....dovrebbe essere ok giusto?

Go Up