Skip to content

Commit 17f5a0d

Browse files
authored
Merge pull request #99 from eamars/fix_coarse_trickler_pid
Implement a separate PID controller for coarse trickler
2 parents 79a7914 + 3940423 commit 17f5a0d

1 file changed

Lines changed: 31 additions & 20 deletions

File tree

src/charge_mode.cpp

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -237,8 +237,15 @@ void charge_mode_wait_for_complete() {
237237
float fine_trickler_min_speed = fmax(get_motor_min_speed(SELECT_FINE_TRICKLER_MOTOR),
238238
current_profile->fine_min_flow_speed_rps);
239239

240-
float integral = 0.0f;
241-
float last_error = 0.0f;
240+
// Define PID terms
241+
float coarse_trickler_integral = 0.0f;
242+
float fine_trickler_integral = 0.0f;
243+
float coarse_trickler_last_error = 0.0f;
244+
float fine_trickler_last_error = 0.0f;
245+
246+
// Calculate target weight for coarse trickler
247+
// The coarse trickler is suppose to stop ahead of the target weight by an offset
248+
float coarse_trickler_target_charge_weight = fmaxf(0.0f, charge_mode_config.target_charge_weight - charge_mode_config.eeprom_charge_mode_data.coarse_stop_threshold);
242249

243250
TickType_t last_sample_tick = xTaskGetTickCount();
244251
TickType_t current_sample_tick = last_sample_tick;
@@ -261,19 +268,20 @@ void charge_mode_wait_for_complete() {
261268
}
262269
current_sample_tick = xTaskGetTickCount();
263270

264-
float error = charge_mode_config.target_charge_weight - current_weight;
271+
float coarse_trickler_error = coarse_trickler_target_charge_weight - current_weight;
272+
float fine_trickler_error = charge_mode_config.target_charge_weight - current_weight;
265273

266-
// Stop condition
267-
if (error < charge_mode_config.eeprom_charge_mode_data.fine_stop_threshold) {
274+
// Fine & Coarse trickler stop condition
275+
if (fine_trickler_error < charge_mode_config.eeprom_charge_mode_data.fine_stop_threshold) {
268276
// Stop all motors
269277
motor_set_speed(SELECT_FINE_TRICKLER_MOTOR, 0);
270278
motor_set_speed(SELECT_COARSE_TRICKLER_MOTOR, 0);
271279

272280
break;
273281
}
274282

275-
// Coarse trickler move condition
276-
else if (error < charge_mode_config.eeprom_charge_mode_data.coarse_stop_threshold &&
283+
// Coarse trickler stop condition
284+
else if (coarse_trickler_error <= 0 &&
277285
should_coarse_trickler_move) {
278286

279287
should_coarse_trickler_move = false;
@@ -290,33 +298,36 @@ void charge_mode_wait_for_complete() {
290298
}
291299

292300

293-
// Update PID variables
301+
// Update fine trickler speed
294302
float elapse_time_ms = (current_sample_tick - last_sample_tick) / portTICK_RATE_MS;
295-
integral += error;
296-
float derivative = (error - last_error) / elapse_time_ms;
303+
fine_trickler_integral += fine_trickler_error;
304+
float fine_trickler_derivative = (fine_trickler_error - fine_trickler_last_error) / elapse_time_ms;
297305

298306
// Update fine trickler speed
299-
float new_p = current_profile->fine_kp * error;
300-
float new_i = current_profile->fine_ki * integral;
301-
float new_d = current_profile->fine_kd * derivative;
302-
float new_speed = fmax(fine_trickler_min_speed, fmin(new_p + new_i + new_d, fine_trickler_max_speed));
303-
307+
float new_p = current_profile->fine_kp * fine_trickler_error;
308+
float new_i = current_profile->fine_ki * fine_trickler_integral;
309+
float new_d = current_profile->fine_kd * fine_trickler_derivative;
310+
float new_speed = fmaxf(fine_trickler_min_speed, fminf(new_p + new_i + new_d, fine_trickler_max_speed));
304311
motor_set_speed(SELECT_FINE_TRICKLER_MOTOR, new_speed);
305312

306313
// Update coarse trickler speed
307314
if (should_coarse_trickler_move) {
308-
new_p = current_profile->coarse_kp * error;
309-
new_i = current_profile->coarse_ki * integral;
310-
new_d = current_profile->coarse_kd * derivative;
315+
coarse_trickler_integral += coarse_trickler_error;
316+
float coarse_trickler_derivative = (coarse_trickler_error - coarse_trickler_last_error) / elapse_time_ms;
317+
318+
new_p = current_profile->coarse_kp * coarse_trickler_error;
319+
new_i = current_profile->coarse_ki * coarse_trickler_integral;
320+
new_d = current_profile->coarse_kd * coarse_trickler_derivative ;
311321

312-
new_speed = fmax(coarse_trickler_min_speed, fmin(new_p + new_i + new_d, coarse_trickler_max_speed));
322+
new_speed = fmaxf(coarse_trickler_min_speed, fminf(new_p + new_i + new_d, coarse_trickler_max_speed));
313323

314324
motor_set_speed(SELECT_COARSE_TRICKLER_MOTOR, new_speed);
315325
}
316326

317327
// Record state
318328
last_sample_tick = current_sample_tick;
319-
last_error = error;
329+
fine_trickler_last_error = fine_trickler_error;
330+
coarse_trickler_last_error = coarse_trickler_error;
320331
}
321332

322333
// Stop the timer

0 commit comments

Comments
 (0)