First of, since I come from web programming world, I'm pretty new into electronics and maybe some of the things I'm doing are wrong or could be done better, so any hint is highly appreciated.

I'm building a robot/crawler with 4 wheels. Each wheel is directly connected to a 6V 210RPM Motor DC with encoders.

I have a dual-way motor driver with 2 H-bridges

The driver is powered from an LiPo 2S battery 7.4 V

enter image description here

2 right motors are connected in parallel to one H-bridge and 2 left motors to the second H-bridge of the driver.

I'm controlling the motors through an arduino UNO by sending PWM signals to the PWMs of the driver.

Since the motors have encoders, I could read the rotations of one encoder from each side (one from left and one from right) and adjust dynamically the PWM for the other side, by taking the slower side as a master and the faster one as a slave, to force them move in sync.

The problem I have is that the motors which are connected in parallel move with different speed, although they receive the same voltage / PWM signal. Also their specs are identical.

I understand that mechanically they are not identical and different factors can affect their performance, but how to solve this problem? Is it possible?

Here are my ideas:

  • Does it make sense to read the encoder values from both motors connected in parallel? I think not, because if I'd try to lower/increase the PWM - both would be affected and the faster motor would still be faster.
  • Maybe attaching a resistor to the faster motor and trying to find a good value for the faster motor to slow it down up to the moment when it rotates in sync with the other one. But then this would work only if their speed difference is also proportional.
  • Last idea is to match them by the least speed difference and to connect in parallel those pairs which are closest to each other.

Maybe there are other proper ways to solve the problem which I have no idea of. But from the big amount of similar projects I found in internet, I guess they have a solution for this. Or maybe nobody cares that the front wheel of the right side would rotate slower than the back wheel from the same side?

  • \$\begingroup\$ What kind of motors are these? brushed DC motors have a preferred direction of turning. Anyways you have to individually control them, there are always enough manufacturing difference to make them not be equal enough to not worry about \$\endgroup\$
    – PlasmaHH
    Sep 26, 2017 at 12:46
  • \$\begingroup\$ Yes, these are 6V brushed DC motors. Should I consider buying another driver for the other 2 motors and control all 4 individually? Thank you \$\endgroup\$
    – gsdaemon
    Sep 26, 2017 at 12:52

1 Answer 1


DC Motors will always run at different speeds.

If you have two motors in parallel on one driver and are only sensing speed from one of them then the other motor's speed will be unpredictable if and when the motors are not mechanically connected. There is no real way to correct that using electronics without adding separate drivers and feedback for each motor.

If the motors are driving wheels that touch the ground and the torque difference between them is not great enough to cause the "tires" to slip this may not be a problem since the contact with ground will act as a mechanical coupling between the motors. Note: That is how the drive wheels on your car stay at the same speed despite going through a differential gearbox. Loss of ground contact can cause some odd effects though.

Otherwise it is prudent to run a timing belt, or other mechanical linkage, between the motor shafts to keep them together. If your crawler has tracks this is a non-issue.

In some cases it may be possible to share the driver over both motors. That is, have a switching arrangement that channels power to each motor a percentage of the time, giving more percentage to the slower motor. However, that would of course reduce the performance of each motor by 50% when both are at speed. But that gets complicated and does not buy you much compared to having individual drive to all four motors.

  • \$\begingroup\$ Thank you for the fast answer. This gave me a better picture of the whole thing, since I wasn't sure I'm doing it right or terribly wrong. The crawler has no tracks, but its wheels will most of the time touch the ground, so if that's not a problem, than this is perfect. Also I might consider buying a new driver for the other 2 motors and make the in perfect sync via software. Regarding the switching arrangement, I suppose this is a separate device which would stay between the driver and the motors connected in parallel? \$\endgroup\$
    – gsdaemon
    Sep 26, 2017 at 13:56
  • \$\begingroup\$ @gsdaemon yes,as you suspect, it would be a new stage in between. But again, by the time you do that, you could have built/added another driver. \$\endgroup\$
    – Trevor_G
    Sep 26, 2017 at 13:59
  • 1
    \$\begingroup\$ Yeah, that's exactly what a differential gear would do. gsdeamon can detect that state with the individual speed sensors and reduce the outer voltage until the slipping has gone. \$\endgroup\$
    – Janka
    Sep 26, 2017 at 14:25
  • 1
    \$\begingroup\$ Trevor objected because the torque is the same with one motor running freely while the other is stuck, the speed may begin to differ. This is because the working point of the two drives is not the same anymore. It's true, but then again this is an exceptional situation. As long both wheels are connected by the ground contact, you should be fine. Don't forget to check whether the speed of the individual drives differs too much. \$\endgroup\$
    – Janka
    Sep 26, 2017 at 15:12
  • 1
    \$\begingroup\$ Alright, so the best way which would fit my needs it to either buy a second driver, or leave them as is and rely on the mechanical coupling by the ground contact. Also I would read all 4 motors speeds and take as a master value the lower speed between higher speeds of the right and left side. Something like: LHigh = (L1 > L2 ? L1 : L2); RHigh = (R1 > R2 ? R1 : R2); SideToLowerPWM = (LHigh < RHigh ? 'RIGHT' : (LHigh > RHigh ? 'LEFT' : 'NONE')); I'll have to take the higher speeds from each side, because when one of the wheels will stall, the crawler would stop. Also a check for 0 is needed \$\endgroup\$
    – gsdaemon
    Sep 26, 2017 at 16:15

Your Answer

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

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