Go Down

Topic: Burned Mosfet and popped flyback diode.. help! Big DC motor PWM (Read 4776 times) previous topic - next topic



I'm trying to PWM control a monster DC motor.

Motor (fan) is 30amp continous 12vdc and I'm seeing 100amp on start up.

I was attempting to use a http://www.nxp.com/documents/data_sheet/BUK953R5-60E.pdf mosfet

Vds 60V
Id 120A
Ptot 293W
Rds  .003723Ω

Diode was a 1N4004

Schematic less 10k resistor was   Didn't seem to want to work with the 10k.



Code: [Select]

int fan_power = 50;
int fan_commanded;
long time_at_this_power, last_changed_time;
long timer = 60000;

void setup() {
   pinMode(3, OUTPUT);

void loop() {
  fan_commanded = map(fan_power, 0, 100, 0, 255);
  analogWrite(3, fan_commanded);
  time_at_this_power = millis()- last_changed_time;
  if (time_at_this_power > timer){
   fan_power = fan_power + 25;
   last_changed_time = millis();
   if (fan_power > 100){
    fan_power = 50;}

I'm a novice electrical guy.  I'm sure I'm missing something simple.  My guess is either PWM freq too high and diode not fast enough or Diode not up to snuff current or voltage wise?  This did work A-OK with a 10 amp motor.   Would someone please point me in the right direction?   Thanks :)


When the motor current is turned off, it will generate current of its own of the same amount.
1N4004 is only rated for 1A. Need a bigger diode to shunt that current back into the motor to let it dissipate.
Designing & building electrical circuits for over 25 years.  Screw Shield for Mega/Due/Uno,  Bobuino with ATMega1284P, & other '328P & '1284P creations & offerings at  my website.


And 100A is too much for a single TO220 package, you'll fuse the bondwires, whatever the
datasheet says.

Think about something like this: http://uk.farnell.com/ixys-semiconductor/ixfn200n10p/mosfet-n-sot-227b/dp/1427322

Is in a rugged enough package.  Somewhat more on-resistance alas, but 700W rating and lots of
thermal mass make up for this.  Alternatively a pair of TO247 packaged MOSFETs in parallel is
reasonable - soldered onto thick bus-bars preferably.

And at these sorts of power levels a MOSFET driver is a definite requirement - don't imagine a logic level device
driven direct from an Arduino is adequate, get proper 12V powered driver like a MIC4422 to drive the MOSFET

Add a 15V zener to the gate-source directly on the terminals too to protect the gate from over and reverse
voltage.  Layout between MOSFET driver and MOSFET has to be low inductance and short - note this is a
4-terminal MOSFET, one source terminal is used for the load current, one for the gate driver.

Power the driver from a clean filtered 12V, not the main battery, as spikes on the driver supply that will push
right through to the MOSFET gate and pop it, zener or not.

And find at least a 100A peak-rated diode. That will definitely be mounted on the heatsink too, and
be nice and chunky.

Finally remember that difficulty of handling high currents goes up as the square of the current - 100A
is 100 times more tricky than 10A.  100A is well beyond any PCB trace, thick copper wiring
throughout, and ventilate everything, even the wiring can get hot quickly at 30 or 100A.
[ I will NOT respond to personal messages, I WILL delete them, use the forum please ]


Thank you guys so much for the help. 

last question  Would this be handled better with 2-3 of these same mosfets with a good driver in parallel?

I honestly didn't expect this fan to pull so much.   We where running another fan before this one but it only pulled 10-12 amps running and would spike maybe 20-30 at start up.   The fet was warm but well within specs with just a alligator clipped to the sink (for testing).


You shouldn't be expecting, you should be consulting datasheets and measuring!

If you drive multiple MOSFETs from the same driver chip, add a 10 ohm or so gate resistor
to each MOSFET to damp out any differential oscillation modes.

One thought: are you being careful to ramp up drive PWM on this motor - large motors
can have stall currents that are too large for the motor to handle, even briefly, so normally
have current-sensing driver units to protect against this.
[ I will NOT respond to personal messages, I WILL delete them, use the forum please ]


The OP never actually mentioned whether he used a heatsink or not. There are some very substantial TO220 heatsinks available. At 30A, with an RDSon of 3.7 mohms, it should only have dissipated 3.3W (P= I2*R  = 302 * 0.0037 = 3.3W). Based on that, I don't think it was the power dissipation that blew the mosfet. I think it was the back EMF . Here's a 30A diode.
Arduino UNOs, Pro-Minis, ATMega328, ATtiny85, LCDs, MCP4162, keypads,<br />DS18B20s,74c922,nRF24L01, RS232, SD card, RC fixed wing, quadcopter



on start up  a dc motor can easily take at least 10x it's running current - and it only takes a millisecond to blow the drive transistor!

get some (much) bigger devices - and follow the rest of the advice above.



I'm seeing 100amp on start up. 
It looks like that's your problem. If you has a "slow start" circuit (inrush current limiting inductor) , you probably would not have blown the mosfet.
Arduino UNOs, Pro-Minis, ATMega328, ATtiny85, LCDs, MCP4162, keypads,<br />DS18B20s,74c922,nRF24L01, RS232, SD card, RC fixed wing, quadcopter



or a big ntc resistor - can you get them that big?

Don't fancy switching big inductors at that current - the spikes will be energetic and hard to control.

regards  Allan


What is the response time of the motor ? (How long does it need to get up to speed)

50 mS ?

Do you know the winding resistance of the motor ?

If the inrush current is 100A with a voltage of 12V, the "shorted" resistance of the motor = 12/100A
(V = I*R =>< R = V/IINRUSH

12V/100A = 0.12 ohms

Assuming a current inrush inductor rated for 30A has a coil resistance of 0.1 ohms, then the inductor and the motor in series would have a resistance of 0.220 ohms.

If the motor startup time (response time) is 50 mS (0.050 S),

the slope of the current on startup with inrush inductor is:

t = L/R => L = t*R = 0.050 S * 0.22 ohms = 0.011 H (11 mH/50A)

I think such an inductor might be expensive.

Have you considered the possibility tgst your code is to blame?

Have you tried just ramping up the duty cycle one count at a time ?

I tested your code and the motor did a sort of slow start but I honestly don't know how gradually you need to ramp up such a large motor.

What is the motor RPM and how long does it take to ramp up to that rpm when given 100% duty cycle command ? ( I suppose that's academic since your mosfet is blown)
Arduino UNOs, Pro-Minis, ATMega328, ATtiny85, LCDs, MCP4162, keypads,<br />DS18B20s,74c922,nRF24L01, RS232, SD card, RC fixed wing, quadcopter


And the energy stored in the inductor at switch-off is 1/2 x L x I^2  ->  13.75 joules!

That's big spike. Where will it go?

for comparison they reckon it takes 4mJ at a spark plug in an internal combustion engine to light the mixture.




A dc motor turning off is hardly the same as a relay or other device because as you know, when you turn off the motor power the motor does NOT stop instantaneously. The decelerating motor would disipate the energy stored in the inductor because it has such a low resistance. I have not personally tried the proposed circuit but I don't see a problem with such a large rotating mass on turn off.
Arduino UNOs, Pro-Minis, ATMega328, ATtiny85, LCDs, MCP4162, keypads,<br />DS18B20s,74c922,nRF24L01, RS232, SD card, RC fixed wing, quadcopter



  ... and a big flywheel shottky diode does the job of dealing with the off spike..... well OK. But I think you'd need some serious snubber components as well.

The OP wants to pwm control the speed... If directly from the arduino with analog.Write this is about a 1kHz
pwm driven by 0..255  giving 0..100% duty cycle - OK?

L di/dt = V.

so if I apply 12v across your 11mH inductor ( taking the motor as a short for now)
current will rise at 1091/amps second . In 1mS ( the pwm period) it will only get to 1.09 amps.

Hence the inductor is far too large by a factor of at least 30 if we want to deal with 30 amp max.
with 1kHz pwm.

Suggest 220uH/ >50 amp rating  - a bit more achievable. And ramp up/down the speed gently



still think big ntc thermistors might be easier - I know you can get 10 amp ones - siemens, phillips etc  make them.  Use several in parallel. I've used these to reduce inrush on big toroidal mains transformers.


It's 480 Hz or 960 Hz , depending on which pins you use but  this brings us to the question of what iis proper way to ramp up the pwm ? If you send analogWrite(pin, 1);  , what is the duty cycle ? (1/255)*100  or 0.392 %.
But why use analogWrite when you can use the PWM Library ? (@16 kHz)

I = V/R
  = 12V/0.22 ohms (0.12  + 0.1)

How do you get 1091A/ S ?
Arduino UNOs, Pro-Minis, ATMega328, ATtiny85, LCDs, MCP4162, keypads,<br />DS18B20s,74c922,nRF24L01, RS232, SD card, RC fixed wing, quadcopter


Hi Raschemmel...

    well ok - use 16kHz if you want, ( this reduces the inductor size by 16X ), but at these frequencies you're going to have worry about full switchmode power techniques - switching losses, even more fussy snubber efficiency/effectivity tradeoffs.. plus a VERY fussy  layout which you're unlikely to get right first time. And you can't breadboard crudely - a real layout would be required to have any chance.
And you'd probably be better off with a specialised swmode psu chip from LT, Texas, Maxim etc and programme that from the arduino.

It's not a lashup in an evening job. This is a proper product!

I'd go for my ntc thermistor idea -crude and cheap.


ps.. just a thought - don't some cars have variable speed big fans for engne cooling ? Could you get a second hand controller cheap from a scrapyard, and drive that somehow?


Go Up