# 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): http://www.mlbelanger.com/wp-content/uploads/ard-bot_h-bridge.jpg

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.

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: -

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

• But does this really justify the inversely proportionnal load and voltage? This sounds more like the minimum ajd maximum to "take into consideration" here, depending on other circumstances... but maybe I am wrong? Because if I test with the 1.5v alkaline battery it just stays 1.5v no matter what. – user35485 Jan 13 '14 at 18:00
• I can only say that there's been a few folk caught out with this problem. – Andy aka Jan 13 '14 at 21:57
• So you're also saying that I should get another H-bridge? I thought this one was a popular one... – user35485 Jan 14 '14 at 1:36
• I don't think it's very suitable for your application unless you can live with the losses and stabilize with a control loop. – Andy aka Jan 14 '14 at 8:25
• Hm, so I should rather build a custom circuit with diodes and transistors? – user35485 Jan 14 '14 at 9:31

The problem appears to be a lack of positional feedback.

The motors will run as expected in free air however as soon as they are mechanically loaded, then you need to know the position of the rotor so you can slow down the PWM and allow the shaft to turn.

Try reducing your switching frequency as the load increases. This will allow more power to be delivered to the windings for a longer period which should allow them to turn. Ideally, you need a feedback mechanism which will tell your processor the position of the rotor and whether to prolong the drive pulse in order to reach the next winding contact/brush point within the motor.

Secondly, there is a profound difference between a "H-Bridge Driver" and the actual "H-Bridge". The driver IC's task is solely to saturate the Base/Gate of a series of 4 Power MOSFETs/BJTs in a H-Configuration as illustrated here:

Attempting to drive the load directly from the driver IC may permanently damage it as it is not designed to do so.

• Hm, I don't actually have the components for feedback (an encoder I guess). Is there another way around? – user35485 Jan 13 '14 at 7:42

You don't take into account the voltage drop that the output transistors introduce, it can be as high as 1.5v for the high side and 2v for the low side as the current increases (specified @1A).

You have calculated the PWM duty ratio to output a percentage of the input voltage but as the current requirement of the motor increased (when it gets loaded) there will be an additional voltage drop (VCE drop) on the output transistors, plus I don't know if the 12v supply drops too.

Normally you need some kind of feedback to detect the output current and alter the duty of the PWM accordingly.

• Yeah, I am thinking of getting the voltage going to the motors with an Arduino digital pin... is that ok? I mean, should I worry about spikes or anything (this chip should include diodes afaik). – user35485 Jan 13 '14 at 18:05
• @user35485 A digital pin can't measure the voltage you'll need an analog pin. I don't think I would connect the voltage of the motor directly to an I/O pin, it's usually a good idea to add a buffer like an opamp. – alexan_e Jan 13 '14 at 18:22
• doesn't it support up to 5.5v? Why would there be risks? – user35485 Jan 14 '14 at 1:43
• @user35485 The risks are because each time an inductor's supply is removed (i.e. at the PWM switching transitions), back-EMF is produced by the inductor with spikes that may well exceed the supply voltage. The coils of the motor are inductors. There's a strong possibility of fried Arduino. – Anindo Ghosh Jan 14 '14 at 3:56
• @AnindoGhosh yeah but the driver includes flyback diodes.. so that should do it? – user35485 Jan 14 '14 at 5:37