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)));
  }
}
示例#2
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();
      }
    }
  }