Question on PID Controller and Adaptive Control


Thread Starter


I have designed a DC motor controller board for a treadmill application using PWM. So far, the hardware works okay in open loop. I mean, I can control the duty cycle with the microcontroller. The motor responds really fast to step changes, which is not so desirable in this app. The basic commands given to the treadmill are Start, Stop, Speed up and Speed down. However, I don't have a special controller for this, I need one. The idea is to have a controller which increases/decreases the speed smoothly and mantain the speed under load conditions. I'm also measuring RPM. My first question is: does a PI/PD/PID controller is critical for this?

It turns out that I have been asked to add a new feature to my project: My board should be able to identify the motor and tune the PID values that fit better for that specific motor. If a new motor is connected, I should have an option which allows me to identify the new motor and adjust the controller. In other words, an adaptive control. I need to do it by embedded software, not MATLAB. So, I started to wonder myself if this feature is actually achievable using a microcontroller. I have a 32 bit controller from ARM.

As I'm able to measure RPM, the only thing that comes to my mind now is to see the speed step response. What are your advices?

Many thanks in advance.

Peter Nachtwey

You need to look up system identification and pole placement. I would also use the past to predict the future and use it as a feed forward. Also of this is a lot to do in an embedded application.
Most such workouts allow user, not a algorithm guessing. All motors have or should have response time limiters suitable for the load/motor combination.

There are a half dozen factors your system would need to monitor for a self-adapting system.
You can control your DC motor with open loop by changing PWM duty cycle, but using rate control for transition processes. If you want close velocity loop control, simpler back-EMF feedback maybe helpful.