2018-10-26 07:06 AM
Hello,
I have a L432KC Nucleo. I would like to build a PID or PI software to control the speed of a DC motor. The closed loop element is a speed sensor to monitor RPM. I would appreciate if anyone has resources to share about developing this controller using STM32.
2018-10-26 07:20 AM
Do you understand the principles of PID control?
They are long-established, well-documented and widely-used - not at all specific to STM32 ...
2018-10-26 02:06 PM
how do you control the speed of the motor ?
did you decide on a motor ? which type ?
PID is easy enough to run, a little difficult to get a perfect result...
the RPM sensor would usually generate and interrupt or increment a counter...
2018-10-26 02:41 PM
I'm controlling a brushed DC motor via PWM. The hardware actually works, my project is just missing the software PID controller. I can manually control the duty cycle through CCR1 register. I'm measuring RPM using a reflective sensor and PWM input mode.
2018-10-26 03:03 PM
did you calculate the RPM already ?
PID..
Current RPM 1000
Requested RPM 2000
PID has 3 elements to be added:
current error is targetRPM / RPM ;; 2000/1000 = 2
multiply that by a constant to get it to a usable number, lets try 1
Current Error = 2 ; // first element of PID // (double the RPM requested in this element)
Historical error, is the sum of all errors in the last 1 minute(ish)
lets say we use 30 readings for the Historical error;
Herror = Herror *29/30 + Cerror; // second element Herror
RateOFChange = Herror - LastHerror; // over the last reading
// you may want to use a few readings for better stability.
RateofChange, this is the most difficult to get right. // third element
if the Current RPM is not changing , the historical error will level out RateofChange will go to zero
you want to predict the next PWM setting...
set the PID to be a percentage.. ie, increase speed by 3%
Next PWM setting = CurrentPWM * ( 1+PID)