@@ -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