StateHandler: first version of pid() for fan

This commit is contained in:
Evgenii Meshcheriakov 2022-10-19 09:46:55 +03:00
parent 2de40ba7c0
commit 4b1ef018dd
3 changed files with 17 additions and 11 deletions

View File

@ -105,7 +105,14 @@ private:
void SetState (state_pointer newstate); void SetState (state_pointer newstate);
bool current_mode; bool current_mode;
Counter value[2] = { { 0, 100 }, { 0, 120 } }; Counter value[2] = { { 0, 100 }, { 0, 120 } };
Counter fan_speed = {80, 1000}; /* motor of fan starts at value 90. probably because of some
* weigh of fan, so voltage within range of 0-89 is not
* sufficient to start motor.
* TODO: Value 89 should be scaled to 0 at some point */
Counter fan_speed = {89, 1000};
/*integral controller for PID. should be global, since it
* accumulates error signals encountered since startup*/
int integral = 0;
int saved_set_value[2] = { 0, 0 }; int saved_set_value[2] = { 0, 0 };
int saved_curr_value[2] = { 0, 0 }; int saved_curr_value[2] = { 0, 0 };
LiquidCrystal *_lcd; LiquidCrystal *_lcd;

View File

@ -134,13 +134,8 @@ StateHandler::stateAuto (const Event &event)
break; break;
case Event::eTick: case Event::eTick:
save (event.value, value[AUTO].getCurrent (), AUTO); save (event.value, value[AUTO].getCurrent (), AUTO);
if(saved_curr_value[AUTO] < saved_set_value[AUTO]) { pid();
fan_speed.inc();
this->A01->write(fan_speed.getCurrent()); this->A01->write(fan_speed.getCurrent());
} else if(saved_curr_value[AUTO] > saved_set_value[AUTO]){
fan_speed.dec();
this->A01->write(fan_speed.getCurrent());
}
break; break;
} }
} }
@ -182,8 +177,12 @@ StateHandler::save (int eventValue, int counterValue, size_t mode)
} }
void StateHandler::pid () { void StateHandler::pid () {
int integral = 0, error = 0; float kP = 0.7, kI = 0.7, kD = 0.7;
int error = 0, last_error = 0, derivative = 0;
error = saved_curr_value[AUTO] - saved_set_value[AUTO]; error = saved_curr_value[AUTO] - saved_set_value[AUTO];
last_error = error;
integral += error;
derivative = error - last_error;
fan_speed.setInit((kP*error) + (kI*integral) + (kD * derivative));
} }

View File

@ -93,7 +93,7 @@ main (void)
* TODO: * TODO:
* - Update current pressure to eTick * - Update current pressure to eTick
*/ */
if(pressure_time == 100) { if(pressure_time == 80) {
pressure = sens.getPressure(); pressure = sens.getPressure();
pressure_time = 0; pressure_time = 0;
} }