Cambiare la frequenza del PWM

Ciao a tutti,

avrei la necessità di cambiare la frequenza del PWM. So che è possibile (si può aumentare fino a 150 kHz se non sbaglio). Come devo fare per andare a cambiarla??Dove devo andare a mettere le mani?

Grazie mille.

Andrea

Ciao, quì trovi come cambiare la frequenza usando i prescaler: http://playground.arduino.cc/Main/TimerPWMCheatsheet http://arduino.cc/en/Tutorial/SecretsOfArduinoPWM però non si può impostare qualunque frequenza...

Io per impostare una frequenza diversa da quelle impostabili usando il prescaler avevo usato questa libreria: http://playground.arduino.cc/code/timer1 si può impostare la frequenza del pwm sui pin controllati dal timer 1 sull'arduino uno, cioè i pin digitali 9 e 10

Grazie mille d407336,

io ho una Arduino Mega e avevo ahimè intuito che non potevo cambiare a piacimento la frequenza!!!A me servirebbe intorno ai 100Hz quindi ora vedrò di capire come funziona con la libreria...

Manipolando un timer si può impostare una qualunque frequenza da pochi Hz fino alla metà della frequenza di sistema. Cambiano le cose tra un timer ad 8 o a 16 bit, ma per 100 Hz non vedo un grosso problema.

Che timer volevi usare?

Quello da 8 bit mi dovrebbe essere sufficiente. Ho provato ad usare le righe di codice suggeritemi nel post precedente ma non riesco ad avere alcun risultato....

help !! :sweat_smile:

8 bit, allora usa il timer 2.

http://www.righto.com/2009/07/secrets-of-arduino-pwm.html Qui c'è spiegato tanto.

Per scegliere la frequenza devi scegliere prima la modalità. Usiamo la Fast PWM, che è quella più semplice da impostare. F=CLOCK/PRESCALER/MAX_VALORE_REGISTRO Col clock a 16 MHz, si hanno dei valori dati dai vari prescaler che sono in pratica fissi. Usando il prescale /1024 si ottiene una frequenza di 61 Hz (il registro ad 8 bit ha 256 valori): 16000000/1024/256 = 61,035 Hz

Per ottenere circa 100 Hz si deve fare in modo che l'inversione del pin di output si ottenga con qualcosa di meno di 256. Questa modalità usa come top (valore massimo) il contenuto del registro OCR2A. Così facendo si ottiene un'onda con duty cicle del 50% e frequenza dimezzata, ma solo sul canale A (pin 11 di Arduino): sul canale B (pin 3 di Arduino) otterresti un clock doppio ed un duty cicle differente. Allora dobbiamo rifare i calcoli perché la formula cambia: F=CLOCK/PRESCALER/(OCRA+1)/2 Quindi: 100 = 16000000/1024/x+1/2 Da cui: x+1 = 16000000/1024/100/2 x+1 = 78.125 Quindi per OCR2A si deve usare 77. Rifacciamo i conti: 16000000/1024/77+1/2 = 100,16 Hz Quindi tu devi: 1) impostare il timer per lavorare in Fast PWM e top fissato da OCR2A 2) impostare l'inversione dello stato del pin output al raggiungimento di OCR2A 3) impostare il registro OCR2A al valore di 77. 4) mettere il prescaler a 1024 5) mettere in output il pin 11

Mi pare non manchi nulla. Trovi tutti i registri da manipolare nel datasheet.

Grazie mille per la spiegazione !!!! :)