|
|
@ -109,7 +109,7 @@ static volatile bool temp_meas_ready = false; |
|
|
|
static float temp_iState_min_bed; |
|
|
|
static float temp_iState_max_bed; |
|
|
|
#else //PIDTEMPBED
|
|
|
|
static unsigned long previous_millis_bed_heater; |
|
|
|
static unsigned long previous_millis_bed_heater; |
|
|
|
#endif //PIDTEMPBED
|
|
|
|
static unsigned char soft_pwm[EXTRUDERS]; |
|
|
|
|
|
|
@ -377,8 +377,8 @@ void updatePID() |
|
|
|
} |
|
|
|
|
|
|
|
int getHeaterPower(int heater) { |
|
|
|
if (heater<0) |
|
|
|
return soft_pwm_bed; |
|
|
|
if (heater<0) |
|
|
|
return soft_pwm_bed; |
|
|
|
return soft_pwm[heater]; |
|
|
|
} |
|
|
|
|
|
|
@ -527,12 +527,13 @@ void manage_heater() |
|
|
|
dTerm[e] = (PID_PARAM(Kd,e) * (pid_input - temp_dState[e]))*K2 + (K1 * dTerm[e]); |
|
|
|
pid_output = pTerm[e] + iTerm[e] - dTerm[e]; |
|
|
|
if (pid_output > PID_MAX) { |
|
|
|
if (pid_error[e] > 0 ) temp_iState[e] -= pid_error[e]; // conditional un-integration
|
|
|
|
if (pid_error[e] > 0 ) temp_iState[e] -= pid_error[e]; |
|
|
|
pid_output=PID_MAX; |
|
|
|
} else if (pid_output < 0){ |
|
|
|
if (pid_error[e] < 0 ) temp_iState[e] -= pid_error[e]; // conditional un-integration
|
|
|
|
if (pid_error[e] < 0 ) temp_iState[e] -= pid_error[e]; |
|
|
|
pid_output=0; |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
temp_dState[e] = pid_input; |
|
|
|
#else |
|
|
@ -624,18 +625,18 @@ void manage_heater() |
|
|
|
pid_input = current_temperature_bed; |
|
|
|
|
|
|
|
#ifndef PID_OPENLOOP |
|
|
|
pid_error_bed = target_temperature_bed - pid_input; |
|
|
|
pTerm_bed = bedKp * pid_error_bed; |
|
|
|
temp_iState_bed += pid_error_bed; |
|
|
|
temp_iState_bed = constrain(temp_iState_bed, temp_iState_min_bed, temp_iState_max_bed); |
|
|
|
iTerm_bed = bedKi * temp_iState_bed; |
|
|
|
|
|
|
|
//K1 defined in Configuration.h in the PID settings
|
|
|
|
#define K2 (1.0-K1) |
|
|
|
dTerm_bed= (bedKd * (pid_input - temp_dState_bed))*K2 + (K1 * dTerm_bed); |
|
|
|
temp_dState_bed = pid_input; |
|
|
|
|
|
|
|
pid_output = pTerm_bed + iTerm_bed - dTerm_bed; |
|
|
|
pid_error_bed = target_temperature_bed - pid_input; |
|
|
|
pTerm_bed = bedKp * pid_error_bed; |
|
|
|
temp_iState_bed += pid_error_bed; |
|
|
|
temp_iState_bed = constrain(temp_iState_bed, temp_iState_min_bed, temp_iState_max_bed); |
|
|
|
iTerm_bed = bedKi * temp_iState_bed; |
|
|
|
|
|
|
|
//K1 defined in Configuration.h in the PID settings
|
|
|
|
#define K2 (1.0-K1) |
|
|
|
dTerm_bed= (bedKd * (pid_input - temp_dState_bed))*K2 + (K1 * dTerm_bed); |
|
|
|
temp_dState_bed = pid_input; |
|
|
|
|
|
|
|
pid_output = pTerm_bed + iTerm_bed - dTerm_bed; |
|
|
|
if (pid_output > MAX_BED_POWER) { |
|
|
|
if (pid_error_bed > 0 ) temp_iState_bed -= pid_error_bed; // conditional un-integration
|
|
|
|
pid_output=MAX_BED_POWER; |
|
|
@ -648,13 +649,13 @@ void manage_heater() |
|
|
|
pid_output = constrain(target_temperature_bed, 0, MAX_BED_POWER); |
|
|
|
#endif //PID_OPENLOOP
|
|
|
|
|
|
|
|
if((current_temperature_bed > BED_MINTEMP) && (current_temperature_bed < BED_MAXTEMP)) |
|
|
|
{ |
|
|
|
soft_pwm_bed = (int)pid_output >> 1; |
|
|
|
} |
|
|
|
else { |
|
|
|
soft_pwm_bed = 0; |
|
|
|
} |
|
|
|
if((current_temperature_bed > BED_MINTEMP) && (current_temperature_bed < BED_MAXTEMP)) |
|
|
|
{ |
|
|
|
soft_pwm_bed = (int)pid_output >> 1; |
|
|
|
} |
|
|
|
else { |
|
|
|
soft_pwm_bed = 0; |
|
|
|
} |
|
|
|
|
|
|
|
#elif !defined(BED_LIMIT_SWITCHING) |
|
|
|
// Check if temperature is within the correct range
|
|
|
@ -698,23 +699,23 @@ void manage_heater() |
|
|
|
//code for controlling the extruder rate based on the width sensor
|
|
|
|
#ifdef FILAMENT_SENSOR |
|
|
|
if(filament_sensor) |
|
|
|
{ |
|
|
|
meas_shift_index=delay_index1-meas_delay_cm; |
|
|
|
if(meas_shift_index<0) |
|
|
|
meas_shift_index = meas_shift_index + (MAX_MEASUREMENT_DELAY+1); //loop around buffer if needed
|
|
|
|
{ |
|
|
|
meas_shift_index=delay_index1-meas_delay_cm; |
|
|
|
if(meas_shift_index<0) |
|
|
|
meas_shift_index = meas_shift_index + (MAX_MEASUREMENT_DELAY+1); //loop around buffer if needed
|
|
|
|
|
|
|
|
//get the delayed info and add 100 to reconstitute to a percent of the nominal filament diameter
|
|
|
|
//then square it to get an area
|
|
|
|
//get the delayed info and add 100 to reconstitute to a percent of the nominal filament diameter
|
|
|
|
//then square it to get an area
|
|
|
|
|
|
|
|
if(meas_shift_index<0) |
|
|
|
meas_shift_index=0; |
|
|
|
else if (meas_shift_index>MAX_MEASUREMENT_DELAY) |
|
|
|
meas_shift_index=MAX_MEASUREMENT_DELAY; |
|
|
|
if(meas_shift_index<0) |
|
|
|
meas_shift_index=0; |
|
|
|
else if (meas_shift_index>MAX_MEASUREMENT_DELAY) |
|
|
|
meas_shift_index=MAX_MEASUREMENT_DELAY; |
|
|
|
|
|
|
|
volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] = pow((float)(100+measurement_delay[meas_shift_index])/100.0,2); |
|
|
|
if (volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] <0.01) |
|
|
|
volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM]=0.01; |
|
|
|
} |
|
|
|
volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] = pow((float)(100+measurement_delay[meas_shift_index])/100.0,2); |
|
|
|
if (volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] <0.01) |
|
|
|
volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM]=0.01; |
|
|
|
} |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
@ -838,9 +839,9 @@ float temp; |
|
|
|
|
|
|
|
temp=filament_width_meas; |
|
|
|
if(filament_width_meas<MEASURED_LOWER_LIMIT) |
|
|
|
temp=filament_width_nominal; //assume sensor cut out
|
|
|
|
temp=filament_width_nominal; //assume sensor cut out
|
|
|
|
else if (filament_width_meas>MEASURED_UPPER_LIMIT) |
|
|
|
temp= MEASURED_UPPER_LIMIT; |
|
|
|
temp= MEASURED_UPPER_LIMIT; |
|
|
|
|
|
|
|
|
|
|
|
return(filament_width_nominal/temp*100); |
|
|
@ -938,7 +939,7 @@ void tp_init() |
|
|
|
#if TEMP_1_PIN < 8 |
|
|
|
DIDR0 |= 1<<TEMP_1_PIN; |
|
|
|
#else |
|
|
|
DIDR2 |= 1<<(TEMP_1_PIN - 8); |
|
|
|
DIDR2 |= 1<<(TEMP_1_PIN - 8); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
#if defined(TEMP_2_PIN) && (TEMP_2_PIN > -1) |
|
|
@ -1441,27 +1442,27 @@ ISR(TIMER0_COMPB_vect) |
|
|
|
if (soft_pwm_0 > 0) { |
|
|
|
// turn ON heather only if the minimum time is up
|
|
|
|
if (state_timer_heater_0 == 0) { |
|
|
|
// if change state set timer
|
|
|
|
if (state_heater_0 == 0) { |
|
|
|
state_timer_heater_0 = MIN_STATE_TIME; |
|
|
|
} |
|
|
|
state_heater_0 = 1; |
|
|
|
WRITE(HEATER_0_PIN, 1); |
|
|
|
// if change state set timer
|
|
|
|
if (state_heater_0 == 0) { |
|
|
|
state_timer_heater_0 = MIN_STATE_TIME; |
|
|
|
} |
|
|
|
state_heater_0 = 1; |
|
|
|
WRITE(HEATER_0_PIN, 1); |
|
|
|
#ifdef HEATERS_PARALLEL |
|
|
|
WRITE(HEATER_1_PIN, 1); |
|
|
|
WRITE(HEATER_1_PIN, 1); |
|
|
|
#endif |
|
|
|
} |
|
|
|
} else { |
|
|
|
// turn OFF heather only if the minimum time is up
|
|
|
|
if (state_timer_heater_0 == 0) { |
|
|
|
// if change state set timer
|
|
|
|
if (state_heater_0 == 1) { |
|
|
|
state_timer_heater_0 = MIN_STATE_TIME; |
|
|
|
} |
|
|
|
state_heater_0 = 0; |
|
|
|
WRITE(HEATER_0_PIN, 0); |
|
|
|
// if change state set timer
|
|
|
|
if (state_heater_0 == 1) { |
|
|
|
state_timer_heater_0 = MIN_STATE_TIME; |
|
|
|
} |
|
|
|
state_heater_0 = 0; |
|
|
|
WRITE(HEATER_0_PIN, 0); |
|
|
|
#ifdef HEATERS_PARALLEL |
|
|
|
WRITE(HEATER_1_PIN, 0); |
|
|
|
WRITE(HEATER_1_PIN, 0); |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
@ -1472,22 +1473,22 @@ ISR(TIMER0_COMPB_vect) |
|
|
|
if (soft_pwm_1 > 0) { |
|
|
|
// turn ON heather only if the minimum time is up
|
|
|
|
if (state_timer_heater_1 == 0) { |
|
|
|
// if change state set timer
|
|
|
|
if (state_heater_1 == 0) { |
|
|
|
state_timer_heater_1 = MIN_STATE_TIME; |
|
|
|
} |
|
|
|
state_heater_1 = 1; |
|
|
|
WRITE(HEATER_1_PIN, 1); |
|
|
|
// if change state set timer
|
|
|
|
if (state_heater_1 == 0) { |
|
|
|
state_timer_heater_1 = MIN_STATE_TIME; |
|
|
|
} |
|
|
|
state_heater_1 = 1; |
|
|
|
WRITE(HEATER_1_PIN, 1); |
|
|
|
} |
|
|
|
} else { |
|
|
|
// turn OFF heather only if the minimum time is up
|
|
|
|
if (state_timer_heater_1 == 0) { |
|
|
|
// if change state set timer
|
|
|
|
if (state_heater_1 == 1) { |
|
|
|
state_timer_heater_1 = MIN_STATE_TIME; |
|
|
|
} |
|
|
|
state_heater_1 = 0; |
|
|
|
WRITE(HEATER_1_PIN, 0); |
|
|
|
// if change state set timer
|
|
|
|
if (state_heater_1 == 1) { |
|
|
|
state_timer_heater_1 = MIN_STATE_TIME; |
|
|
|
} |
|
|
|
state_heater_1 = 0; |
|
|
|
WRITE(HEATER_1_PIN, 0); |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
@ -1498,22 +1499,22 @@ ISR(TIMER0_COMPB_vect) |
|
|
|
if (soft_pwm_2 > 0) { |
|
|
|
// turn ON heather only if the minimum time is up
|
|
|
|
if (state_timer_heater_2 == 0) { |
|
|
|
// if change state set timer
|
|
|
|
if (state_heater_2 == 0) { |
|
|
|
state_timer_heater_2 = MIN_STATE_TIME; |
|
|
|
} |
|
|
|
state_heater_2 = 1; |
|
|
|
WRITE(HEATER_2_PIN, 1); |
|
|
|
// if change state set timer
|
|
|
|
if (state_heater_2 == 0) { |
|
|
|
state_timer_heater_2 = MIN_STATE_TIME; |
|
|
|
} |
|
|
|
state_heater_2 = 1; |
|
|
|
WRITE(HEATER_2_PIN, 1); |
|
|
|
} |
|
|
|
} else { |
|
|
|
// turn OFF heather only if the minimum time is up
|
|
|
|
if (state_timer_heater_2 == 0) { |
|
|
|
// if change state set timer
|
|
|
|
if (state_heater_2 == 1) { |
|
|
|
state_timer_heater_2 = MIN_STATE_TIME; |
|
|
|
} |
|
|
|
state_heater_2 = 0; |
|
|
|
WRITE(HEATER_2_PIN, 0); |
|
|
|
// if change state set timer
|
|
|
|
if (state_heater_2 == 1) { |
|
|
|
state_timer_heater_2 = MIN_STATE_TIME; |
|
|
|
} |
|
|
|
state_heater_2 = 0; |
|
|
|
WRITE(HEATER_2_PIN, 0); |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
@ -1524,22 +1525,22 @@ ISR(TIMER0_COMPB_vect) |
|
|
|
if (soft_pwm_3 > 0) { |
|
|
|
// turn ON heather only if the minimum time is up
|
|
|
|
if (state_timer_heater_3 == 0) { |
|
|
|
// if change state set timer
|
|
|
|
if (state_heater_3 == 0) { |
|
|
|
state_timer_heater_3 = MIN_STATE_TIME; |
|
|
|
} |
|
|
|
state_heater_3 = 1; |
|
|
|
WRITE(HEATER_3_PIN, 1); |
|
|
|
// if change state set timer
|
|
|
|
if (state_heater_3 == 0) { |
|
|
|
state_timer_heater_3 = MIN_STATE_TIME; |
|
|
|
} |
|
|
|
state_heater_3 = 1; |
|
|
|
WRITE(HEATER_3_PIN, 1); |
|
|
|
} |
|
|
|
} else { |
|
|
|
// turn OFF heather only if the minimum time is up
|
|
|
|
if (state_timer_heater_3 == 0) { |
|
|
|
// if change state set timer
|
|
|
|
if (state_heater_3 == 1) { |
|
|
|
state_timer_heater_3 = MIN_STATE_TIME; |
|
|
|
} |
|
|
|
state_heater_3 = 0; |
|
|
|
WRITE(HEATER_3_PIN, 0); |
|
|
|
// if change state set timer
|
|
|
|
if (state_heater_3 == 1) { |
|
|
|
state_timer_heater_3 = MIN_STATE_TIME; |
|
|
|
} |
|
|
|
state_heater_3 = 0; |
|
|
|
WRITE(HEATER_3_PIN, 0); |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
@ -1550,22 +1551,22 @@ ISR(TIMER0_COMPB_vect) |
|
|
|
if (soft_pwm_b > 0) { |
|
|
|
// turn ON heather only if the minimum time is up
|
|
|
|
if (state_timer_heater_b == 0) { |
|
|
|
// if change state set timer
|
|
|
|
if (state_heater_b == 0) { |
|
|
|
state_timer_heater_b = MIN_STATE_TIME; |
|
|
|
} |
|
|
|
state_heater_b = 1; |
|
|
|
WRITE(HEATER_BED_PIN, 1); |
|
|
|
// if change state set timer
|
|
|
|
if (state_heater_b == 0) { |
|
|
|
state_timer_heater_b = MIN_STATE_TIME; |
|
|
|
} |
|
|
|
state_heater_b = 1; |
|
|
|
WRITE(HEATER_BED_PIN, 1); |
|
|
|
} |
|
|
|
} else { |
|
|
|
// turn OFF heather only if the minimum time is up
|
|
|
|
if (state_timer_heater_b == 0) { |
|
|
|
// if change state set timer
|
|
|
|
if (state_heater_b == 1) { |
|
|
|
state_timer_heater_b = MIN_STATE_TIME; |
|
|
|
} |
|
|
|
state_heater_b = 0; |
|
|
|
WRITE(HEATER_BED_PIN, 0); |
|
|
|
// if change state set timer
|
|
|
|
if (state_heater_b == 1) { |
|
|
|
state_timer_heater_b = MIN_STATE_TIME; |
|
|
|
} |
|
|
|
state_heater_b = 0; |
|
|
|
WRITE(HEATER_BED_PIN, 0); |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
@ -1577,7 +1578,7 @@ ISR(TIMER0_COMPB_vect) |
|
|
|
if (state_timer_heater_0 == 0) { |
|
|
|
// if change state set timer
|
|
|
|
if (state_heater_0 == 1) { |
|
|
|
state_timer_heater_0 = MIN_STATE_TIME; |
|
|
|
state_timer_heater_0 = MIN_STATE_TIME; |
|
|
|
} |
|
|
|
state_heater_0 = 0; |
|
|
|
WRITE(HEATER_0_PIN, 0); |
|
|
@ -1594,7 +1595,7 @@ ISR(TIMER0_COMPB_vect) |
|
|
|
if (state_timer_heater_1 == 0) { |
|
|
|
// if change state set timer
|
|
|
|
if (state_heater_1 == 1) { |
|
|
|
state_timer_heater_1 = MIN_STATE_TIME; |
|
|
|
state_timer_heater_1 = MIN_STATE_TIME; |
|
|
|
} |
|
|
|
state_heater_1 = 0; |
|
|
|
WRITE(HEATER_1_PIN, 0); |
|
|
@ -1609,7 +1610,7 @@ ISR(TIMER0_COMPB_vect) |
|
|
|
if (state_timer_heater_2 == 0) { |
|
|
|
// if change state set timer
|
|
|
|
if (state_heater_2 == 1) { |
|
|
|
state_timer_heater_2 = MIN_STATE_TIME; |
|
|
|
state_timer_heater_2 = MIN_STATE_TIME; |
|
|
|
} |
|
|
|
state_heater_2 = 0; |
|
|
|
WRITE(HEATER_2_PIN, 0); |
|
|
@ -1624,7 +1625,7 @@ ISR(TIMER0_COMPB_vect) |
|
|
|
if (state_timer_heater_3 == 0) { |
|
|
|
// if change state set timer
|
|
|
|
if (state_heater_3 == 1) { |
|
|
|
state_timer_heater_3 = MIN_STATE_TIME; |
|
|
|
state_timer_heater_3 = MIN_STATE_TIME; |
|
|
|
} |
|
|
|
state_heater_3 = 0; |
|
|
|
WRITE(HEATER_3_PIN, 0); |
|
|
@ -1639,7 +1640,7 @@ ISR(TIMER0_COMPB_vect) |
|
|
|
if (state_timer_heater_b == 0) { |
|
|
|
// if change state set timer
|
|
|
|
if (state_heater_b == 1) { |
|
|
|
state_timer_heater_b = MIN_STATE_TIME; |
|
|
|
state_timer_heater_b = MIN_STATE_TIME; |
|
|
|
} |
|
|
|
state_heater_b = 0; |
|
|
|
WRITE(HEATER_BED_PIN, 0); |
|
|
@ -1809,7 +1810,7 @@ ISR(TIMER0_COMPB_vect) |
|
|
|
//raw_filwidth_value += ADC; //remove to use an IIR filter approach
|
|
|
|
if(ADC>102) //check that ADC is reading a voltage > 0.5 volts, otherwise don't take in the data.
|
|
|
|
{ |
|
|
|
raw_filwidth_value= raw_filwidth_value-(raw_filwidth_value>>7); //multipliy raw_filwidth_value by 127/128
|
|
|
|
raw_filwidth_value= raw_filwidth_value-(raw_filwidth_value>>7); //multipliy raw_filwidth_value by 127/128
|
|
|
|
|
|
|
|
raw_filwidth_value= raw_filwidth_value + ((unsigned long)ADC<<7); //add new ADC reading
|
|
|
|
} |
|
|
@ -1974,12 +1975,12 @@ ISR(TIMER0_COMPB_vect) |
|
|
|
|
|
|
|
float scalePID_i(float i) |
|
|
|
{ |
|
|
|
return i*PID_dT; |
|
|
|
return i*PID_dT; |
|
|
|
} |
|
|
|
|
|
|
|
float unscalePID_i(float i) |
|
|
|
{ |
|
|
|
return i/PID_dT; |
|
|
|
return i/PID_dT; |
|
|
|
} |
|
|
|
|
|
|
|
float scalePID_d(float d) |
|
|
@ -1989,7 +1990,7 @@ float scalePID_d(float d) |
|
|
|
|
|
|
|
float unscalePID_d(float d) |
|
|
|
{ |
|
|
|
return d*PID_dT; |
|
|
|
return d*PID_dT; |
|
|
|
} |
|
|
|
|
|
|
|
#endif //PIDTEMP
|
|
|
|