Go Down

Topic: PWM (Read 1 time) previous topic - next topic

simulatorhck

Salve
Per realizzare una lancia HHO necessito di un generatore di impulsi PWM con possibilità di modifica sia del duty cycle che della frequenza.La parte elettrica è semplicissima e testata con dei mosfet in parallelo sul pin pwm 9 (Leonardo).
Ho anche trovato un codice semplicissimo che fa da dimmer sul pin..Vorrei però avere due trimmer..Uno per il duty e uno per la frequenza..Ho letto qui e la che esiste la libreria Timer1 che potrebbe servire a modificare la frequenza del pwm..Io non sono molto ferrato e mi servirebbe una mano con il codice.
Qualcuno può darmi una mano?
Grazie

leo72

La libreria che citi dovrebbe essere la PWM Frequency library.
http://arduino.cc/forum/index.php?topic=117425.0

Però non so se è compatibile con l'Atmega32U4 della Leonardo.

Altrimenti, posso darti una mano a modificare il codice. Gestire il PWM è relativamente facile, più difficile è modificare la frequenza perché c'è da tener conto del fatto che il timer funziona con un prescaler, che dà dei valori minimi e massimi di frequenza in base ad esso. Se si esce da questi limiti, tocca riconfigurare il timer, e questo porta al blocco della generazione del segnale PWM per qualche istante. Su che ordine di frequenze ragioniamo?

simulatorhck

Grazie per la risposta.
Che per qualche istante il pwm si blocchi non è un problema..le frequenze fisse degli apparecchi commerciali atti a tale uso sono in genere con un frequenza fissa a 100Hz e poi con un potenziometro si va in genere mi pare dai  400HZ fino ai 3KHZ. naturalmente la precisione millesimale non è richiesta come anche il range puo essere maggiore se l'hardware lo consente :).

leo72


Grazie per la risposta.
Che per qualche istante il pwm si blocchi non è un problema..le frequenze fisse degli apparecchi commerciali atti a tale uso sono in genere con un frequenza fissa a 100Hz e poi con un potenziometro si va in genere mi pare dai  400HZ fino ai 3KHZ. naturalmente la precisione millesimale non è richiesta come anche il range puo essere maggiore se l'hardware lo consente :).


Se il range di frequenze è questo, puoi usare il timer 1 (a 16 bit) in modalità Phase Correct PWM con top fissato da OCR1A.
Con questa modalità la frequenza è data da:
Fpwm = Fclk/(Prescaler*top*2*2)
Prescaler vale 8, Fclk sugli Arduino vale 16 MHz, per cui:
con OCR1A come top a 5000 ottieni 100 Hz
ocn OCR1A a 167 ottieni 2994 Hz.

In questo modo vari solo OCR1A con il potenziometro. Per variare il duty cycle devi variare il registro OCR1B.
Il duty cycle è dato da (OCR1B/OCR1A)*100
Quindi se mettiamo hai OCR1A a 5000 e OCR1B a 1000, hai un duty cycle del 20%

leo72

Volevo aggiungere che in questo modo non devi neanche riconfigurare il timer perché la modifica dei registri la puoi fare in tempo reale, così da non avere interruzioni sul segnale PWM.

simulatorhck

Ho capito quello che hai detto ma non so metterlo in pratica hahah
io sto usando questo stupidissimo codice
//pwm.ino
const short pwm=9;
//Sensore analogico per variare il duty cycle
const short sensore=0;
void setup() {
   pinMode(pwm, OUTPUT);
}
void loop() {
   //Variabile che contiene il valore proporzionato letto dal sensore analogico
   byte valore=map(analogRead(sensore),0,1023,0,255);
   //Il valore viene attuato sul piedino PWM
   analogWrite(pwm,valore);
   //Piccola pausa
   delay(10);
}

tra l altro scopiazzato.
Suppongo dovrei aggiungere due pulsanti : uno per avere una frequenza fissa (100hz) e uno per sbloccare un secondo potenziometro che mi variasse la frequenza...

leo72


Ho capito quello che hai detto ma non so metterlo in pratica hahah

Allora ti prendi il datasheet e ti studi i registri per configurare il timer.
;)

Poi ne riparliamo. Se ti do il codice pronto non ti serve a nulla. :P

simulatorhck

ahahah hai anche ragione. Solo che avercelo il tempo :). MI mettero sotto. Curiosità...Vedevo che esiste anche
Timer 4
#bits = 10
Clock speed = 64 MHz
Default prescale = 64
Pins D6, D13

sarebbe possibile utilizzare questo per avere il range piu ampio di cambiamento?

leo72

Per gli usi che ne devi fare tu va bene un qualunque timer a 16 bit, che ti permette inoltre di avere una risoluzione maggiore del timer 4, che è a 10 bit.

BrainBooster

ma usare un semplice ne555 come generatore non và bene? :smiley-roll-blue:

leo72


ma usare un semplice ne555 come generatore non và bene? :smiley-roll-blue:

Se sì può fare con un timer, perché scomodare un componente esterno?  ;)

simulatorhck

Perchè con il 555 posso solo variare il duty cycle e non potrò mai implementare uno schermino seriale lcd con frequenza e duty cycle :)

simulatorhck

Ho fatto cosi
Code: [Select]

//pwm.ino
#include <TimerOne.h>
const short pwmp=9;
const short sensore=0;
const short sensore1=1;
void pwm(char pin, int duty, long microseconds=-1);
void setup() {
pinMode(pwmp, OUTPUT);
Timer1.initialize();
Timer1.start();
}
void loop() {
 
//Variabile che contiene il valore proporzionato letto dal sensore analogico
byte valore=map(analogRead(sensore),0,1023,0,255);
        byte valore1=map(analogRead(sensore1),0,1023,0,255);
//Il valore viene attuato sul piedino PWM
        Timer1.pwm(pwmp,valore,valore1);
        //analogWrite(pwm,valore);
//Piccola pausa
delay(1);
}


ma sempre ad occhio..sembra funzionare ma non so se migliora qualcosa in rendimento

leo72

Se ti funziona, perché no.

simulatorhck

attaccando i mosfet ad un uscita 5 volt 20A di un atx ruotando i trimmer si sente un fischio di frequenza variare muovendo il trimmer frequenza...Su una lampada ad incandescenza pero non si vede risultato...Era piu potente con il solo controllo duty cycle naturalmente...

Go Up