Esempio n. 1
0
void Thermocycler::SetPlateControlStrategy() {
  if (InControlledRamp())
    return;

  if (absf(iTargetPlateTemp - GetPlateTemp()) >= PLATE_BANGBANG_THRESHOLD && !InControlledRamp()) {
    iPlateControlMode = EBangBang;
    iPlatePid.SetMode(MANUAL);
  }
  else {
    iPlateControlMode = EPIDPlate;
    iPlatePid.SetMode(AUTOMATIC);
  }

  if (iRamping) {
    if (iTargetPlateTemp >= GetPlateTemp()) {
      iDecreasing = false;
      if (iTargetPlateTemp < PLATE_PID_INC_LOW_THRESHOLD)
        iPlatePid.SetTunings(PLATE_PID_INC_LOW_P, PLATE_PID_INC_LOW_I, PLATE_PID_INC_LOW_D);
      else
        iPlatePid.SetTunings(PLATE_PID_INC_NORM_P, PLATE_PID_INC_NORM_I, PLATE_PID_INC_NORM_D);

    }
    else {
      iDecreasing = true;
      if (iTargetPlateTemp > PLATE_PID_DEC_HIGH_THRESHOLD)
        iPlatePid.SetTunings(PLATE_PID_DEC_HIGH_P, PLATE_PID_DEC_HIGH_I, PLATE_PID_DEC_HIGH_D);
      else if (iTargetPlateTemp < PLATE_PID_DEC_LOW_THRESHOLD)
        iPlatePid.SetTunings(PLATE_PID_DEC_LOW_P, PLATE_PID_DEC_LOW_I, PLATE_PID_DEC_LOW_D);
      else
        iPlatePid.SetTunings(PLATE_PID_DEC_NORM_P, PLATE_PID_DEC_NORM_I, PLATE_PID_DEC_NORM_D);
    }
  }
}
Esempio n. 2
0
void Thermocycler::SetPlateControlStrategy() {
  if (InControlledRamp())
    return;
    
  if (fabs(m_target_plate_temp - GetPlateTemp()) >= PLATE_BANGBANG_THRESHOLD && !InControlledRamp()) {
    m_plate_control_mode = EBangBang;
    m_plate_pid->SetMode(MANUAL);
  } else {
    m_plate_control_mode = EPIDPlate;
    m_plate_pid->SetMode(AUTOMATIC);
  }
  
  if (m_is_ramping) {
    if (m_target_plate_temp >= GetPlateTemp()) {
      m_is_decreasing = false;
      if (m_target_plate_temp < PLATE_PID_INC_LOW_THRESHOLD)
        m_plate_pid->SetTunings(PLATE_PID_INC_LOW_P, PLATE_PID_INC_LOW_I, PLATE_PID_INC_LOW_D);
      else
        m_plate_pid->SetTunings(PLATE_PID_INC_NORM_P, PLATE_PID_INC_NORM_I, PLATE_PID_INC_NORM_D);

    } else {
      m_is_decreasing = true;
      if (m_target_plate_temp > PLATE_PID_DEC_HIGH_THRESHOLD)
        m_plate_pid->SetTunings(PLATE_PID_DEC_HIGH_P, PLATE_PID_DEC_HIGH_I, PLATE_PID_DEC_HIGH_D);
      else if (m_target_plate_temp < PLATE_PID_DEC_LOW_THRESHOLD)
        m_plate_pid->SetTunings(PLATE_PID_DEC_LOW_P, PLATE_PID_DEC_LOW_I, PLATE_PID_DEC_LOW_D);
      else
        m_plate_pid->SetTunings(PLATE_PID_DEC_NORM_P, PLATE_PID_DEC_NORM_I, PLATE_PID_DEC_NORM_D);
    }
  }
}
Esempio n. 3
0
void Thermocycler::CalcPlateTarget() {
  if (m_current_step == NULL)
    return;
  
  if (InControlledRamp()) {
    //controlled ramp
    double tempDelta = m_current_step->GetTemp() - m_previous_step->GetTemp();
    double rampPoint = (double)GetRampElapsedTimeMs() / (m_current_step->GetRampDurationS() * 1000);
    m_target_plate_temp = m_previous_step->GetTemp() + tempDelta * rampPoint;
    
  } else {
    //fast ramp
    m_target_plate_temp = m_current_step->GetTemp();
  }
}
Esempio n. 4
0
void Thermocycler::CalcPlateTarget() {
  if (ipCurrentStep == NULL)
    return;
  
  if (InControlledRamp()) {
    //controlled ramp
    double tempDelta = ipCurrentStep->GetTemp() - ipPreviousStep->GetTemp();
    double rampPoint = (double)GetRampElapsedTimeMs() / (ipCurrentStep->GetRampDurationS() * 1000);
    iTargetPlateTemp = ipPreviousStep->GetTemp() + tempDelta * rampPoint;
    
  } else {
    //fast ramp
    iTargetPlateTemp = ipCurrentStep->GetTemp();
  }
}