Electronic – arduino – PWM’ed DC motor not running when loaded


I am trying to build a robot with the Arduino Uno and the H-Bridge SN75441.

The robot has 2 1.5V rated motors. I set it up with this tuto: http://www.mlbelanger.com/arduino/ard-bot/
So the circuit is like this (I have just not plugged the Arduino Vin pin in the pin 8 of the chip):

(source: mlbelanger.com)

As you can see, the H-Bridge only supports down to 4.5V for the motors. That is why I had to use a 5V power input (adapter 5v @ 1A) to power the motors, with PWM (80/255, giving a 1.5V normally) for regulating the power to 1.5V.

So here goes my problem. I have two cases:

  • one where the motors have no load, which means that the robot is in the air. The motors run at 1.5V @ 0.26A normally.

  • the second one which I have trouble with: it runs at 0.5V @ 0.145A. So the voltage dropped as the load increased. The robot doesnt advance and makes a kinda high-frequency noise. If I use 1.5V AA batteries connected directly to the motor, it runs well so the load is not the problem, but rather the PWM setup somehow.

Best Answer

If you look into the design of the H bridge driver you may be surprised at how it behaves under load conditions. Your PWM ratio is 80/255 = 0.313 and you'd have thought the driver, powered from 5V would produce: -

Vout = 5V x 0.313 = 1.57 volts. But this won't happen. Under light loads I estimate the driver is capable of swinging up to about 4.3V and down to about 1V - this means your assumed target of 5V is in fact more like 3.3V making your real output dc voltage (due to PWM) more like 1.04 volts.

It gets worse under higher load currents. The data sheet specifies that the output can swing up to 3.6 volts and down to 1.2 volts when supplying 1 A. This means, at your specified PWM ratio, the output voltage will be: -

\$\dfrac{80}{255}\times (3.6 - 1.2) V = 0.753 V\$

So, without changing the PWM ratio, at light loads your motor is fed with 1.04 volts and as mechanical load increases this will drop to about 0.75 volts at 1A: -

enter image description here

It's not a good driver for your application really and it's worse if you use worst case (rather than typical) values.