(defined(EXTRUDER_2_AUTO_FAN_PIN) && EXTRUDER_2_AUTO_FAN_PIN > -1) static unsigned long extruder_autofan_last_check; #endif #if EXTRUDERS > 3 # error Unsupported number of extruders #elif EXTRUDERS > 2 # define ARRAY_BY_EXTRUDERS(v1, v2, v3) { v1, v2, v3 } #elif EXTRUDERS > 1 # define ARRAY_BY_EXTRUDERS(v1, v2, v3) { v1, v2 } #else # define ARRAY_BY_EXTRUDERS(v1, v2, v3) { v1 } #endif // Init min and max temp with extreme values to prevent false errors during startup static int minttemp_raw[EXTRUDERS] = ARRAY_BY_EXTRUDERS( HEATER_0_RAW_LO_TEMP , HEATER_1_RAW_LO_TEMP , HEATER_2_RAW_LO_TEMP ); static int maxttemp_raw[EXTRUDERS] = ARRAY_BY_EXTRUDERS( HEATER_0_RAW_HI_TEMP , HEATER_1_RAW_HI_TEMP , HEATER_2_RAW_HI_TEMP ); static int minttemp[EXTRUDERS] = ARRAY_BY_EXTRUDERS( 0, 0, 0 ); static int maxttemp[EXTRUDERS] = ARRAY_BY_EXTRUDERS( 16383, 16383, 16383 ); //static int bed_minttemp_raw = HEATER_BED_RAW_LO_TEMP; /* No bed mintemp error implemented?!? */ #ifdef BED_MAXTEMP static int bed_maxttemp_raw = HEATER_BED_RAW_HI_TEMP; #endif #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 temp_iState_max_bed; #else //PIDTEMPBED static millis_t next_bed_check_ms; #endif //PIDTEMPBED static unsigned char soft_pwm[EXTRUDERS]; #ifdef FAN_SOFT_PWM static unsigned char soft_pwm_fan; #endif #if HAS_AUTO_FAN static millis_t next_auto_fan_check_ms; #endif #ifdef PIDTEMP #ifdef PID_PARAMS_PER_EXTRUDER float Kp[EXTRUDERS] = ARRAY_BY_EXTRUDERS(DEFAULT_Kp, DEFAULT_Kp, DEFAULT_Kp, DEFAULT_Kp); float Ki[EXTRUDERS] = ARRAY_BY_EXTRUDERS(DEFAULT_Ki*PID_dT, DEFAULT_Ki*PID_dT, DEFAULT_Ki*PID_dT, DEFAULT_Ki*PID_dT); float Kd[EXTRUDERS] = ARRAY_BY_EXTRUDERS(DEFAULT_Kd / PID_dT, DEFAULT_Kd / PID_dT, DEFAULT_Kd / PID_dT, DEFAULT_Kd / PID_dT); #ifdef PID_ADD_EXTRUSION_RATE float Kc[EXTRUDERS] = ARRAY_BY_EXTRUDERS(DEFAULT_Kc, DEFAULT_Kc, DEFAULT_Kc, DEFAULT_Kc); #endif // PID_ADD_EXTRUSION_RATE #else //PID_PARAMS_PER_EXTRUDER float Kp = DEFAULT_Kp; float Ki = DEFAULT_Ki * PID_dT; float Kd = DEFAULT_Kd / PID_dT; #ifdef PID_ADD_EXTRUSION_RATE float Kc = DEFAULT_Kc; #endif // PID_ADD_EXTRUSION_RATE #endif // PID_PARAMS_PER_EXTRUDER #endif //PIDTEMP
#else # define ARRAY_BY_EXTRUDERS(v1, v2, v3) { v1 } #endif //=========================================================================== //=============================public variables============================ //=========================================================================== int target_temperature[EXTRUDERS] = { 0 }; int target_temperature_bed = 0; int current_temperature_raw[EXTRUDERS] = { 0 }; float current_temperature[EXTRUDERS] = { 0 }; int current_temperature_bed_raw = 0; float current_temperature_bed = 0; #ifdef PIDTEMP float Kp[EXTRUDERS] = ARRAY_BY_EXTRUDERS(DEFAULT_Kp, DEFAULT_Kp_E1, DEFAULT_Kp_E2); float Ki[EXTRUDERS] = ARRAY_BY_EXTRUDERS(DEFAULT_Ki*PID_dT, DEFAULT_Ki_E1*PID_dT, DEFAULT_Ki_E2*PID_dT); float Kd[EXTRUDERS] = ARRAY_BY_EXTRUDERS(DEFAULT_Kd/PID_dT, DEFAULT_Kd_E1/PID_dT, DEFAULT_Kd_E2/PID_dT); #ifdef PID_ADD_EXTRUSION_RATE float Kc=DEFAULT_Kc; #endif #endif //PIDTEMP #ifdef PIDTEMPBED float bedKp=DEFAULT_bedKp; float bedKi=(DEFAULT_bedKi*PID_dT); float bedKd=(DEFAULT_bedKd/PID_dT); #endif //PIDTEMPBED //===========================================================================
#endif //PIDTEMPBED static unsigned char soft_pwm[EXTRUDERS]; static unsigned char soft_pwm_bed; #if EXTRUDERS > 3 # error Unsupported number of extruders #elif EXTRUDERS > 2 # define ARRAY_BY_EXTRUDERS(v1, v2, v3) { v1, v2, v3 } #elif EXTRUDERS > 1 # define ARRAY_BY_EXTRUDERS(v1, v2, v3) { v1, v2 } #else # define ARRAY_BY_EXTRUDERS(v1, v2, v3) { v1 } #endif // Init min and max temp with extreme values to prevent false errors during startup static int minttemp[EXTRUDERS] = ARRAY_BY_EXTRUDERS(0, 0, 0); static int maxttemp[EXTRUDERS] = ARRAY_BY_EXTRUDERS(16383, 16383, 16383); // the first value used for all static int bed_minttemp = 0; static int bed_maxttemp = 16383; static void *heater_ttbl_map[EXTRUDERS] = ARRAY_BY_EXTRUDERS((void *)heater_0_temptable, (void *)heater_1_temptable, (void *)heater_2_temptable); static int heater_ttbllen_map[EXTRUDERS] = ARRAY_BY_EXTRUDERS(heater_0_temptable_len, heater_1_temptable_len, heater_2_temptable_len); #ifdef WATCH_TEMP_PERIOD int watch_start_temp[EXTRUDERS] = ARRAY_BY_EXTRUDERS(0,0,0); unsigned long watchmillis[EXTRUDERS] = ARRAY_BY_EXTRUDERS(0,0,0); #endif //WATCH_TEMP_PERIOD //=========================================================================== //============================= functions ============================ //===========================================================================
float Kd[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(DEFAULT_Kd / PID_dT); #ifdef PID_ADD_EXTRUSION_RATE float Kc[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(DEFAULT_Kc); #endif // PID_ADD_EXTRUSION_RATE #else //PID_PARAMS_PER_EXTRUDER float Kp = DEFAULT_Kp; float Ki = DEFAULT_Ki * PID_dT; float Kd = DEFAULT_Kd / PID_dT; #ifdef PID_ADD_EXTRUSION_RATE float Kc = DEFAULT_Kc; #endif // PID_ADD_EXTRUSION_RATE #endif // PID_PARAMS_PER_EXTRUDER #endif //PIDTEMP // Init min and max temp with extreme values to prevent false errors during startup static int minttemp_raw[EXTRUDERS] = ARRAY_BY_EXTRUDERS( HEATER_0_RAW_LO_TEMP , HEATER_1_RAW_LO_TEMP , HEATER_2_RAW_LO_TEMP, HEATER_3_RAW_LO_TEMP); static int maxttemp_raw[EXTRUDERS] = ARRAY_BY_EXTRUDERS( HEATER_0_RAW_HI_TEMP , HEATER_1_RAW_HI_TEMP , HEATER_2_RAW_HI_TEMP, HEATER_3_RAW_HI_TEMP); static int minttemp[EXTRUDERS] = { 0 }; static int maxttemp[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(16383); #ifdef BED_MINTEMP static int bed_minttemp_raw = HEATER_BED_RAW_LO_TEMP; #endif #ifdef BED_MAXTEMP static int bed_maxttemp_raw = HEATER_BED_RAW_HI_TEMP; #endif #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, (void *)HEATER_3_TEMPTABLE );
// Counter variables for the Bresenham line tracer static long counter_X, counter_Y, counter_Z, counter_E; volatile unsigned long step_events_completed; // The number of step events executed in the current block volatile long endstops_trigsteps[3]; volatile long endstops_stepsTotal, endstops_stepsDone; #if ENABLED(ADVANCE) || ENABLED(ADVANCE_LPC) unsigned char old_OCR0A; #if ENABLED(ADVANCE) static long advance_rate, advance, final_advance = 0; static long old_advance = 0; static long e_steps[EXTRUDERS]; #elif ENABLED(ADVANCE_LPC) int extruder_advance_k = ADVANCE_LPC_K; volatile int e_steps[EXTRUDERS] = ARRAY_BY_EXTRUDERS(0); volatile unsigned char eISR_Rate = 200; // Keep the ISR at a low rate until needed static int final_estep_rate; static int current_estep_rate[EXTRUDERS]; // Actual extruder speed [steps/s] static int current_adv_steps[EXTRUDERS]; #endif #endif static long acceleration_time, deceleration_time; // static unsigned long accelerate_until, decelerate_after, acceleration_rate, initial_rate, final_rate, nominal_rate; static unsigned short acc_step_rate; // needed for deceleration start point static uint8_t step_loops; static uint8_t step_loops_nominal; static unsigned short OCR1A_nominal; #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY)