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+!

7 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
  2. Sempre a proposito di quella resistenza: ma come hai fatto a calcolarne il valore? Se serve solo per portare a ground il piedino del gate quando non c'è segnale, si poteva anche utilizzare una resistenza più alta? tipo di qualche MOhm?

    RispondiElimina
    Risposte
    1. Ciao, si esatto serve a portare a terra il piedino del gate, il valore è un valore che deve essere più basso possibile per aumentarne l'effetto, ma abbastanza alto da non far passare troppa corrente. In generale 10k è un valore molto usato che non da problemi.

      Elimina
  3. Ciao Daniele, seguo spesso i tuoi post... Oggi, mi è salito un dubbio... Il mosfet colegato al pin 9, come spieghi, con una modifica sullo sketch, avremo una frequenza maggiore..fin qui ok.
    Ma se devo collegare più mosfet, ipotesi 2 mosfet pilotati con 2 analogici, posso usare anche il pin10?
    Quindi, A0 su pin 9 e A1 su pin10... Cambiando i valori sugli analogici, ho i settaggi delle frequenze modificate su entrami i pin,vero?
    Grazie in anticipo.

    RispondiElimina
    Risposte
    1. Ciao, si la frequenza del PWM sarà uguale per entrambi i pin, ma le uscite rimarranno comunque indipendenti. Utilizzando la funzione analogWrite andrai a modificare il duty cicle e non la frequenza, quindi varierai la velocità dei motori

      Elimina
  4. La resistenza in serie serve. I mosfet dell'AVR, come tutti i fet, si comportano come resistenze, si scaldano in funzione della corrente che ci passa. Il mosfet esterno, come tutti i mosfet, assorbe (meglio, immagazzina) corrente durante la commutazione. più veloce commuti, più corrente ci passa e più calore si svilupperà nel mosfet dell'AVR, distruggendolo. D'altro canto più sarà alta la resistenza più tempo ci metterà il mosfet esterno a commutare e più si scalderà. Se pubblichi qualcosa dovresti far meglio i compiti ;-).
    Perché usare un mosfet da 8A pilotato male per ottenere solo 2A e non usarne uno da 2,5A pilotato bene? Tra l'altro sia sulla breadboard che sulla millefori http://www.vishay.com/docs/91308/sihld24.pdf è più facile da montare, meno ingombrante e meno pericoloso per eventuali cortocircuiti.

    RispondiElimina

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

Related Posts Plugin for WordPress, Blogger...