In an attempt to control the speed of a DC motor with fairly large current draw (up to 1.8 amps) using PWM, I designed the circuit below:

enter image description here

Unfortunately, I am unable to do more than simply turn the motor on and off. At about 50% duty cycle, the motor turns on and remains the same speed, regardless of how much I vary the cycle, turning off once it's below a 50% duty cycle. I'm fairly confident that this has something to do with the discharge rate of the transistor's internal capacitors, but I'm not too sure how to go about solving this. Any ideas?

For reference, the gate to ground resistor is 10k, while the gate to Arduino resistor is at a value of 330 ohms. enter image description here

Here's the schematic. Apparently, Fritzing is complaining about the diode, saying that it's placed incorrectly, and doesn't do anything, if someone could check it out, I would greatly appreciate :)

  • 3
    \$\begingroup\$ Fritzing can produce schematic diagrams as well as wiring diagrams. Schematic diagrams are of more use than wiring diagrams when discussing the design of circuits. \$\endgroup\$
    – JRE
    Jun 10, 2021 at 8:39
  • \$\begingroup\$ Oh my bad, I'll fix that in an edit. \$\endgroup\$
    – Dude156
    Jun 10, 2021 at 8:39
  • \$\begingroup\$ Ok, and Fixed :) \$\endgroup\$
    – Dude156
    Jun 10, 2021 at 8:57
  • \$\begingroup\$ VCC1 is short circuited in the diagram. What type of transistor is Q1? What type of diode do you have there by the motor (it isn't labeled.) The diode appears to be conencted backwards. \$\endgroup\$
    – JRE
    Jun 10, 2021 at 9:07
  • 1
    \$\begingroup\$ Do you have an oscilloscope? If you have one or have access to one, I suggest you to take a look at the gate to source voltage. With a 330ohm gate resistor, I'm pretty sure that the gate voltage is no where near a square wave. Try a gate resistor of 10ohms or lower (depending on the switching frequency). Also, simulate your circuit and thoroughly probe and test in in order to identify design flaws. \$\endgroup\$ Jun 10, 2021 at 9:54

1 Answer 1


The IRF520 is not the best choice. In your application it is borderline as to whether it will work. This might go some way to explaining your problems.

I'd suggest you choose a mosfet that is 'logic level'. Something like a IRL3705Z. The 'Z' is significant.

330R is a strange value, 10 or 22 ohm is more sensible. This resistor is called a 'gate stopper' to stop potential oscillations when the level is changed. It can be omitted in some situations. A value of 330R only serves to slow the turn on/off of the mosfet which is not what you want. The 10k resistor is just to ensure the mosfet is turned off when the Arduino is in reset or otherwise not actively driving the port pin.

  • \$\begingroup\$ It may help the OP if you explain why 330R is a strange value \$\endgroup\$
    – Frog
    Jun 10, 2021 at 10:07
  • \$\begingroup\$ If the gate resistor is only 10 ohms, isn't there a risk of damaging the Arduino pin, since every time it turns on or off there's a quick 500mA burst as the gate capacitance charges up? \$\endgroup\$
    – Dima
    Aug 31, 2022 at 20:08
  • \$\begingroup\$ The GPIO tends to be thermally limited - if you draw too much current for too long, then it gets hot. The on resistance of the the GPIO mosfets is around 50 Ohms which tends to limit anything too nasty. In retrospect, 330R isn't too excessive, the actual value chosen depends on many things - mosfet, load, voltage etc. \$\endgroup\$
    – Kartman
    Sep 1, 2022 at 6:53

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.