PWM

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

La libreria che citi dovrebbe essere la PWM Frequency library.

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?

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

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

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/(Prescalertop2*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%

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.

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…

simulatorhck:
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.
:wink:

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

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?

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.

ma usare un semplice ne555 come generatore non và bene? :roll_eyes:

BrainBooster:
ma usare un semplice ne555 come generatore non và bene? :roll_eyes:

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

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

Ho fatto cosi

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

Se ti funziona, perché no.

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…

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

Che frequenza generi?
Hai provato con un filtro passa basso per eliminare il problema? Ricordati che il segnale PWM non è un vero e proprio segnale analogico per cui certi dispositivi sentono il continuo passare da stato alto a stato basso.
Ti passo anche questo link, dove puoi aiutarti a calcolare il filtro generandoti anche il segnale risultante.
http://sim.okawa-denshi.jp/en/CRlowkeisan.htm

No per il mio utilizzo serve proprio questo tipo di funzione…Onestamente devo studiare ancora molto per capire che frequenze sto generando…Sto lavorando molto empiricamente …

simulatorhck:
No per il mio utilizzo serve proprio questo tipo di funzione...Onestamente devo studiare ancora molto per capire che frequenze sto generando..Sto lavorando molto empiricamente ...

Purtroppo lavorando con i timer un oscilloscopio, anche di quelli portatili, è quasi indispensabile.