Why does my Arduino desk controller stutter when I move the joystick slowly?

Nov 04, 2026 Last reply: 1 minute ago 5 Replies

First reply

pete.porter

That juddering you're seeing at low PWM settings is a very common issue when using geared DC motors, especally if those are worm gear types. It's usually not just the duty cycle, but the interplay between the low torque output of the motor at low speed and the static friction…

Read the full reply

So I built a little Arduino controller for my manual crank desk, using a windshield wiper motor and one of those dual channel driver boards. Everything works fine at full speed, but when I ease the joystick forward to creep the desk up slowly, the motor kind of judders and stalls instead of moving smoothly. Push it all the way and it glides no problem.



Is that just what happens when you PWM a cheap motor way down, or am I doing something wrong? I thougt dropping the duty cycle would give me a nice slow crawl but it seems like there's some minimum speed it needs before it acutally turns. I read somewhere that worm gear motors don't like low duty cycles, is that true?



I've got current sensing on the motor so I can see it spiking whenever it judders, like it's fighting itself. Power supply is a 12V one rated well above what the motor draws. Not looking to build anything fancy, I just want it to creep gently instead of lurching. Any ideas what to check first?


That juddering you're seeing at low PWM settings is a very common issue when using geared DC motors, especally if those are worm gear types. It's usually not just the duty cycle, but the interplay between the low torque output of the motor at low speed and the static friction of the mechanism itself. Worm gears, specifically, often have a high backlash or mechanical resistance, meaning they need a certain amount of rotational force just to break free and start turning. If your duty cycle is so low that the motor's low-speed torque output is weaker than that static friction, it will stall or chatter before it can actually move the desk smoothly.

What you are likely experiencing is a mechanical torque threshold. Even if you are providing a steady 5% duty cycle, if the motor can't generate enough current to overcome the physical resistance of the gears and the load, it will fight against itself, causing the judder. Your current sensor spiking confirms it's trying to draw more power than it's actually being supplied in that low PWM range. You mentioned you have a 20A threshold, which is plenty of headroom, but the issue is likely insufficient sustained torque at that frequency.

Since you want smooth creeping, one simple check is to see if there is any way to slightly increase the average voltage or current delivery at the lowest possible PWM settings, even if the motor is just barely moving. If the motor is under a very light load, sometimes a slight bump in power helps it overcome the initial sticking. If that doesn't work, you might want to look at the gear reduction itself. If you've used a very high gear ratio, the torque at the output will be massive, but the motor has to work harder just to turn the gearbox itself when moving slow.

Another option, though more complex, woud be to switch from pure PWM speed control to a method that controls the voltage directly while also monitoring current, but for a home setup, dialing in that mechanical resistance is usually the first and easiest step. Try reducing the mechanical load by ensuring the system is perfectly seated and nothing is binding before you push the duty cycle down.

Yep, this tracks with what I hit on my own wiper motor build. Ran mine at the default PWM frequency and got the same stutter at low duty, then bumped the frequency way up and the creep mode got silky smooth. The motor was basically getting kicked in pulses instead of a steady flow. Mine also had a slight dead zone, so I added a tiny minimum duty below the joystick zero point just to keep it turning. No numbers to share, just tweak it until the stall disappears.

I'm a total beginner with this stuff so take it with a grain of salt, but I had a similar thing with a cheap pump hooked to a driver board. What helped me was just adding a small offset in the code, like if the joystick is barely moved I force a minimum duty so it never runs in the stall zone. Might be an easy win before messing with hardware. Does your joystick reading actually map down to near zero, or is there a dead band in the middle you could trim out?

Yeah this is normal behavior for a brushed motor at very low duty cycle. I do this for a living, and the desk I built at work moves somthing like 40mm per second at 100%, so I just accepted it needs around 15% duty to actually turn and mapped the bottom of the joystick travel to that. Anything below the breakaway point just heats the motor without moving the desk, wich is worse than a slightly fast minimum speed. If you want true slow crawl later, a bigger gear reduction is the real fix, not lower duty.

On mine the fix was the capacitor, of all things. I'd slapped a little ceramic across the motor terminals thinking it was just for noise, but once I swapped it for a bigger electrolytic the stutter at low speed basically vanished. Something about smoothing out the current dips between pulses. Might be worth a try since you already have the driver board set up and it's a two minute change. Also check your PWM frequency isn't sitting in the audible range, mine whined horribly before I moved it up.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required