Offline
Newbie
Karma: 0
Posts: 33
|
 |
« on: January 28, 2013, 09:50:09 am » |
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
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 226
Posts: 17007
Don't know what I do
|
 |
« Reply #1 on: January 28, 2013, 10:26:34 am » |
La libreria che citi dovrebbe essere la PWM Frequency library. http://arduino.cc/forum/index.php?topic=117425.0Però 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?
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 33
|
 |
« Reply #2 on: January 29, 2013, 03:38:15 am » |
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  .
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 226
Posts: 17007
Don't know what I do
|
 |
« Reply #3 on: January 29, 2013, 03:54:57 am » |
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%
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 226
Posts: 17007
Don't know what I do
|
 |
« Reply #4 on: January 29, 2013, 03:55:49 am » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 33
|
 |
« Reply #5 on: January 29, 2013, 05:41:26 am » |
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...
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 226
Posts: 17007
Don't know what I do
|
 |
« Reply #6 on: January 29, 2013, 05:48:19 am » |
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. 
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 33
|
 |
« Reply #7 on: January 29, 2013, 12:16:43 pm » |
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?
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 226
Posts: 17007
Don't know what I do
|
 |
« Reply #8 on: January 29, 2013, 12:26:35 pm » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Deep south of Italy
Offline
Faraday Member
Karma: 6
Posts: 2955
The quieter you become, the more you can hear
|
 |
« Reply #9 on: January 29, 2013, 12:56:03 pm » |
ma usare un semplice ne555 come generatore non và bene? 
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 226
Posts: 17007
Don't know what I do
|
 |
« Reply #10 on: January 29, 2013, 01:05:26 pm » |
ma usare un semplice ne555 come generatore non và bene?  Se sì può fare con un timer, perché scomodare un componente esterno? 
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 33
|
 |
« Reply #11 on: January 29, 2013, 01:09:26 pm » |
Perchè con il 555 posso solo variare il duty cycle e non potrò mai implementare uno schermino seriale lcd con frequenza e duty cycle 
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 33
|
 |
« Reply #12 on: January 30, 2013, 03:46:26 pm » |
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
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 226
Posts: 17007
Don't know what I do
|
 |
« Reply #13 on: January 30, 2013, 04:39:25 pm » |
Se ti funziona, perché no.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 33
|
 |
« Reply #14 on: January 31, 2013, 03:56:33 pm » |
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...
|
|
|
|
|
Logged
|
|
|
|
|
|