void control_loop() { pinMode( control_pin, OUTPUT ); if(tuning && auto_tune.Runtime()) { finish_autotune(); } else if(!tuning) { pid.SetMode(!config.paused); pid.SetTunings(profiles[config.driving].kp, profiles[config.driving].ki, profiles[config.driving].kd); pid.SetSampleTime(1000 * profiles[config.driving].sample_time); // Update the control value once per second current_target_temp = profiles[config.driving].target_temp; pid.Compute(); } if(last_power != power) { last_power = power; analogWrite(control_pin, power); Serial.print("Log\tpower\t"); Serial.println((100.0 * ((float)power / 255.0))); } }
void update() { if (settings.enabled) { if (autotune_running) { if (pid_autotune.Runtime()) { autotune_running = false; settings.pid.kp = pid_autotune.GetKp(); settings.pid.ki = pid_autotune.GetKi(); settings.pid.kd = pid_autotune.GetKd(); update_pid_tunings(); write_settings(); } } if (! autotune_running) { pid.Compute(); } pid_output_sum += pid_output; pid_output_count++; unsigned long now = millis(); if (now >= window_end_millis) { pid_output_average = pid_output_sum / pid_output_count; if (pid_output_average >= settings.heat_on.threshold) { set_heat(true); } else if (pid_output_average + settings.heat_on.delta <= settings.heat_on.threshold) { set_heat(false); } reset_window(); } } }