PWM arduino mega

ciao a tutti! la domanda è la seguente: sul mega ho 13 pin pwm ( dal13 a 0) poi ho dal 22 al 53 digitali, ma ho letto che alcuni (esempio 44,45,46,51,52,53 sono PWM. volevo capire se questi pin sono già PWM oppure se bisogna "settarli" come PWM. scusate ma sono agli inizi! se vanno settate come faccio? librerie?

in teoria puoi fare PWM in qualsiasi pin con la SoftwarePWM però, se ti guardi il datasheet del microcontrollore sicuramente vedrai quali sono e quali non sono PWM.

qui troverai le info di cui necessiti :

SoftwarePWM suppongo sia una libreria giusto? sai dirmi dove la trovo?

Occhio però.... usa il Timer2
se nel programma in cui vuoi usare la SwPWM usi delle librerie che interagiscono con questo timer avrai problemi durante l'esecuzione....
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1268806013

Se devi controllare led e vuoi una cosa pulita usa un 74HC595 :slight_smile:
in questo modo espandi le porte ..

ma io veramente dovrei usare il PWM per i servi, ma ho letto che non è detto che la libreria funzioni per i servi dato che è stata creata per i led, ma con qualche "ritocco" dovrebbe andare. ti ringrazio!

potresti spiegarmi meglio la storia del TIMER2? cos'è?

Se devi pilotare dei servocomandi da modellismo usa la libreria Servo.h o SoftwareServo.h senza complicarti la vita e facendoli lavorare male usando il PWM...
I servi si pilotano in PPM e non PWM :slight_smile:

Dentro al micro ci sono dei timer, questi "detto semplicisticamente" sono dei contatori che si incrementano sempre da quando alimenti il micro ovviamente, se te prelevi il numero che contengono puoi lavorare con i tempi, ad esempio il pwm modula a 490Hz se non sbaglio (per arduino a 16MHz di clock) il duty cycle di un onda quadra, i tempi dati dai timer danno la cadenza in cui l'onda dev'essere HIGH o LOW ...
il discorso è abbastanza complesso :slight_smile:

ma il timer sarebbe il clock quindi?
usando la libreia servo ottengo il pwm su qualsiasi pin digitale? se fosse così non ci sono problemi. io ho bisogno il pwm su altri pidini solo perchè usando delle shield i pin PWM(dal 13 al 2) sono tutti occupati. quindi usavo gli altri digitali come PWM.

No, il clock è il circuito che dà il segnale di sincronizzazione al micro, quello che poi comunemente si chiama "frequenza". Un timer è un temporizzatore, è un circuito basato su un registro che ad ogni segnale di clock viene incrementato.
E' possibile manipolare questi timer (sono più di 1) per fargli compiere particolari operazioni, dal semplice conteggio del tempo (il timer 0 sugli Arduino è usato proprio per questo: la funzione millis() e la delay() funzionano grazie ad un contatore che viene aggiornato grazie all'incremento del timer 0) alla generazione di un'onda quadra (basta mettere lo stato del pin su High o Low dopo un certo lasso di tempo, basato appunto su un timer).

I pin che possono generare segnali in PWM sono quelli marchiati con un simbolo ~ sull'Arduino.

grazie leo72 della spiegazione,ora è un po' più chiaro. però il mio problema è che i pin con il simbolo PWM sono tutti utilizzati, quindi volevo utilizzare altri pin digitali come PWM(parliamo di arduino mega). per farlo basta la libreia servo?

no, la libreria Servo non é per il PWM.
Il mega ha 14 Uscite PWM. E`preferibile usare i pin PWM Hardware che l' emulazione Software.
Non puoi sostituire dei Pin su altri per liberare dei PWM?
Ciao Uwe

ciao Uwe! stavo guardando il mapping del mega. http://arduino.cc/en/Hacking/PinMapping2560
sembrerebbe che anche altri pin come il 44,45,46 siano PWM (c'è scritto: digital pin 44(PWM)) cosa dici?
purtroppo non riesco a liberare i pin da 0 a 13. uso 2 shield (motor e joystick) che li usano tutti(ho già dovuto cambiare dei pin perchè venivano usati da tutte e due le shield)

lucadh:
Però il mio problema è che i pin con il simbolo PWM sono tutti utilizzati, quindi volevo utilizzare altri pin digitali come PWM(parliamo di arduino mega). per farlo basta la libreia servo?

Prima di tutto con il PWM di Arduino non puoi comandare dei servo, la frequenza di carrier è troppo alta, 490 Hz invece di 50 Hz, e poi avresti una bassa risoluzione visto che il PWM consente solo 256 step, poi c'è pure il fatto che i servo si comandano in PPM e non in PWM, anche se i due segnali sono simili e volendo forzare la cosa con il PWM è possibile imitare il PPM non è comunque la stessa cosa.
Per comandare i servo devi usare la libreria servo che sfrutta il timer 2 per generare il corretto impulso PPM con risoluzione fino al singolo us, tramite questa libreria puoi comandare i servo tramite un qualunque pin di Arduino, unica limitazione è il numero di servo controllabili, fino a 12 sulla UNO e fino a 48 sulla MEGA.

secondo http://arduino.cc/en/Main/ArduinoBoardMega2560 sono 14 Pin PWM
secondo http://arduino.cc/en/Hacking/PinMapping2560 ci sono 22 Pin PWM.
secondo http://www.atmel.com/Images/doc2549.pdf pagina 1:

  • Four 8-bit PWM Channels
    – Six/Twelve PWM Channels with Programmable Resolution from 2 to 16 Bits (ATmega1281/2561, ATmega640/1280/2560)
    percui arriverei a 16 PWM

Ciao Uwe