|
|
|
@ -1,19 +1,19 @@
|
|
|
|
|
/*
|
|
|
|
|
temperature.c - temperature control
|
|
|
|
|
Part of Marlin
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
*/
|
|
|
|
@ -22,8 +22,8 @@
|
|
|
|
|
This firmware is a mashup between Sprinter and grbl.
|
|
|
|
|
(https://github.com/kliment/Sprinter)
|
|
|
|
|
(https://github.com/simen/grbl/tree)
|
|
|
|
|
|
|
|
|
|
It has preliminary support for Matthew Roberts advance algorithm
|
|
|
|
|
|
|
|
|
|
It has preliminary support for Matthew Roberts advance algorithm
|
|
|
|
|
http://reprap.org/pipermail/reprap-dev/2011-May/003323.html
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
@ -63,20 +63,20 @@ float current_temperature_bed = 0.0;
|
|
|
|
|
float bedKi=(DEFAULT_bedKi*PID_dT);
|
|
|
|
|
float bedKd=(DEFAULT_bedKd/PID_dT);
|
|
|
|
|
#endif //PIDTEMPBED
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef FAN_SOFT_PWM
|
|
|
|
|
unsigned char fanSpeedSoftPwm;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
unsigned char soft_pwm_bed;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef BABYSTEPPING
|
|
|
|
|
volatile int babystepsTodo[3]={0,0,0};
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef FILAMENT_SENSOR
|
|
|
|
|
int current_raw_filwidth = 0; //Holds measured filament diameter - one extruder only
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
//===========================================================================
|
|
|
|
|
//=============================private variables============================
|
|
|
|
|
//===========================================================================
|
|
|
|
@ -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];
|
|
|
|
|
|
|
|
|
@ -120,7 +120,7 @@ static volatile bool temp_meas_ready = false;
|
|
|
|
|
(defined(EXTRUDER_1_AUTO_FAN_PIN) && EXTRUDER_1_AUTO_FAN_PIN > -1) || \
|
|
|
|
|
(defined(EXTRUDER_2_AUTO_FAN_PIN) && EXTRUDER_2_AUTO_FAN_PIN > -1)
|
|
|
|
|
static unsigned long extruder_autofan_last_check;
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if EXTRUDERS > 4
|
|
|
|
|
# error Unsupported number of extruders
|
|
|
|
@ -227,9 +227,9 @@ void PID_autotune(float temp, int extruder, int ncycles)
|
|
|
|
|
SERIAL_ECHOLN("PID Autotune failed. Bad extruder number.");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SERIAL_ECHOLN("PID Autotune start");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
disable_heater(); // switch off all heaters.
|
|
|
|
|
|
|
|
|
|
if (extruder<0)
|
|
|
|
@ -267,7 +267,7 @@ void PID_autotune(float temp, int extruder, int ncycles)
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
if(heating == true && input > temp) {
|
|
|
|
|
if(millis() - t2 > 5000) {
|
|
|
|
|
if(millis() - t2 > 5000) {
|
|
|
|
|
heating=false;
|
|
|
|
|
if (extruder<0)
|
|
|
|
|
soft_pwm_bed = (bias - d) >> 1;
|
|
|
|
@ -330,7 +330,7 @@ void PID_autotune(float temp, int extruder, int ncycles)
|
|
|
|
|
cycles++;
|
|
|
|
|
min=temp;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if(input > (temp + 20)) {
|
|
|
|
|
SERIAL_PROTOCOLLNPGM("PID Autotune failed! Temperature too high");
|
|
|
|
@ -339,16 +339,16 @@ void PID_autotune(float temp, int extruder, int ncycles)
|
|
|
|
|
if(millis() - temp_millis > 2000) {
|
|
|
|
|
int p;
|
|
|
|
|
if (extruder<0){
|
|
|
|
|
p=soft_pwm_bed;
|
|
|
|
|
p=soft_pwm_bed;
|
|
|
|
|
SERIAL_PROTOCOLPGM("ok B:");
|
|
|
|
|
}else{
|
|
|
|
|
p=soft_pwm[extruder];
|
|
|
|
|
p=soft_pwm[extruder];
|
|
|
|
|
SERIAL_PROTOCOLPGM("ok T:");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SERIAL_PROTOCOL(input);
|
|
|
|
|
|
|
|
|
|
SERIAL_PROTOCOL(input);
|
|
|
|
|
SERIAL_PROTOCOLPGM(" @:");
|
|
|
|
|
SERIAL_PROTOCOLLN(p);
|
|
|
|
|
SERIAL_PROTOCOLLN(p);
|
|
|
|
|
|
|
|
|
|
temp_millis = millis();
|
|
|
|
|
}
|
|
|
|
@ -367,18 +367,18 @@ void PID_autotune(float temp, int extruder, int ncycles)
|
|
|
|
|
void updatePID()
|
|
|
|
|
{
|
|
|
|
|
#ifdef PIDTEMP
|
|
|
|
|
for(int e = 0; e < EXTRUDERS; e++) {
|
|
|
|
|
temp_iState_max[e] = PID_INTEGRAL_DRIVE_MAX / PID_PARAM(Ki,e);
|
|
|
|
|
for(int e = 0; e < EXTRUDERS; e++) {
|
|
|
|
|
temp_iState_max[e] = PID_INTEGRAL_DRIVE_MAX / PID_PARAM(Ki,e);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
#ifdef PIDTEMPBED
|
|
|
|
|
temp_iState_max_bed = PID_INTEGRAL_DRIVE_MAX / bedKi;
|
|
|
|
|
temp_iState_max_bed = PID_INTEGRAL_DRIVE_MAX / bedKi;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int getHeaterPower(int heater) {
|
|
|
|
|
if (heater<0)
|
|
|
|
|
return soft_pwm_bed;
|
|
|
|
|
if (heater<0)
|
|
|
|
|
return soft_pwm_bed;
|
|
|
|
|
return soft_pwm[heater];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -387,16 +387,16 @@ int getHeaterPower(int heater) {
|
|
|
|
|
(defined(EXTRUDER_2_AUTO_FAN_PIN) && EXTRUDER_2_AUTO_FAN_PIN > -1)
|
|
|
|
|
|
|
|
|
|
#if defined(FAN_PIN) && FAN_PIN > -1
|
|
|
|
|
#if EXTRUDER_0_AUTO_FAN_PIN == FAN_PIN
|
|
|
|
|
#if EXTRUDER_0_AUTO_FAN_PIN == FAN_PIN
|
|
|
|
|
#error "You cannot set EXTRUDER_0_AUTO_FAN_PIN equal to FAN_PIN"
|
|
|
|
|
#endif
|
|
|
|
|
#if EXTRUDER_1_AUTO_FAN_PIN == FAN_PIN
|
|
|
|
|
#if EXTRUDER_1_AUTO_FAN_PIN == FAN_PIN
|
|
|
|
|
#error "You cannot set EXTRUDER_1_AUTO_FAN_PIN equal to FAN_PIN"
|
|
|
|
|
#endif
|
|
|
|
|
#if EXTRUDER_2_AUTO_FAN_PIN == FAN_PIN
|
|
|
|
|
#if EXTRUDER_2_AUTO_FAN_PIN == FAN_PIN
|
|
|
|
|
#error "You cannot set EXTRUDER_2_AUTO_FAN_PIN equal to FAN_PIN"
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
void setExtruderAutoFanState(int pin, bool state)
|
|
|
|
|
{
|
|
|
|
@ -411,53 +411,53 @@ void checkExtruderAutoFans()
|
|
|
|
|
{
|
|
|
|
|
uint8_t fanState = 0;
|
|
|
|
|
|
|
|
|
|
// which fan pins need to be turned on?
|
|
|
|
|
// which fan pins need to be turned on?
|
|
|
|
|
#if defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1
|
|
|
|
|
if (current_temperature[0] > EXTRUDER_AUTO_FAN_TEMPERATURE)
|
|
|
|
|
if (current_temperature[0] > EXTRUDER_AUTO_FAN_TEMPERATURE)
|
|
|
|
|
fanState |= 1;
|
|
|
|
|
#endif
|
|
|
|
|
#if defined(EXTRUDER_1_AUTO_FAN_PIN) && EXTRUDER_1_AUTO_FAN_PIN > -1
|
|
|
|
|
if (current_temperature[1] > EXTRUDER_AUTO_FAN_TEMPERATURE)
|
|
|
|
|
if (current_temperature[1] > EXTRUDER_AUTO_FAN_TEMPERATURE)
|
|
|
|
|
{
|
|
|
|
|
if (EXTRUDER_1_AUTO_FAN_PIN == EXTRUDER_0_AUTO_FAN_PIN)
|
|
|
|
|
if (EXTRUDER_1_AUTO_FAN_PIN == EXTRUDER_0_AUTO_FAN_PIN)
|
|
|
|
|
fanState |= 1;
|
|
|
|
|
else
|
|
|
|
|
fanState |= 2;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
#if defined(EXTRUDER_2_AUTO_FAN_PIN) && EXTRUDER_2_AUTO_FAN_PIN > -1
|
|
|
|
|
if (current_temperature[2] > EXTRUDER_AUTO_FAN_TEMPERATURE)
|
|
|
|
|
if (current_temperature[2] > EXTRUDER_AUTO_FAN_TEMPERATURE)
|
|
|
|
|
{
|
|
|
|
|
if (EXTRUDER_2_AUTO_FAN_PIN == EXTRUDER_0_AUTO_FAN_PIN)
|
|
|
|
|
if (EXTRUDER_2_AUTO_FAN_PIN == EXTRUDER_0_AUTO_FAN_PIN)
|
|
|
|
|
fanState |= 1;
|
|
|
|
|
else if (EXTRUDER_2_AUTO_FAN_PIN == EXTRUDER_1_AUTO_FAN_PIN)
|
|
|
|
|
else if (EXTRUDER_2_AUTO_FAN_PIN == EXTRUDER_1_AUTO_FAN_PIN)
|
|
|
|
|
fanState |= 2;
|
|
|
|
|
else
|
|
|
|
|
fanState |= 4;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
#if defined(EXTRUDER_3_AUTO_FAN_PIN) && EXTRUDER_3_AUTO_FAN_PIN > -1
|
|
|
|
|
if (current_temperature[3] > EXTRUDER_AUTO_FAN_TEMPERATURE)
|
|
|
|
|
if (current_temperature[3] > EXTRUDER_AUTO_FAN_TEMPERATURE)
|
|
|
|
|
{
|
|
|
|
|
if (EXTRUDER_3_AUTO_FAN_PIN == EXTRUDER_0_AUTO_FAN_PIN)
|
|
|
|
|
if (EXTRUDER_3_AUTO_FAN_PIN == EXTRUDER_0_AUTO_FAN_PIN)
|
|
|
|
|
fanState |= 1;
|
|
|
|
|
else if (EXTRUDER_3_AUTO_FAN_PIN == EXTRUDER_1_AUTO_FAN_PIN)
|
|
|
|
|
else if (EXTRUDER_3_AUTO_FAN_PIN == EXTRUDER_1_AUTO_FAN_PIN)
|
|
|
|
|
fanState |= 2;
|
|
|
|
|
else if (EXTRUDER_3_AUTO_FAN_PIN == EXTRUDER_2_AUTO_FAN_PIN)
|
|
|
|
|
else if (EXTRUDER_3_AUTO_FAN_PIN == EXTRUDER_2_AUTO_FAN_PIN)
|
|
|
|
|
fanState |= 4;
|
|
|
|
|
else
|
|
|
|
|
fanState |= 8;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// update extruder auto fan states
|
|
|
|
|
#if defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1
|
|
|
|
|
setExtruderAutoFanState(EXTRUDER_0_AUTO_FAN_PIN, (fanState & 1) != 0);
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
#if defined(EXTRUDER_1_AUTO_FAN_PIN) && EXTRUDER_1_AUTO_FAN_PIN > -1
|
|
|
|
|
if (EXTRUDER_1_AUTO_FAN_PIN != EXTRUDER_0_AUTO_FAN_PIN)
|
|
|
|
|
setExtruderAutoFanState(EXTRUDER_1_AUTO_FAN_PIN, (fanState & 2) != 0);
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
#if defined(EXTRUDER_2_AUTO_FAN_PIN) && EXTRUDER_2_AUTO_FAN_PIN > -1
|
|
|
|
|
if (EXTRUDER_2_AUTO_FAN_PIN != EXTRUDER_0_AUTO_FAN_PIN
|
|
|
|
|
&& EXTRUDER_2_AUTO_FAN_PIN != EXTRUDER_1_AUTO_FAN_PIN)
|
|
|
|
@ -479,7 +479,7 @@ void manage_heater()
|
|
|
|
|
float pid_output;
|
|
|
|
|
|
|
|
|
|
if(temp_meas_ready != true) //better readability
|
|
|
|
|
return;
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
updateTemperaturesFromRawValues();
|
|
|
|
|
|
|
|
|
@ -492,7 +492,7 @@ void manage_heater()
|
|
|
|
|
}
|
|
|
|
|
#endif //HEATER_0_USES_MAX6675
|
|
|
|
|
|
|
|
|
|
for(int e = 0; e < EXTRUDERS; e++)
|
|
|
|
|
for(int e = 0; e < EXTRUDERS; e++)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
#if defined (THERMAL_RUNAWAY_PROTECTION_PERIOD) && THERMAL_RUNAWAY_PROTECTION_PERIOD > 0
|
|
|
|
@ -527,15 +527,16 @@ 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
|
|
|
|
|
#else
|
|
|
|
|
pid_output = constrain(target_temperature[e], 0, PID_MAX);
|
|
|
|
|
#endif //PID_OPENLOOP
|
|
|
|
|
#ifdef PID_DEBUG
|
|
|
|
@ -561,7 +562,7 @@ void manage_heater()
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// Check if temperature is within the correct range
|
|
|
|
|
if((current_temperature[e] > minttemp[e]) && (current_temperature[e] < maxttemp[e]))
|
|
|
|
|
if((current_temperature[e] > minttemp[e]) && (current_temperature[e] < maxttemp[e]))
|
|
|
|
|
{
|
|
|
|
|
soft_pwm[e] = (int)pid_output >> 1;
|
|
|
|
|
}
|
|
|
|
@ -605,9 +606,9 @@ void manage_heater()
|
|
|
|
|
{
|
|
|
|
|
checkExtruderAutoFans();
|
|
|
|
|
extruder_autofan_last_check = millis();
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef PIDTEMPBED
|
|
|
|
|
if(millis() - previous_millis_bed_heater < BED_CHECK_INTERVAL)
|
|
|
|
|
return;
|
|
|
|
@ -615,7 +616,7 @@ void manage_heater()
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if TEMP_SENSOR_BED != 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(THERMAL_RUNAWAY_PROTECTION_BED_PERIOD) && THERMAL_RUNAWAY_PROTECTION_BED_PERIOD > 0
|
|
|
|
|
thermal_runaway_protection(&thermal_runaway_bed_state_machine, &thermal_runaway_bed_timer, current_temperature_bed, target_temperature_bed, 9, THERMAL_RUNAWAY_PROTECTION_BED_PERIOD, THERMAL_RUNAWAY_PROTECTION_BED_HYSTERESIS);
|
|
|
|
|
#endif
|
|
|
|
@ -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;
|
|
|
|
@ -644,17 +645,17 @@ void manage_heater()
|
|
|
|
|
pid_output=0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
#else
|
|
|
|
|
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
|
|
|
|
@ -664,7 +665,7 @@ void manage_heater()
|
|
|
|
|
{
|
|
|
|
|
soft_pwm_bed = 0;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
soft_pwm_bed = MAX_BED_POWER>>1;
|
|
|
|
|
}
|
|
|
|
@ -694,27 +695,27 @@ void manage_heater()
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
//code for controlling the extruder rate based on the width sensor
|
|
|
|
|
|
|
|
|
|
//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
|
|
|
|
|
|
|
|
|
|
//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;
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
//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;
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -733,7 +734,7 @@ static float analog2temp(int raw, uint8_t e) {
|
|
|
|
|
SERIAL_ERRORLNPGM(" - Invalid extruder number !");
|
|
|
|
|
kill();
|
|
|
|
|
return 0.0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#ifdef HEATER_0_USES_MAX6675
|
|
|
|
|
if (e == 0)
|
|
|
|
|
{
|
|
|
|
@ -751,8 +752,8 @@ static float analog2temp(int raw, uint8_t e) {
|
|
|
|
|
{
|
|
|
|
|
if (PGM_RD_W((*tt)[i][0]) > raw)
|
|
|
|
|
{
|
|
|
|
|
celsius = PGM_RD_W((*tt)[i-1][1]) +
|
|
|
|
|
(raw - PGM_RD_W((*tt)[i-1][0])) *
|
|
|
|
|
celsius = PGM_RD_W((*tt)[i-1][1]) +
|
|
|
|
|
(raw - PGM_RD_W((*tt)[i-1][0])) *
|
|
|
|
|
(float)(PGM_RD_W((*tt)[i][1]) - PGM_RD_W((*tt)[i-1][1])) /
|
|
|
|
|
(float)(PGM_RD_W((*tt)[i][0]) - PGM_RD_W((*tt)[i-1][0]));
|
|
|
|
|
break;
|
|
|
|
@ -778,8 +779,8 @@ static float analog2tempBed(int raw) {
|
|
|
|
|
{
|
|
|
|
|
if (PGM_RD_W(BEDTEMPTABLE[i][0]) > raw)
|
|
|
|
|
{
|
|
|
|
|
celsius = PGM_RD_W(BEDTEMPTABLE[i-1][1]) +
|
|
|
|
|
(raw - PGM_RD_W(BEDTEMPTABLE[i-1][0])) *
|
|
|
|
|
celsius = PGM_RD_W(BEDTEMPTABLE[i-1][1]) +
|
|
|
|
|
(raw - PGM_RD_W(BEDTEMPTABLE[i-1][0])) *
|
|
|
|
|
(float)(PGM_RD_W(BEDTEMPTABLE[i][1]) - PGM_RD_W(BEDTEMPTABLE[i-1][1])) /
|
|
|
|
|
(float)(PGM_RD_W(BEDTEMPTABLE[i][0]) - PGM_RD_W(BEDTEMPTABLE[i-1][0]));
|
|
|
|
|
break;
|
|
|
|
@ -812,9 +813,9 @@ static void updateTemperaturesFromRawValues()
|
|
|
|
|
#ifdef TEMP_SENSOR_1_AS_REDUNDANT
|
|
|
|
|
redundant_temperature = analog2temp(redundant_temperature_raw, 1);
|
|
|
|
|
#endif
|
|
|
|
|
#if defined (FILAMENT_SENSOR) && (FILWIDTH_PIN > -1) //check if a sensor is supported
|
|
|
|
|
#if defined (FILAMENT_SENSOR) && (FILWIDTH_PIN > -1) //check if a sensor is supported
|
|
|
|
|
filament_width_meas = analog2widthFil();
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
//Reset the watchdog after we know we have a temperature measurement.
|
|
|
|
|
watchdog_reset();
|
|
|
|
|
|
|
|
|
@ -824,29 +825,29 @@ static void updateTemperaturesFromRawValues()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// For converting raw Filament Width to milimeters
|
|
|
|
|
// For converting raw Filament Width to milimeters
|
|
|
|
|
#ifdef FILAMENT_SENSOR
|
|
|
|
|
float analog2widthFil() {
|
|
|
|
|
return current_raw_filwidth/16383.0*5.0;
|
|
|
|
|
//return current_raw_filwidth;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// For converting raw Filament Width to a ratio
|
|
|
|
|
int widthFil_to_size_ratio() {
|
|
|
|
|
|
|
|
|
|
float temp;
|
|
|
|
|
|
|
|
|
|
float analog2widthFil() {
|
|
|
|
|
return current_raw_filwidth/16383.0*5.0;
|
|
|
|
|
//return current_raw_filwidth;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// For converting raw Filament Width to a ratio
|
|
|
|
|
int widthFil_to_size_ratio() {
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
return(filament_width_nominal/temp*100);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -857,13 +858,13 @@ void tp_init()
|
|
|
|
|
{
|
|
|
|
|
#if MB(RUMBA) && ((TEMP_SENSOR_0==-1)||(TEMP_SENSOR_1==-1)||(TEMP_SENSOR_2==-1)||(TEMP_SENSOR_BED==-1))
|
|
|
|
|
//disable RUMBA JTAG in case the thermocouple extension is plugged on top of JTAG connector
|
|
|
|
|
MCUCR=(1<<JTD);
|
|
|
|
|
MCUCR=(1<<JTD);
|
|
|
|
|
MCUCR=(1<<JTD);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// Finish init of mult extruder arrays
|
|
|
|
|
|
|
|
|
|
// Finish init of mult extruder arrays
|
|
|
|
|
for(int e = 0; e < EXTRUDERS; e++) {
|
|
|
|
|
// populate with the first value
|
|
|
|
|
// populate with the first value
|
|
|
|
|
maxttemp[e] = maxttemp[0];
|
|
|
|
|
#ifdef PIDTEMP
|
|
|
|
|
temp_iState_min[e] = 0.0;
|
|
|
|
@ -875,22 +876,22 @@ void tp_init()
|
|
|
|
|
#endif //PIDTEMPBED
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if defined(HEATER_0_PIN) && (HEATER_0_PIN > -1)
|
|
|
|
|
#if defined(HEATER_0_PIN) && (HEATER_0_PIN > -1)
|
|
|
|
|
SET_OUTPUT(HEATER_0_PIN);
|
|
|
|
|
#endif
|
|
|
|
|
#if defined(HEATER_1_PIN) && (HEATER_1_PIN > -1)
|
|
|
|
|
#if defined(HEATER_1_PIN) && (HEATER_1_PIN > -1)
|
|
|
|
|
SET_OUTPUT(HEATER_1_PIN);
|
|
|
|
|
#endif
|
|
|
|
|
#if defined(HEATER_2_PIN) && (HEATER_2_PIN > -1)
|
|
|
|
|
#if defined(HEATER_2_PIN) && (HEATER_2_PIN > -1)
|
|
|
|
|
SET_OUTPUT(HEATER_2_PIN);
|
|
|
|
|
#endif
|
|
|
|
|
#if defined(HEATER_3_PIN) && (HEATER_3_PIN > -1)
|
|
|
|
|
#if defined(HEATER_3_PIN) && (HEATER_3_PIN > -1)
|
|
|
|
|
SET_OUTPUT(HEATER_3_PIN);
|
|
|
|
|
#endif
|
|
|
|
|
#if defined(HEATER_BED_PIN) && (HEATER_BED_PIN > -1)
|
|
|
|
|
#if defined(HEATER_BED_PIN) && (HEATER_BED_PIN > -1)
|
|
|
|
|
SET_OUTPUT(HEATER_BED_PIN);
|
|
|
|
|
#endif
|
|
|
|
|
#if defined(FAN_PIN) && (FAN_PIN > -1)
|
|
|
|
|
#endif
|
|
|
|
|
#if defined(FAN_PIN) && (FAN_PIN > -1)
|
|
|
|
|
SET_OUTPUT(FAN_PIN);
|
|
|
|
|
#ifdef FAST_PWM_FAN
|
|
|
|
|
setPwmFrequency(FAN_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8
|
|
|
|
@ -898,24 +899,24 @@ void tp_init()
|
|
|
|
|
#ifdef FAN_SOFT_PWM
|
|
|
|
|
soft_pwm_fan = fanSpeedSoftPwm / 2;
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef HEATER_0_USES_MAX6675
|
|
|
|
|
|
|
|
|
|
#ifndef SDSUPPORT
|
|
|
|
|
SET_OUTPUT(SCK_PIN);
|
|
|
|
|
WRITE(SCK_PIN,0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SET_OUTPUT(MOSI_PIN);
|
|
|
|
|
WRITE(MOSI_PIN,1);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SET_INPUT(MISO_PIN);
|
|
|
|
|
WRITE(MISO_PIN,1);
|
|
|
|
|
#else
|
|
|
|
|
pinMode(SS_PIN, OUTPUT);
|
|
|
|
|
digitalWrite(SS_PIN, HIGH);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SET_OUTPUT(MAX6675_SS);
|
|
|
|
|
WRITE(MAX6675_SS,1);
|
|
|
|
|
|
|
|
|
@ -929,56 +930,56 @@ void tp_init()
|
|
|
|
|
#endif
|
|
|
|
|
#if defined(TEMP_0_PIN) && (TEMP_0_PIN > -1)
|
|
|
|
|
#if TEMP_0_PIN < 8
|
|
|
|
|
DIDR0 |= 1 << TEMP_0_PIN;
|
|
|
|
|
DIDR0 |= 1 << TEMP_0_PIN;
|
|
|
|
|
#else
|
|
|
|
|
DIDR2 |= 1<<(TEMP_0_PIN - 8);
|
|
|
|
|
DIDR2 |= 1<<(TEMP_0_PIN - 8);
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
#if defined(TEMP_1_PIN) && (TEMP_1_PIN > -1)
|
|
|
|
|
#if TEMP_1_PIN < 8
|
|
|
|
|
DIDR0 |= 1<<TEMP_1_PIN;
|
|
|
|
|
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)
|
|
|
|
|
#if TEMP_2_PIN < 8
|
|
|
|
|
DIDR0 |= 1 << TEMP_2_PIN;
|
|
|
|
|
DIDR0 |= 1 << TEMP_2_PIN;
|
|
|
|
|
#else
|
|
|
|
|
DIDR2 |= 1<<(TEMP_2_PIN - 8);
|
|
|
|
|
DIDR2 |= 1<<(TEMP_2_PIN - 8);
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
#if defined(TEMP_3_PIN) && (TEMP_3_PIN > -1)
|
|
|
|
|
#if TEMP_3_PIN < 8
|
|
|
|
|
DIDR0 |= 1 << TEMP_3_PIN;
|
|
|
|
|
DIDR0 |= 1 << TEMP_3_PIN;
|
|
|
|
|
#else
|
|
|
|
|
DIDR2 |= 1<<(TEMP_3_PIN - 8);
|
|
|
|
|
DIDR2 |= 1<<(TEMP_3_PIN - 8);
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
#if defined(TEMP_BED_PIN) && (TEMP_BED_PIN > -1)
|
|
|
|
|
#if TEMP_BED_PIN < 8
|
|
|
|
|
DIDR0 |= 1<<TEMP_BED_PIN;
|
|
|
|
|
DIDR0 |= 1<<TEMP_BED_PIN;
|
|
|
|
|
#else
|
|
|
|
|
DIDR2 |= 1<<(TEMP_BED_PIN - 8);
|
|
|
|
|
DIDR2 |= 1<<(TEMP_BED_PIN - 8);
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
//Added for Filament Sensor
|
|
|
|
|
|
|
|
|
|
//Added for Filament Sensor
|
|
|
|
|
#ifdef FILAMENT_SENSOR
|
|
|
|
|
#if defined(FILWIDTH_PIN) && (FILWIDTH_PIN > -1)
|
|
|
|
|
#if FILWIDTH_PIN < 8
|
|
|
|
|
DIDR0 |= 1<<FILWIDTH_PIN;
|
|
|
|
|
#if defined(FILWIDTH_PIN) && (FILWIDTH_PIN > -1)
|
|
|
|
|
#if FILWIDTH_PIN < 8
|
|
|
|
|
DIDR0 |= 1<<FILWIDTH_PIN;
|
|
|
|
|
#else
|
|
|
|
|
DIDR2 |= 1<<(FILWIDTH_PIN - 8);
|
|
|
|
|
#endif
|
|
|
|
|
DIDR2 |= 1<<(FILWIDTH_PIN - 8);
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Use timer0 for temperature measurement
|
|
|
|
|
// Interleave temperature interrupt with millies interrupt
|
|
|
|
|
OCR0B = 128;
|
|
|
|
|
TIMSK0 |= (1<<OCIE0B);
|
|
|
|
|
|
|
|
|
|
TIMSK0 |= (1<<OCIE0B);
|
|
|
|
|
|
|
|
|
|
// Wait for temperature measurement to settle
|
|
|
|
|
delay(250);
|
|
|
|
|
|
|
|
|
@ -1089,8 +1090,8 @@ void tp_init()
|
|
|
|
|
#endif //BED_MAXTEMP
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void setWatch()
|
|
|
|
|
{
|
|
|
|
|
void setWatch()
|
|
|
|
|
{
|
|
|
|
|
#ifdef WATCH_TEMP_PERIOD
|
|
|
|
|
for (int e = 0; e < EXTRUDERS; e++)
|
|
|
|
|
{
|
|
|
|
@ -1098,9 +1099,9 @@ void setWatch()
|
|
|
|
|
{
|
|
|
|
|
watch_start_temp[e] = degHotend(e);
|
|
|
|
|
watchmillis[e] = millis();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if defined (THERMAL_RUNAWAY_PROTECTION_PERIOD) && THERMAL_RUNAWAY_PROTECTION_PERIOD > 0
|
|
|
|
@ -1118,7 +1119,7 @@ void thermal_runaway_protection(int *state, unsigned long *timer, float temperat
|
|
|
|
|
SERIAL_ECHO(temperature);
|
|
|
|
|
SERIAL_ECHO(" ; Target Temp:");
|
|
|
|
|
SERIAL_ECHO(target_temperature);
|
|
|
|
|
SERIAL_ECHOLN("");
|
|
|
|
|
SERIAL_ECHOLN("");
|
|
|
|
|
*/
|
|
|
|
|
if ((target_temperature == 0) || thermal_runaway)
|
|
|
|
|
{
|
|
|
|
@ -1138,7 +1139,7 @@ void thermal_runaway_protection(int *state, unsigned long *timer, float temperat
|
|
|
|
|
if (temperature >= (target_temperature - hysteresis_degc))
|
|
|
|
|
{
|
|
|
|
|
*timer = millis();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if ( (millis() - *timer) > ((unsigned long) period_seconds) * 1000)
|
|
|
|
|
{
|
|
|
|
|
SERIAL_ERROR_START;
|
|
|
|
@ -1173,23 +1174,23 @@ void disable_heater()
|
|
|
|
|
#if defined(TEMP_0_PIN) && TEMP_0_PIN > -1
|
|
|
|
|
target_temperature[0]=0;
|
|
|
|
|
soft_pwm[0]=0;
|
|
|
|
|
#if defined(HEATER_0_PIN) && HEATER_0_PIN > -1
|
|
|
|
|
#if defined(HEATER_0_PIN) && HEATER_0_PIN > -1
|
|
|
|
|
WRITE(HEATER_0_PIN,LOW);
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(TEMP_1_PIN) && TEMP_1_PIN > -1 && EXTRUDERS > 1
|
|
|
|
|
target_temperature[1]=0;
|
|
|
|
|
soft_pwm[1]=0;
|
|
|
|
|
#if defined(HEATER_1_PIN) && HEATER_1_PIN > -1
|
|
|
|
|
#if defined(HEATER_1_PIN) && HEATER_1_PIN > -1
|
|
|
|
|
WRITE(HEATER_1_PIN,LOW);
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(TEMP_2_PIN) && TEMP_2_PIN > -1 && EXTRUDERS > 2
|
|
|
|
|
target_temperature[2]=0;
|
|
|
|
|
soft_pwm[2]=0;
|
|
|
|
|
#if defined(HEATER_2_PIN) && HEATER_2_PIN > -1
|
|
|
|
|
#if defined(HEATER_2_PIN) && HEATER_2_PIN > -1
|
|
|
|
|
WRITE(HEATER_2_PIN,LOW);
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
@ -1197,19 +1198,19 @@ void disable_heater()
|
|
|
|
|
#if defined(TEMP_3_PIN) && TEMP_3_PIN > -1 && EXTRUDERS > 3
|
|
|
|
|
target_temperature[3]=0;
|
|
|
|
|
soft_pwm[3]=0;
|
|
|
|
|
#if defined(HEATER_3_PIN) && HEATER_3_PIN > -1
|
|
|
|
|
#if defined(HEATER_3_PIN) && HEATER_3_PIN > -1
|
|
|
|
|
WRITE(HEATER_3_PIN,LOW);
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1
|
|
|
|
|
target_temperature_bed=0;
|
|
|
|
|
soft_pwm_bed=0;
|
|
|
|
|
#if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1
|
|
|
|
|
#if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1
|
|
|
|
|
WRITE(HEATER_BED_PIN,LOW);
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void max_temp_error(uint8_t e) {
|
|
|
|
@ -1259,38 +1260,38 @@ int max6675_temp = 2000;
|
|
|
|
|
|
|
|
|
|
static int read_max6675()
|
|
|
|
|
{
|
|
|
|
|
if (millis() - max6675_previous_millis < MAX6675_HEAT_INTERVAL)
|
|
|
|
|
if (millis() - max6675_previous_millis < MAX6675_HEAT_INTERVAL)
|
|
|
|
|
return max6675_temp;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
max6675_previous_millis = millis();
|
|
|
|
|
max6675_temp = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef PRR
|
|
|
|
|
PRR &= ~(1<<PRSPI);
|
|
|
|
|
#elif defined(PRR0)
|
|
|
|
|
PRR0 &= ~(1<<PRSPI);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SPCR = (1<<MSTR) | (1<<SPE) | (1<<SPR0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// enable TT_MAX6675
|
|
|
|
|
WRITE(MAX6675_SS, 0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ensure 100ns delay - a bit extra is fine
|
|
|
|
|
asm("nop");//50ns on 20Mhz, 62.5ns on 16Mhz
|
|
|
|
|
asm("nop");//50ns on 20Mhz, 62.5ns on 16Mhz
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// read MSB
|
|
|
|
|
SPDR = 0;
|
|
|
|
|
for (;(SPSR & (1<<SPIF)) == 0;);
|
|
|
|
|
max6675_temp = SPDR;
|
|
|
|
|
max6675_temp <<= 8;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// read LSB
|
|
|
|
|
SPDR = 0;
|
|
|
|
|
for (;(SPSR & (1<<SPIF)) == 0;);
|
|
|
|
|
max6675_temp |= SPDR;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// disable TT_MAX6675
|
|
|
|
|
WRITE(MAX6675_SS, 1);
|
|
|
|
|
|
|
|
|
@ -1299,7 +1300,7 @@ static int read_max6675()
|
|
|
|
|
// thermocouple open
|
|
|
|
|
max6675_temp = 4000;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
max6675_temp = max6675_temp >> 3;
|
|
|
|
|
}
|
|
|
|
@ -1327,21 +1328,21 @@ ISR(TIMER0_COMPB_vect)
|
|
|
|
|
static unsigned char slow_pwm_count = 0;
|
|
|
|
|
static unsigned char state_heater_0 = 0;
|
|
|
|
|
static unsigned char state_timer_heater_0 = 0;
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if (EXTRUDERS > 1) || defined(HEATERS_PARALLEL)
|
|
|
|
|
static unsigned char soft_pwm_1;
|
|
|
|
|
#ifdef SLOW_PWM_HEATERS
|
|
|
|
|
static unsigned char state_heater_1 = 0;
|
|
|
|
|
static unsigned char state_timer_heater_1 = 0;
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
#if EXTRUDERS > 2
|
|
|
|
|
static unsigned char soft_pwm_2;
|
|
|
|
|
#ifdef SLOW_PWM_HEATERS
|
|
|
|
|
static unsigned char state_heater_2 = 0;
|
|
|
|
|
static unsigned char state_timer_heater_2 = 0;
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
#if EXTRUDERS > 3
|
|
|
|
|
static unsigned char soft_pwm_3;
|
|
|
|
@ -1356,20 +1357,20 @@ ISR(TIMER0_COMPB_vect)
|
|
|
|
|
#ifdef SLOW_PWM_HEATERS
|
|
|
|
|
static unsigned char state_heater_b = 0;
|
|
|
|
|
static unsigned char state_timer_heater_b = 0;
|
|
|
|
|
#endif
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if defined(FILWIDTH_PIN) &&(FILWIDTH_PIN > -1)
|
|
|
|
|
static unsigned long raw_filwidth_value = 0; //added for filament width sensor
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef SLOW_PWM_HEATERS
|
|
|
|
|
/*
|
|
|
|
|
* standard PWM modulation
|
|
|
|
|
*/
|
|
|
|
|
if(pwm_count == 0){
|
|
|
|
|
soft_pwm_0 = soft_pwm[0];
|
|
|
|
|
if(soft_pwm_0 > 0) {
|
|
|
|
|
if(soft_pwm_0 > 0) {
|
|
|
|
|
WRITE(HEATER_0_PIN,1);
|
|
|
|
|
#ifdef HEATERS_PARALLEL
|
|
|
|
|
WRITE(HEATER_1_PIN,1);
|
|
|
|
@ -1399,7 +1400,7 @@ ISR(TIMER0_COMPB_vect)
|
|
|
|
|
if(soft_pwm_fan > 0) WRITE(FAN_PIN,1); else WRITE(FAN_PIN,0);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
if(soft_pwm_0 < pwm_count) {
|
|
|
|
|
if(soft_pwm_0 < pwm_count) {
|
|
|
|
|
WRITE(HEATER_0_PIN,0);
|
|
|
|
|
#ifdef HEATERS_PARALLEL
|
|
|
|
|
WRITE(HEATER_1_PIN,0);
|
|
|
|
@ -1422,10 +1423,10 @@ ISR(TIMER0_COMPB_vect)
|
|
|
|
|
#ifdef FAN_SOFT_PWM
|
|
|
|
|
if(soft_pwm_fan < pwm_count) WRITE(FAN_PIN,0);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pwm_count += (1 << SOFT_PWM_SCALE);
|
|
|
|
|
pwm_count &= 0x7f;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#else //ifndef SLOW_PWM_HEATERS
|
|
|
|
|
/*
|
|
|
|
|
* SLOW PWM HEATERS
|
|
|
|
@ -1436,84 +1437,84 @@ ISR(TIMER0_COMPB_vect)
|
|
|
|
|
#define MIN_STATE_TIME 16 // MIN_STATE_TIME * 65.5 = time in milliseconds
|
|
|
|
|
#endif
|
|
|
|
|
if (slow_pwm_count == 0) {
|
|
|
|
|
// EXTRUDER 0
|
|
|
|
|
// EXTRUDER 0
|
|
|
|
|
soft_pwm_0 = soft_pwm[0];
|
|
|
|
|
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);
|
|
|
|
|
// 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);
|
|
|
|
|
#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
|
|
|
|
|
// 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
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if EXTRUDERS > 1
|
|
|
|
|
// EXTRUDER 1
|
|
|
|
|
soft_pwm_1 = soft_pwm[1];
|
|
|
|
|
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);
|
|
|
|
|
// 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);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// turn OFF heather only if the minimum time is up
|
|
|
|
|
// 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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if EXTRUDERS > 2
|
|
|
|
|
// EXTRUDER 2
|
|
|
|
|
soft_pwm_2 = soft_pwm[2];
|
|
|
|
|
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);
|
|
|
|
|
// 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);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// turn OFF heather only if the minimum time is up
|
|
|
|
|
// 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
|
|
|
|
@ -1522,24 +1523,24 @@ ISR(TIMER0_COMPB_vect)
|
|
|
|
|
// EXTRUDER 3
|
|
|
|
|
soft_pwm_3 = soft_pwm[3];
|
|
|
|
|
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);
|
|
|
|
|
// 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);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// turn OFF heather only if the minimum time is up
|
|
|
|
|
// 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
|
|
|
|
@ -1548,36 +1549,36 @@ ISR(TIMER0_COMPB_vect)
|
|
|
|
|
// BED
|
|
|
|
|
soft_pwm_b = soft_pwm_bed;
|
|
|
|
|
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);
|
|
|
|
|
// 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);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// turn OFF heather only if the minimum time is up
|
|
|
|
|
// 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
|
|
|
|
|
} // if (slow_pwm_count == 0)
|
|
|
|
|
|
|
|
|
|
// EXTRUDER 0
|
|
|
|
|
|
|
|
|
|
// EXTRUDER 0
|
|
|
|
|
if (soft_pwm_0 < slow_pwm_count) {
|
|
|
|
|
// turn OFF heather only if the minimum time is up
|
|
|
|
|
if (state_timer_heater_0 == 0) {
|
|
|
|
|
// if change state set timer
|
|
|
|
|
// 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_timer_heater_0 = MIN_STATE_TIME;
|
|
|
|
|
}
|
|
|
|
|
state_heater_0 = 0;
|
|
|
|
|
WRITE(HEATER_0_PIN, 0);
|
|
|
|
@ -1586,30 +1587,30 @@ ISR(TIMER0_COMPB_vect)
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if EXTRUDERS > 1
|
|
|
|
|
// EXTRUDER 1
|
|
|
|
|
// EXTRUDER 1
|
|
|
|
|
if (soft_pwm_1 < slow_pwm_count) {
|
|
|
|
|
// turn OFF heather only if the minimum time is up
|
|
|
|
|
if (state_timer_heater_1 == 0) {
|
|
|
|
|
// if change state set timer
|
|
|
|
|
// 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_timer_heater_1 = MIN_STATE_TIME;
|
|
|
|
|
}
|
|
|
|
|
state_heater_1 = 0;
|
|
|
|
|
WRITE(HEATER_1_PIN, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if EXTRUDERS > 2
|
|
|
|
|
// EXTRUDER 2
|
|
|
|
|
if (soft_pwm_2 < slow_pwm_count) {
|
|
|
|
|
// turn OFF heather only if the minimum time is up
|
|
|
|
|
if (state_timer_heater_2 == 0) {
|
|
|
|
|
// if change state set timer
|
|
|
|
|
// 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_timer_heater_2 = MIN_STATE_TIME;
|
|
|
|
|
}
|
|
|
|
|
state_heater_2 = 0;
|
|
|
|
|
WRITE(HEATER_2_PIN, 0);
|
|
|
|
@ -1620,33 +1621,33 @@ ISR(TIMER0_COMPB_vect)
|
|
|
|
|
#if EXTRUDERS > 3
|
|
|
|
|
// EXTRUDER 3
|
|
|
|
|
if (soft_pwm_3 < slow_pwm_count) {
|
|
|
|
|
// turn OFF heather only if the minimum time is up
|
|
|
|
|
if (state_timer_heater_3 == 0) {
|
|
|
|
|
// if change state set timer
|
|
|
|
|
// 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_timer_heater_3 = MIN_STATE_TIME;
|
|
|
|
|
}
|
|
|
|
|
state_heater_3 = 0;
|
|
|
|
|
WRITE(HEATER_3_PIN, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1
|
|
|
|
|
// BED
|
|
|
|
|
if (soft_pwm_b < slow_pwm_count) {
|
|
|
|
|
// turn OFF heather only if the minimum time is up
|
|
|
|
|
if (state_timer_heater_b == 0) {
|
|
|
|
|
// if change state set timer
|
|
|
|
|
// 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_timer_heater_b = MIN_STATE_TIME;
|
|
|
|
|
}
|
|
|
|
|
state_heater_b = 0;
|
|
|
|
|
WRITE(HEATER_BED_PIN, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef FAN_SOFT_PWM
|
|
|
|
|
if (pwm_count == 0){
|
|
|
|
|
soft_pwm_fan = fanSpeedSoftPwm / 2;
|
|
|
|
@ -1654,47 +1655,47 @@ ISR(TIMER0_COMPB_vect)
|
|
|
|
|
}
|
|
|
|
|
if (soft_pwm_fan < pwm_count) WRITE(FAN_PIN,0);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pwm_count += (1 << SOFT_PWM_SCALE);
|
|
|
|
|
pwm_count &= 0x7f;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// increment slow_pwm_count only every 64 pwm_count circa 65.5ms
|
|
|
|
|
if ((pwm_count % 64) == 0) {
|
|
|
|
|
slow_pwm_count++;
|
|
|
|
|
slow_pwm_count &= 0x7f;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Extruder 0
|
|
|
|
|
if (state_timer_heater_0 > 0) {
|
|
|
|
|
state_timer_heater_0--;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if EXTRUDERS > 1
|
|
|
|
|
// Extruder 1
|
|
|
|
|
if (state_timer_heater_1 > 0)
|
|
|
|
|
if (state_timer_heater_1 > 0)
|
|
|
|
|
state_timer_heater_1--;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if EXTRUDERS > 2
|
|
|
|
|
// Extruder 2
|
|
|
|
|
if (state_timer_heater_2 > 0)
|
|
|
|
|
if (state_timer_heater_2 > 0)
|
|
|
|
|
state_timer_heater_2--;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if EXTRUDERS > 3
|
|
|
|
|
// Extruder 3
|
|
|
|
|
if (state_timer_heater_3 > 0)
|
|
|
|
|
if (state_timer_heater_3 > 0)
|
|
|
|
|
state_timer_heater_3--;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1
|
|
|
|
|
// Bed
|
|
|
|
|
if (state_timer_heater_b > 0)
|
|
|
|
|
// Bed
|
|
|
|
|
if (state_timer_heater_b > 0)
|
|
|
|
|
state_timer_heater_b--;
|
|
|
|
|
#endif
|
|
|
|
|
} //if ((pwm_count % 64) == 0) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif //ifndef SLOW_PWM_HEATERS
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
switch(temp_state) {
|
|
|
|
|
case 0: // Prepare TEMP_0
|
|
|
|
|
#if defined(TEMP_0_PIN) && (TEMP_0_PIN > -1)
|
|
|
|
@ -1791,35 +1792,35 @@ ISR(TIMER0_COMPB_vect)
|
|
|
|
|
#endif
|
|
|
|
|
temp_state = 10; //change so that Filament Width is also measured
|
|
|
|
|
break;
|
|
|
|
|
case 10: //Prepare FILWIDTH
|
|
|
|
|
#if defined(FILWIDTH_PIN) && (FILWIDTH_PIN> -1)
|
|
|
|
|
#if FILWIDTH_PIN>7
|
|
|
|
|
case 10: //Prepare FILWIDTH
|
|
|
|
|
#if defined(FILWIDTH_PIN) && (FILWIDTH_PIN> -1)
|
|
|
|
|
#if FILWIDTH_PIN>7
|
|
|
|
|
ADCSRB = 1<<MUX5;
|
|
|
|
|
#else
|
|
|
|
|
ADCSRB = 0;
|
|
|
|
|
#endif
|
|
|
|
|
ADMUX = ((1 << REFS0) | (FILWIDTH_PIN & 0x07));
|
|
|
|
|
ADCSRA |= 1<<ADSC; // Start conversion
|
|
|
|
|
#endif
|
|
|
|
|
lcd_buttons_update();
|
|
|
|
|
temp_state = 11;
|
|
|
|
|
break;
|
|
|
|
|
case 11: //Measure FILWIDTH
|
|
|
|
|
#if defined(FILWIDTH_PIN) &&(FILWIDTH_PIN > -1)
|
|
|
|
|
//raw_filwidth_value += ADC; //remove to use an IIR filter approach
|
|
|
|
|
ADCSRB = 0;
|
|
|
|
|
#endif
|
|
|
|
|
ADMUX = ((1 << REFS0) | (FILWIDTH_PIN & 0x07));
|
|
|
|
|
ADCSRA |= 1<<ADSC; // Start conversion
|
|
|
|
|
#endif
|
|
|
|
|
lcd_buttons_update();
|
|
|
|
|
temp_state = 11;
|
|
|
|
|
break;
|
|
|
|
|
case 11: //Measure FILWIDTH
|
|
|
|
|
#if defined(FILWIDTH_PIN) &&(FILWIDTH_PIN > -1)
|
|
|
|
|
//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 + ((unsigned long)ADC<<7); //add new ADC reading
|
|
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
temp_state = 0;
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
temp_state = 0;
|
|
|
|
|
|
|
|
|
|
temp_count++;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case 12: //Startup, delay initial temp reading a tiny bit so the hardware can settle.
|
|
|
|
|
temp_state = 0;
|
|
|
|
|
break;
|
|
|
|
@ -1828,7 +1829,7 @@ ISR(TIMER0_COMPB_vect)
|
|
|
|
|
// SERIAL_ERRORLNPGM("Temp measurement error!");
|
|
|
|
|
// break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(temp_count >= OVERSAMPLENR) // 10 * 16 * 1/(16000000/64/256) = 164ms.
|
|
|
|
|
{
|
|
|
|
|
if (!temp_meas_ready) //Only update the raw values if they have been read. Else we could be updating them during reading.
|
|
|
|
@ -1851,12 +1852,12 @@ ISR(TIMER0_COMPB_vect)
|
|
|
|
|
current_temperature_bed_raw = raw_temp_bed_value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Add similar code for Filament Sensor - can be read any time since IIR filtering is used
|
|
|
|
|
//Add similar code for Filament Sensor - can be read any time since IIR filtering is used
|
|
|
|
|
#if defined(FILWIDTH_PIN) &&(FILWIDTH_PIN > -1)
|
|
|
|
|
current_raw_filwidth = raw_filwidth_value>>10; //need to divide to get to 0-16384 range since we used 1/128 IIR filter approach
|
|
|
|
|
current_raw_filwidth = raw_filwidth_value>>10; //need to divide to get to 0-16384 range since we used 1/128 IIR filter approach
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
temp_meas_ready = true;
|
|
|
|
|
temp_count = 0;
|
|
|
|
|
raw_temp_0_value = 0;
|
|
|
|
@ -1947,12 +1948,12 @@ ISR(TIMER0_COMPB_vect)
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef BABYSTEPPING
|
|
|
|
|
for(uint8_t axis=0;axis<3;axis++)
|
|
|
|
|
{
|
|
|
|
|
int curTodo=babystepsTodo[axis]; //get rid of volatile for performance
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(curTodo>0)
|
|
|
|
|
{
|
|
|
|
|
babystep(axis,/*fwd*/true);
|
|
|
|
@ -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
|
|
|
|
|