Feedforward-Assisted PI Speed Control for Geared DC Motors
Data-driven feedforward plus PI speed control, with automatic position holding, for small geared DC motors — a student research paper under review at the EIUSC International Conference 2026.
Overview
Small geared DC motors such as the N20 are cheap and common in student robots, but they are hard to control smoothly at low speed: friction and breakaway torque make the motor stall or jump, and the low-resolution encoders give noisy speed feedback. A plain PI loop either reacts too slowly or oscillates.
This student project studies a simple, practical fix: a data-driven feedforward term that supplies most of the PWM needed for a given speed — including the extra push to break away from rest — while a PI velocity loop only corrects the remaining error. A small state machine adds automatic position holding, so the wheel stays in place when no speed is commanded.
Paper (under review): “Data-Driven Feedforward-Assisted PI Speed Control with Automatic Position Holding for Geared DC Motors” — Hoang Anh Nguyen Trong, Thuy Dao Le Ngoc, Toan Pham Dang Huu, Uyen Vo Pham Mai, Duy Nhat Tran.
My role
I mentored the student team through the project and the writing of the paper, and I am a co-author. The experiments run on the FabLab’s STM32 self-balancing robot platform, the same robot used in our weekly workshop.
Control architecture
With no speed command, a position loop keeps the wheel at the hold position: speed_ref = Kp,pos(θhold − θ), limited to ±hold_speed_max.
When |ωcmd| exceeds a threshold, a motion profile ramps the speed reference up and down with limited acceleration.
The profile brings the speed to zero; once the measured speed stays below a threshold for several samples, the hold position is updated and the motor returns to HOLD.
A static + breakaway PWM term, identified from measured data, gives most of the drive signal for the requested speed.
Corrects the remaining speed error; the total PWM is saturated to ±100% before the motor driver.
Hall encoders on the motor shaft (7 PPR) give position and velocity; the control loop runs at 200 Hz on the STM32.
Hardware platform
Results
The controller was tested with step speed commands from 0.5 rad/s up to 5.0 rad/s (see the plots in the banner above and the demo video). Detailed results will be added here once the paper is published.