pid adjusts

This commit is contained in:
2023-05-04 22:26:02 +02:00
parent 0d79379438
commit 39e143d186
5 changed files with 25 additions and 3 deletions
+4
View File
@@ -81,6 +81,7 @@ static void sample1_menu_cb(int opt) {
// Continue
next_phase();
request_paint();
s_calib.temp1 = 100;
s_calib.sample1 = app_temp_read_oven_raw();
app_heater_enable(false);
break;
@@ -104,6 +105,7 @@ static void sample2_menu_cb(int opt) {
// Continue
next_phase();
request_paint();
s_calib.temp2 = 200;
s_calib.sample2 = app_temp_read_oven_raw();
app_heater_enable(false);
break;
@@ -197,6 +199,8 @@ void screen_calibration(GuiEvent event)
next_phase();
request_paint();
PRINTF("KNOB_REL PH %d\r\n", s_calib.phase);
if (s_calib.phase == PH_DONE) {
app_heater_set_target(0);
app_heater_enable(false);
+2
View File
@@ -188,6 +188,8 @@ void app_task_heater(void *argument)
heaterEnterCritical();
// TODO load from flash
PID_SetTunings(&state.pid, state.tuning_p, state.tuning_i, state.tuning_d);
PID_SetOutputLimits(&state.pid, 0, 100);
PID_SetITermLimits(&state.pid, 0, 100);
PID_Initialize(&state.pid);
heaterExitCritical();
+1 -1
View File
@@ -71,7 +71,7 @@ bool app_knob_pushed() {
void app_knob_push_isr(bool push)
{
PUTCHAR(push ? '#' : '.');
//PUTCHAR(push ? '#' : '.');
BaseType_t yield = pdFALSE;
if (push) {
+15 -2
View File
@@ -13,8 +13,8 @@ static void clampOutput(struct PID *self)
static void clampIterm(struct PID *self)
{
if (self->ITerm > self->outMax) { self->ITerm = self->outMax; }
else if (self->ITerm < self->outMin) { self->ITerm = self->outMin; }
if (self->ITerm > self->iTermMax) { self->ITerm = self->iTermMax; }
else if (self->ITerm < self->iTermMin) { self->ITerm = self->iTermMin; }
}
void PID_Compute(struct PID *self, float input)
@@ -32,6 +32,11 @@ void PID_Compute(struct PID *self, float input)
clampIterm(self);
// Shortcut to reduce overshoot
if (error < 0 && self->ITerm > 0) {
self->ITerm = 0;
}
float dInput = (input - self->lastInput);
@@ -91,6 +96,14 @@ void PID_SetOutputLimits(struct PID *self, float min, float max)
self->outMax = max;
clampOutput(self);
}
void PID_SetITermLimits(struct PID *self, float min, float max)
{
if (min > max) { return; }
self->iTermMin = min;
self->iTermMax = max;
clampIterm(self);
}
+3
View File
@@ -27,6 +27,7 @@ struct PID {
float kp, ki, kd;
uint32_t SampleTimeTicks;
float outMin, outMax;
float iTermMin, iTermMax;
enum PIDCtlMode ctlMode; // false
enum PIDDirection controllerDirection;
};
@@ -41,6 +42,8 @@ void PID_SetSampleTime(struct PID *self, uint32_t new_sample_time);
void PID_SetOutputLimits(struct PID *self, float min, float max);
void PID_SetITermLimits(struct PID *self, float min, float max);
void PID_SetCtlMode(struct PID *self, enum PIDCtlMode mode);
void PID_Initialize(struct PID *self);