@ -40,10 +40,13 @@
int target_temperature [ EXTRUDERS ] = { 0 } ;
int target_temperature [ EXTRUDERS ] = { 0 } ;
int target_temperature_bed = 0 ;
int target_temperature_bed = 0 ;
int current_temperature_raw [ EXTRUDERS ] = { 0 } ;
int current_temperature_raw [ EXTRUDERS ] = { 0 } ;
float current_temperature [ EXTRUDERS ] = { 0 } ;
float current_temperature [ EXTRUDERS ] = { 0. 0 } ;
int current_temperature_bed_raw = 0 ;
int current_temperature_bed_raw = 0 ;
float current_temperature_bed = 0 ;
float current_temperature_bed = 0.0 ;
# ifdef TEMP_SENSOR_1_AS_REDUNDANT
int redundant_temperature_raw = 0 ;
float redundant_temperature = 0.0 ;
# endif
# ifdef PIDTEMP
# ifdef PIDTEMP
float Kp = DEFAULT_Kp ;
float Kp = DEFAULT_Kp ;
float Ki = ( DEFAULT_Ki * PID_dT ) ;
float Ki = ( DEFAULT_Ki * PID_dT ) ;
@ -106,13 +109,13 @@ static volatile bool temp_meas_ready = false;
# endif
# endif
# if EXTRUDERS > 3
# if EXTRUDERS > 3
# error Unsupported number of extruders
# error Unsupported number of extruders
# elif EXTRUDERS > 2
# elif EXTRUDERS > 2
# define ARRAY_BY_EXTRUDERS(v1, v2, v3) { v1, v2, v3 }
# define ARRAY_BY_EXTRUDERS(v1, v2, v3) { v1, v2, v3 }
# elif EXTRUDERS > 1
# elif EXTRUDERS > 1
# define ARRAY_BY_EXTRUDERS(v1, v2, v3) { v1, v2 }
# define ARRAY_BY_EXTRUDERS(v1, v2, v3) { v1, v2 }
# else
# else
# define ARRAY_BY_EXTRUDERS(v1, v2, v3) { v1 }
# define ARRAY_BY_EXTRUDERS(v1, v2, v3) { v1 }
# endif
# endif
// Init min and max temp with extreme values to prevent false errors during startup
// Init min and max temp with extreme values to prevent false errors during startup
@ -124,8 +127,14 @@ static int maxttemp[EXTRUDERS] = ARRAY_BY_EXTRUDERS( 16383, 16383, 16383 );
# ifdef BED_MAXTEMP
# ifdef BED_MAXTEMP
static int bed_maxttemp_raw = HEATER_BED_RAW_HI_TEMP ;
static int bed_maxttemp_raw = HEATER_BED_RAW_HI_TEMP ;
# endif
# endif
static void * heater_ttbl_map [ EXTRUDERS ] = ARRAY_BY_EXTRUDERS ( ( void * ) HEATER_0_TEMPTABLE , ( void * ) HEATER_1_TEMPTABLE , ( void * ) HEATER_2_TEMPTABLE ) ;
static uint8_t heater_ttbllen_map [ EXTRUDERS ] = ARRAY_BY_EXTRUDERS ( HEATER_0_TEMPTABLE_LEN , HEATER_1_TEMPTABLE_LEN , HEATER_2_TEMPTABLE_LEN ) ;
# ifdef TEMP_SENSOR_1_AS_REDUNDANT
static void * heater_ttbl_map [ 2 ] = { ( void * ) HEATER_0_TEMPTABLE , ( void * ) HEATER_1_TEMPTABLE } ;
static uint8_t heater_ttbllen_map [ 2 ] = { HEATER_0_TEMPTABLE_LEN , HEATER_1_TEMPTABLE_LEN } ;
# else
static void * heater_ttbl_map [ EXTRUDERS ] = ARRAY_BY_EXTRUDERS ( ( void * ) HEATER_0_TEMPTABLE , ( void * ) HEATER_1_TEMPTABLE , ( void * ) HEATER_2_TEMPTABLE ) ;
static uint8_t heater_ttbllen_map [ EXTRUDERS ] = ARRAY_BY_EXTRUDERS ( HEATER_0_TEMPTABLE_LEN , HEATER_1_TEMPTABLE_LEN , HEATER_2_TEMPTABLE_LEN ) ;
# endif
static float analog2temp ( int raw , uint8_t e ) ;
static float analog2temp ( int raw , uint8_t e ) ;
static float analog2tempBed ( int raw ) ;
static float analog2tempBed ( int raw ) ;
@ -157,28 +166,28 @@ void PID_autotune(float temp, int extruder, int ncycles)
float Kp , Ki , Kd ;
float Kp , Ki , Kd ;
float max = 0 , min = 10000 ;
float max = 0 , min = 10000 ;
if ( ( extruder > EXTRUDERS )
if ( ( extruder > EXTRUDERS )
# if (TEMP_BED_PIN <= -1)
# if (TEMP_BED_PIN <= -1)
| | ( extruder < 0 )
| | ( extruder < 0 )
# endif
# endif
) {
) {
SERIAL_ECHOLN ( " PID Autotune failed. Bad extruder number. " ) ;
SERIAL_ECHOLN ( " PID Autotune failed. Bad extruder number. " ) ;
return ;
return ;
}
}
SERIAL_ECHOLN ( " PID Autotune start " ) ;
SERIAL_ECHOLN ( " PID Autotune start " ) ;
disable_heater ( ) ; // switch off all heaters.
disable_heater ( ) ; // switch off all heaters.
if ( extruder < 0 )
if ( extruder < 0 )
{
{
soft_pwm_bed = ( MAX_BED_POWER ) / 2 ;
soft_pwm_bed = ( MAX_BED_POWER ) / 2 ;
bias = d = ( MAX_BED_POWER ) / 2 ;
bias = d = ( MAX_BED_POWER ) / 2 ;
}
}
else
else
{
{
soft_pwm [ extruder ] = ( PID_MAX ) / 2 ;
soft_pwm [ extruder ] = ( PID_MAX ) / 2 ;
bias = d = ( PID_MAX ) / 2 ;
bias = d = ( PID_MAX ) / 2 ;
}
}
@ -196,10 +205,10 @@ void PID_autotune(float temp, int extruder, int ncycles)
if ( heating = = true & & input > temp ) {
if ( heating = = true & & input > temp ) {
if ( millis ( ) - t2 > 5000 ) {
if ( millis ( ) - t2 > 5000 ) {
heating = false ;
heating = false ;
if ( extruder < 0 )
if ( extruder < 0 )
soft_pwm_bed = ( bias - d ) > > 1 ;
soft_pwm_bed = ( bias - d ) > > 1 ;
else
else
soft_pwm [ extruder ] = ( bias - d ) > > 1 ;
soft_pwm [ extruder ] = ( bias - d ) > > 1 ;
t1 = millis ( ) ;
t1 = millis ( ) ;
t_high = t1 - t2 ;
t_high = t1 - t2 ;
max = temp ;
max = temp ;
@ -250,10 +259,10 @@ void PID_autotune(float temp, int extruder, int ncycles)
*/
*/
}
}
}
}
if ( extruder < 0 )
if ( extruder < 0 )
soft_pwm_bed = ( bias + d ) > > 1 ;
soft_pwm_bed = ( bias + d ) > > 1 ;
else
else
soft_pwm [ extruder ] = ( bias + d ) > > 1 ;
soft_pwm [ extruder ] = ( bias + d ) > > 1 ;
cycles + + ;
cycles + + ;
min = temp ;
min = temp ;
}
}
@ -264,14 +273,14 @@ void PID_autotune(float temp, int extruder, int ncycles)
return ;
return ;
}
}
if ( millis ( ) - temp_millis > 2000 ) {
if ( millis ( ) - temp_millis > 2000 ) {
int p ;
int p ;
if ( extruder < 0 ) {
if ( extruder < 0 ) {
p = soft_pwm_bed ;
p = soft_pwm_bed ;
SERIAL_PROTOCOLPGM ( " ok B: " ) ;
SERIAL_PROTOCOLPGM ( " ok B: " ) ;
} else {
} else {
p = soft_pwm [ extruder ] ;
p = soft_pwm [ extruder ] ;
SERIAL_PROTOCOLPGM ( " ok T: " ) ;
SERIAL_PROTOCOLPGM ( " ok T: " ) ;
}
}
SERIAL_PROTOCOL ( input ) ;
SERIAL_PROTOCOL ( input ) ;
SERIAL_PROTOCOLPGM ( " @: " ) ;
SERIAL_PROTOCOLPGM ( " @: " ) ;
@ -471,7 +480,19 @@ void manage_heater()
}
}
}
}
# endif
# endif
# ifdef TEMP_SENSOR_1_AS_REDUNDANT
if ( fabs ( current_temperature [ 0 ] - redundant_temperature ) > MAX_REDUNDANT_TEMP_SENSOR_DIFF ) {
disable_heater ( ) ;
if ( IsStopped ( ) = = false ) {
SERIAL_ERROR_START ;
SERIAL_ERRORLNPGM ( " Extruder switched off. Temperature difference between temp sensors is too high ! " ) ;
LCD_ALERTMESSAGEPGM ( " Err: REDUNDANT TEMP ERROR " ) ;
}
# ifndef BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE
Stop ( ) ;
# endif
}
# endif
} // End extruder for loop
} // End extruder for loop
# if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) || \
# if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) || \
@ -565,7 +586,11 @@ void manage_heater()
// Derived from RepRap FiveD extruder::getTemperature()
// Derived from RepRap FiveD extruder::getTemperature()
// For hot end temperature measurement.
// For hot end temperature measurement.
static float analog2temp ( int raw , uint8_t e ) {
static float analog2temp ( int raw , uint8_t e ) {
# ifdef TEMP_SENSOR_1_AS_REDUNDANT
if ( e > EXTRUDERS )
# else
if ( e > = EXTRUDERS )
if ( e > = EXTRUDERS )
# endif
{
{
SERIAL_ERROR_START ;
SERIAL_ERROR_START ;
SERIAL_ERROR ( ( int ) e ) ;
SERIAL_ERROR ( ( int ) e ) ;
@ -644,7 +669,9 @@ static void updateTemperaturesFromRawValues()
current_temperature [ e ] = analog2temp ( current_temperature_raw [ e ] , e ) ;
current_temperature [ e ] = analog2temp ( current_temperature_raw [ e ] , e ) ;
}
}
current_temperature_bed = analog2tempBed ( current_temperature_bed_raw ) ;
current_temperature_bed = analog2tempBed ( current_temperature_bed_raw ) ;
# ifdef TEMP_SENSOR_1_AS_REDUNDANT
redundant_temperature = analog2temp ( redundant_temperature_raw , 1 ) ;
# endif
//Reset the watchdog after we know we have a temperature measurement.
//Reset the watchdog after we know we have a temperature measurement.
watchdog_reset ( ) ;
watchdog_reset ( ) ;
@ -1145,6 +1172,9 @@ ISR(TIMER0_COMPB_vect)
# if EXTRUDERS > 1
# if EXTRUDERS > 1
current_temperature_raw [ 1 ] = raw_temp_1_value ;
current_temperature_raw [ 1 ] = raw_temp_1_value ;
# endif
# endif
# ifdef TEMP_SENSOR_1_AS_REDUNDANT
redundant_temperature_raw = raw_temp_1_value ;
# endif
# if EXTRUDERS > 2
# if EXTRUDERS > 2
current_temperature_raw [ 2 ] = raw_temp_2_value ;
current_temperature_raw [ 2 ] = raw_temp_2_value ;
# endif
# endif