Mosfet e Ventolina PC 12V

Buon pomeriggio a tutto il forum.
E' da un sacco che vi seguo attenendomi scrupolosamente al manuale del buon "Lurker", ma oggi devo alzare bandiera bianca e chiedervi un parere :).
Prendendo spunto da http://itp.nyu.edu/physcomp/Tutorials/HighCurrentLoads sto cercando di "costruire" qualcosa di simile, sostituendo al motore una semplice ventolina da PC (12V - 0.16A)

Per quanto riguarda l'hardware ho utilizzato:
*) Un Arduino UNO
*) Un Resistore da 330 Ohm
*) Un LED "generico"
*) Un Potenziometro "generico"
*) Un Diodo 1N4001 (https://www.distrelec.it/ishop/Datasheets/hv1N4001-to-1N4007_E.pdf)
*) Un Mosfet IRF540N (https://www.distrelec.it/ishop/Datasheets/cpIRF540N_Data_E.pdf)
*) Un Alimentatore universale 3V-12V
*) Una ventolina da PC 12V-0.16A

Per quanto riguarda il software invece:
*) L'IDE Arduino 1.0
*) OS X 10.7

Questo è lo schema in Eagle

Mentre questo è quello in Fritzing (lo inserisco poichè e' la prima volta che uso Eagle e non si sa mai... :))

ATTENZIONE: l' alimentazione NON è da 9V ma da 12V

Quello che mi aspetto è che, agendo sul Potenziometro, il LED vari la sua luminosità e la ventolina la sua velocità.
Questo e il "codice" che ho scritto e uploadato sull' Arduino:

const int transistorPin = 9;
const int LedPin = 11;

void setup() {
pinMode(transistorPin, OUTPUT);
pinMode(LedPin, OUTPUT);
}

void loop() {
// read the Potentiometer:
int sensorValue = analogRead(A0);
// map the sensor value to a range from 0 - 255:
int outputValue = map(sensorValue, 0, 1023, 0, 255);
// use that to control the Transistor:
analogWrite(transistorPin, outputValue);
// use that to control the Led:
analogWrite(LedPin, outputValue);
}

Fin qui tutto bene ad eccezione che........ la ventolina non funziona :0 !!!
Il Led invece non da problemi e funziona correttamente.
Come mai? Dove sta l'errore?
Mi potete dare una mano XD?
Thx.

P.S.
Ma quando sull' etichetta della ventolina leggo l'indicazione 12V-0.16A che cosa significa? Che può essere alimentata al massimo con una tensione di 12V e una corrente di 0.16A?

12V-0.16 a vol dire che quella ventola è stata progettata per lavorare a 12v (non al massimo 12v, con tensioni inferiori non è garantito il funzionamento) e 0.16 vol dire che a 12 volt assorbe 0.16A

per il programma aspetta altre voci più esperte, ma (ma se non erro) inizzializzi la variabile sensorvaluo ed outupvalue ogni volta che fail ciclo..forse non è il massimo (e non so se è un vero e proprio errore)

poi cosi ad occhio non mi pare ci siano altri 2errori" di codice (ma la prola agli esperti, l'unica cosa che posso dirti è:

  • il mosfet è collegato correttamente?
  • una resistenzina sul gate ce la metterei (tipo 10 Ohm)

(provato a mettere al posto della ventola un secondo led :wink: (o se hai oscilloscopio!!)

Mah... il codice va anche bene, vista la semplicità dei compiti che deve svolgere.
Non è un errore dichiarare ad ogni ciclo le variabili usate, è il modus operandi di loop che è così, quindi va bene. L'alternativa sarebbe dichiarare le variabili globali per non doverle dichiarare tutte le volte ma non ne vedo la necessità visto che vengono usate solo in loop e non ci sono altre funzioni e che in questo modo si andrebbe ad aumentare la dimensione dello sketch.
Casomai userei un tipo di dati byte per outputValue, visto che tanto deve contenere un valore da 0 a 255.

La ventola non funziona in quanto all'uscita del pwm devi prevedere un circuito RC tale da poter pilotare correttamente il mosfet e garantire anche la necessaria "energia" alla ventola.
Ti posto un circuitino che ho sperimentato con successo, un transistor in grado di sopportare una corrente da 0,5A è più che sufficiente, senza alcun bisogno di scomodare un mosfet.
C'è anche un semplice sketch di prova e qualche spiegazione sull'RC.
Ciao

Ventola12V.docx (15.4 KB)

@Martinix
Per il Led ci avevo fatto un pensierino anche io ma ieri sera ero troppo cotto...
Domanda banalissima: ma se fornisco alla ventolina 12V ma meno corente, che succede? E se ne fornisco di piu'?

@leo72
Intendi una cosa del genere (non ho provato a compilare poiche' non ho sottomano l'IDE)?

int sensorValue = analogRead(A0);
byte outputValue = byte(map(sensorValue, 0, 1023, 0, 255));
analogWrite(transistorPin, outputValue);

@menniti
Se ti dico che quando ho salvato il .docx nella /tmp mi ha chiesto se volevo sovrascrivere il file :astonished:??? Che testa... mi ero proprio dimenticato che avevo visto i tuoi consigli in qualche altro post :slight_smile:
Perche' serve l'RC? Quale e' il suo scopo?

@*
Come avete capito di elettronica me ne intendo meno di zero... :slight_smile:

diciamo il filtro rc in castata al pwm ha l'evvetto di "trasformare" una tensione pulsante (pwm) in una similcontinua.
occhio alcune ventole per pc(quelle tachimetriche) hanno il regolatore di velocità integrato e quindi potresti avere qualche problema

Perfetto, il ragionamento mi è chiaro... :slight_smile:
La mia ventolina è un reperto bellico recuperato da un vecchio bidone... ma il consiglio lo accetto volentieri :slight_smile: (basta ricordarselo però XD)
Nel fine settimana provo ad inserire l'RC e vediamo se risolvo :slight_smile:
Thx.

P.S.
@ub1m4j0r dimenticavo di farti i complimenti per come hai eposto la tua domanda.
se tutti facessero così ci si potrebbe dedicare a risolvere i problemi e non a fare domande :wink:

BrainBooster:
P.S.
@ub1m4j0r dimenticavo di farti i complimenti per come hai eposto la tua domanda.
se tutti facessero così ci si potrebbe dedicare a risolvere i problemi e non a fare domande :wink:

Brain, hai perfettamente ragione!!! +11111
Dopo tanto parlare sul Topic specifico finalmente arriva qualcuno che ci imbocca il problema con un cucchiaino zuccherato e noi facciamo passare la cosa come "normale".
@ub1m4j0r: Effettivamente hai posto la domanda in modo perfetto, fornendo ogni elemento possibile sia dal punto di vista hardware che dal punto di vista software; tant'è che non c'è stato alcun bisogno di farti la solita sfilza di domande per capire il problema ma ti sono state date tutte risposte chiare e funzionali a ciò che cercavi. Segno che ti sei documentato sul serio prima di aprire il Topic. Dovremmo tutti prendere esempio da te. :slight_smile:

ub1m4j0r:
Perche' serve l'RC? Quale e' il suo scopo?

Nel tuo caso non serve a nulla, anzi inserirlo avrebbe effetti deleteri, la ventola non gira perché il mos che stai utilizzando non è un logic level, il gate richiede quasi 4V per inizare ad aprire il canale e quasi 10V per andare in saturazione.
Il diodo in serie tra il positivo del 12V e il drain del mos non serve a nulla, c'è già il diodo intrinseco del canale, tra D e S, che protegge il mos dalle extratensioni dei carichi induttivi, il mos è esagerato rispetto alle reali necessità.
Altro dettaglio, a seconda del tipo di ventola non è detto che sia possibile regolarne la velocità, potresti facilmente trovarti nella situazione che vari solo di poco rispetto ai giri massimi e poi la ventola si ferma.

ub1m4j0r:
@Martinix
Per il Led ci avevo fatto un pensierino anche io ma ieri sera ero troppo cotto...
Domanda banalissima: ma se fornisco alla ventolina 12V ma meno corente, che succede? E se ne fornisco di piu'?

le ventole, avendo un carico fisso, ad una certa tensione, quella per cui son state progettate (12v nel tuo caso) se non son rotte assorbono naturalmente la corrente indicata. puoi darne meno di corrente mettendo uan resistenza (o limitando l'alimentatore) quindi questo vul dire che la tensione che arriva non son più 12v ma saranno meno (quano meno diende), e questo fa girare la ventola poco (nella milgiore ipotesi) oppure non gira per nulla (io mettevo una resistenza sulle ventole dei pc quando le sostituivi ed erano piu potenti e rumorose... cosi giravano menno con meno rumore..ma devi calolare quanto mettere).
ovviamente prima va verificato quanto detto dagli altri sopra!! :slight_smile:
Per il discorso dare più corrente teoricamente non puoi ,almeno che non gli dai uan tensione maggiore col rischio di bruciare tutto,oppure potrebbe asorbire di più se la ventola ha problemi esistenziali suio.

per il discorso di pilotare il mosfet, hai provato a pilotarlo con un drive-mosfet (ora nn ricordo le sigle le ho in laboratorio se vuoi lunedì ti dico) perchè non vorrei che arduino nnc e la facesse ad impulsi ad eccitare a dovere il mosfet (ma qui qualcuno mi contraddica o mi confermi), ovviamente è solo un ipotesi :wink:

Fermo restando che prima va verificato quanto detto sopra dagli altri! :slight_smile:

Un secondo problema è che le ventole hanno un elettronica che pilota il motorino simile a un brushless. A questa elettronica non piace un segnale PWM.
ciao Uwe

@BrainBooster
@menniti
Vi ringrazio per le lodi :slight_smile: Fanno sempre piacere :slight_smile: Spero che possa essere d'esempio anche ad altri.

@menniti
Touchè :)... meglio il miele, più dolce XD

@Martinix
Pefetto. Ho capito il ragionamento :slight_smile:

@astrobeed
@*
Ho provato a seguire i consigli di menniti e ora il circuito sulla breadboard è il seguente:

Dopo aver litigato anche con la corretta polarità dei collegamenti della ventolina, sono riuscito a farla girare :)!!!
Ma.....
Il comportamento che mi sarei aspettato è che quando dal potenziometro leggo "analogRead(A0) = 0" la ventolina non gira è ferma, al crescere di "analogRead(A0)" la ventolina aumenta la sua velocità fino ad un massimo quando il potenziometro restituisce "analogRead(A0) = 1023".
Il comportamento che invece ottengo e che la ventolina correttamente modifica la sua velocità al variare dell' analogRead(A0), restituito dal potenziometro, ma quando questo è a 0 la ventolina gira comunque :astonished:.
Ora, al netto di quanto la ventolina modifichi la sua velocità, è corretto che anche con "analogRead(A0) = 0" giri comunque? E' forse questo uno degli "effetti deleteri"? Oppure è un comportamento corretto dato il tipo di Mosfet "esagerato" che sto usando?

P.S.
Ho controllato che il mapping funziona correttamente: ad un "analogRead(A0) = 0" corrisponde "outputValue = 0"

Beh, però Astrobeed ti aveva spiegato che con un mosfet (a parte che il diodo non ti serve...) non puoi ottenere il risultato sperato perché la sua conduzione non è modulabile; se vuoi vederla funzionare come si deve metti un transistor, applica "alla lettera" il mio schema.

Perfetto. Cerco di procurarmi un transistor allora.
Mi potete suggerire un modello di transistor che faccia al caso mio e che sia di facile reperibilità?
Ultima domanda :).
Ho notato che l' analogRead(A0) del potenziometro a volte è un po ballerino; non ritorna un valore stabile anche se il potenziometro è tutto "chiuso" o tutto "aperto". Per "pulire" la lettura potrei agire via software, effettuando più letture mediandone i valori , oppure via hardware con un filtro RC. E' corretto? In tal caso come scelgo i valori di R e di C? Ci sono delle formule/regole da seguire?
Thx.

ub1m4j0r:
Perfetto. Cerco di procurarmi un transistor allora.
Mi potete suggerire un modello di transistor che faccia al caso mio e che sia di facile reperibilità?
Ultima domanda :).
Ho notato che l' analogRead(A0) del potenziometro a volte è un po ballerino; non ritorna un valore stabile anche se il potenziometro è tutto "chiuso" o tutto "aperto". Per "pulire" la lettura potrei agire via software, effettuando più letture mediandone i valori , oppure via hardware con un filtro RC. E' corretto? In tal caso come scelgo i valori di R e di C? Ci sono delle formule/regole da seguire?
Thx.

Io ho usato un BD371 mi pare, dovrebbe andare bene un BC337, però ne esistono varie versioni; genericamente devi cercare un transitor NPN con corrente di collettore >= 0,5A.
Sull'ingresso analogico prova con la media di una ventina di letture, io per curiosità sperimenterei un C da 1÷10nF (tentativi) tra l'In analogico e massa, con l'idea di "stabilizzare", tenendo conto che la cosa ti rallenterebbe le letture, ma forse linearizzerebbe il comportamento, da provare.