Sunday, September 12, 2010

Motor Controller Youtube Video

Great success!

I have determined why my mosfets were failing and found a solution.

Thanks to the friendly people over at ecomodder.com.
Permalink to my forum thread: http://ecomodder.com/forum/showthread.php/why-my-homebrew-controller-blowing-mosfets-solved-13805-2.html#post183057

There's a fair bit of detail covering a few weeks of work on the project there. Pretty pictures of my oscilloscope, too.

The reason my mosfets were failing was a large voltage spike on the drain (M- buss bar) causing a high voltage V_DS across the fet. This particular fet (IRLS4030-7PPBF) has a breakdown V_DS (aka V_(BR)DSS) of 100V. Now some sources I have read say this may not kill the fet. Since it seems to be the direct cause, I tend to disagree.

To reiterate, the failure mode is a direct short across drain and source. Once, the gate also shorted to the other two blowing the mosfet driver in turn.

The voltage spike is simply caused by V = L * di/dt. The inductance should be fairly low; the circuit is built with heavy wires and huge buss bars. As it turns out though, you need only a small inductance to generate huge voltages when large currents are involved.

Historically I have been switching 380 amps in 30ns to 50ns, or 12.6A/ns to 7.6A/ns.
I have read that a good buss bar system will have 10nH per inch of bar. Even with just one inch of bar I would get a spike of (12.6A/ns*10nH) = 126V.

To reduce the voltage spike, the answer is simple - reduce dt - by slowing down the mosfet switching.
I put a 100ohm pot between the mosfet driver and the mosfet's gate. Using an oscilloscope to watch the fall time of the drain terminal I could see exactly how fast the mosfet was turning on.
(Turning on the mosfet shorts M- to B- thus powering the motor. This is why the drain terminal falls when the mosfet turns on)
I tuned the pot to get a falltime of 200ns. This gives a di/dt of 1.9A/ns.

It is important to note that I needed to perform this tuning with the starter motor connected! Remember before, turning the controller on with the starter connected would fry the mosfet. I needed to be able to make tiny tiny pulses of power to the motor, so I replaced the microcontroller software with a test program! Instead of outputting PWM to the mosfet, I drove the line high, performed 'x' "nop" opcodes to make a short delay, and drove the line low again, then going to an infinite while loop with the line held low.
This allowed me to pulse the motor, and ensure I was not going to hit a spike high enough to fry the fet.
The initial experiments were only microseconds long, not even enough time for the motor current to be established - preventing me from getting the full brunt of di/dt since the current was too small :)

Eventually I worked my way slowly increasing 'x' for longer pulses of power, all the way to 6 milliseconds. The motor would rotate slightly with this long of a pulse, so I then tried 6ms on, 6ms off, 6ms on again. Long story short, I verified that no pulse would (probably) fry the mosfet, so I reprogrammed my motor controller application to the uC.

Lo and behold, the motor worked first try! At 20% duty cycle the motor begins to turn, and it runs merrily all the way up to full speed at 100%, screaming like a fury :)



At this point I still have only one mosfet installed, which will provide 120A continuous. However the fet is capable of handling much higher currents as long as the duration is short. That's why I'm able to start a motor that draws 380A under locked-rotor conditions (i.e. starting from stationary) When it is turning full speed only draws 70A. The fet would fry and probably explode if I actually locked the rotor before turning the power on. Now I need to add the remaining parts - two mosfets and one diode.

The B+ and M- rails were noticably warmer after running the starter for 30 seconds or so. I'll have to watch for overheating and possibly add forced air :(