Pages: [1] 2   Go Down
Author Topic: PWM  (Read 1154 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
PWM
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22973
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22973
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22973
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22973
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Poi ne riparliamo. Se ti do il codice pronto non ti serve a nulla. smiley-razz
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ahahah hai anche ragione. Solo che avercelo il tempo smiley. 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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22973
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22973
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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?  smiley-wink
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho fatto cosi
Code:
//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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22973
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Se ti funziona, perché no.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 41
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1] 2   Go Up
Jump to: