I Mosfet e Arduino, come pilotare carichi

Ciao!

Questo tutorial si pone l'obiettivo di illustrare, in modo semplice, come utilizzare un MOSFET per pilotare carichi con Arduino.
Infatti grazie a questo componente potremo controllare dispositivi che necessitano una (relativamente) alta quantità di corrente, come strisce led, motori, riscaldatori, solenoidi, e molto altro.

Non starò qui a spiegarvi la teoria che sta dietro ai transistor di tipo MOSFET, primo perché non sono la persona più adatta, e secondo perché lo scopo di questo post è solo di avere un primo approccio pratico con questo componente. Vedremo solo alcune dritte pratiche ed alcune caratteristiche con cui dovremo interfacciarsi già dai primi usi.





Veniamo subito al dunque, il mosfet che ho utilizzato in questo caso è un IRF520, dispositivo molto diffuso, infatti è presente anche nello starter kit ufficiale di Arduino.
Questo è un mosfet N-CHANNEL di tipo ENANCHMENT, in pratica significa che permette il passaggio di una corrente tra i pin DRAIN e SOURCE solo se applico una tensione adeguata sul pin GATE.




Il massimo passaggio di corrente (9.2 Ampere a 25°C) potrà avvenire quando applicherò sul GATE una tensione di circa 10V (nel caso dell'IRF520).
Questo significa che se piloterò il gate direttamente con un'uscita digitale di Arduino (5 Volt) il mosfet ammetterà un passaggio di corrente tra drain e source di massimo 2 Ampere (sempre a 25°C, vedi figura 1 di questo datasheet).

Fortunatamente esistono anche mosfet pensati per lavorare con una tensione sul gate di 5v, sono quelli di tipo LOGIC LEVEL come ad esempio i IRLZ44N, i FQP30N06L oppure i STP36NE06.



Un altro fattore da considerare è la frequenza con la quale il nostro Arduino farà commutare il nostro mosfet.
Infatti per pilotare il nostro mosfet non applicherò sul gate semplicemente 5 Volt o 0 Volt con la funzione "digitalWrite", ma utilizzerò la funzione "analogWrite" e quindi il PWM.
Qui potrebbe sorgere un problema però, perchè la frequenza del PWM di Arduino sul pin scelto potrebbe non essere la più adatta per la mia applicazione.

Supponiamo di avere una frequenza di PWM estremamente bassa, per ipotesi 1 hertz, dando il comando "analogWrite (pin, 127)", quindi al 50% (il range è 0-255), avrò per mezzo secondo 5 volt e per mezzo secondo 0 volt, capite che se piloterò un motore riuscirò in qualche modo a variarne la velocità, ma con un risultato pessimo.

In Arduino i pin 3,9,10,11 hanno una frequenza di circa 488hz e i pin 5, 6 di 976hz.
488hz potrebbe essere un valore accettabile, ma dato che Arduino ce lo permette, proviamo ad aumentarla.
Per aumentare la frequenza del PWM agirò (nello sketch) sui timer del mio microcontrollore portando la frequenza del PWM sul pin 9 a 3906 HZ.
Ovviamente bisogna considerare che anche il mosfet impiegherà un certo tempo a passare da uno stato all'altro (nel caso del IRF520 30ns per chiudersi e 20ns per aprirsi) ma nella maggior parte dei casi è possibile trascurare la cosa.


Ecco lo schema per collegare il nostro Arduino ad un piccolo motore DC, come potrete notare è presente un diodo sui poli del motore, questo diodo si vede tipicamente quando voglio pilotare una bobina (ad esempio quello delle bobine dei relè),
La funzione di questo diodo è di limitare la sovratensione provocata dall'induttanza del motore nel momento dell'apertura del mosfet (comportamento tipico dei carichi induttivi).
Questa sovratensione potrebbe danneggiare il vostro mosfet perchè potrebbe addirittura superare la massima Vds (tensione tra drain e source), mettendo un diodo invece la sovratensione si scaricherà sulla stessa bobina del motore.
Un bell'approfondimento su questo argomento lo potete trovare a questo link.

Ultima cosa da notare è che qualche progettista inserisce in serie una resistenza tra l'uscita di Arduino e il Gate del mosfet, questa dovrebbe servire a proteggere la porta di Arduino da eventuali ritorni che potrebbero danneggiarla.
Personalmente, pilotando piccoli carichi, non ho notato questa necessità, ma se volete potete mettere una resistenza da un centinaio di ohm.





Ed ecco lo sketch che leggerà il valore in ingresso analogico sul pin A0, scalerà il valore e lo porterà in uscita sul mosfet.
alla riga 8 potete vedere la funzione che serve ad impostare la frequenza di PWM di 3906 hz sui pin 9 e 10


  1. int trimmer_pin = A0;
  2. int trimmer_val;
  3. int mosfet_pin = 9;
  4. int mosfet_val;
  5. void setup()
  6. {
  7.   TCCR1B = TCCR1B & 0b11111000 | 0x02;      //imposta la frequenza del PWM sui pin 9 e 10 a 31250/8 = 3906 hz
  8.   Serial.begin(9600);
  9.   pinMode(trimmer_pin, INPUT);
  10.   pinMode(mosfet_pin, OUTPUT);
  11. }
  12. void loop()
  13. {
  14.   trimmer_val = analogRead (trimmer_pin);
  15.   Serial.print ("valore ingresso: ");
  16.   Serial.println (trimmer_val);
  17.   mosfet_val = map (trimmer_val, 0, 1023, 0, 255);
  18.   analogWrite (mosfet_pin, mosfet_val);
  19.   Serial.print ("valore pwm uscita: ");
  20.   Serial.println (mosfet_val);
  21. }


Se volete approfondire ulteriormente:

qui trovate un post per fare i primi passi con il PWM di Arduino

qui trovate l'articolo più dettagliato, dal sito di Arduino, che mostra come cambiare le frequenze PWM sui vari pin



Per qualunque cosa lasciate pure un commento qui sotto,

Ciao!
Segui Daniele Alberti su Google+!

2 commenti:

  1. puoi spiegare la funzione della resistenza? grazie

    RispondiElimina
    Risposte
    1. Ciao, è una resistenza di pull down, assicura che il gate sia a zero quando non pilotato.

      Elimina

Lascia un commento qui sotto, ti risponderò il prima possibile!

Related Posts Plugin for WordPress, Blogger...