Version 1.3.24T / 21.09.2013

- M105 show same format as Marlin work better with new Pronterface
- Optimize TEMP_RESIDENCY function at Command M109
This commit is contained in:
midopple 2013-09-21 18:05:20 +02:00
parent f84de85ec9
commit 308cce734a
3 changed files with 89 additions and 19 deletions

View file

@ -341,8 +341,9 @@ const int dropsegments=5; //everything with less than this number of steps will
//#define WATCHPERIOD 5000 //5 seconds
// Actual temperature must be close to target for this long before M109 returns success
//#define TEMP_RESIDENCY_TIME 20 // (seconds)
//#define TEMP_HYSTERESIS 5 // (C°) range of +/- temperatures considered "close" to the target one
#define TEMP_RESIDENCY_TIME 10 // (seconds)
#define TEMP_HYSTERESIS 3 // (C°) range of +/- temperatures considered "close" to the target one
#define TEMP_WINDOW 1 // (degC) Window around target to start the recidency timer x degC early.
//// The minimal temperature defines the temperature below which the heater will not be enabled
#define MINTEMP 5
@ -352,6 +353,7 @@ const int dropsegments=5; //everything with less than this number of steps will
// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure!
// You should use MINTEMP for thermistor short/failure protection.
#define MAXTEMP 275
#define MAXTEMP_BED 140
// Select one of these only to define how the nozzle temp is read.
#define HEATER_USES_THERMISTOR

View file

@ -149,6 +149,10 @@
- Analog pins was added with the wrong pin number, needs to be offset +55 to protect against using the pin as a digital
- Min step delay in microseconds (EXTEND_STEP_PULSE_USEC)
Version 1.3.24T / 21.09.2013
- M105 show same format as Marlin work better with new Pronterface
- Optimize TEMP_RESIDENCY function
*/
#include <avr/pgmspace.h>
@ -255,7 +259,7 @@ void __cxa_pure_virtual(){};
// M603 - Show Free Ram
#define _VERSION_TEXT "1.3.23T / 28.11.2012"
#define _VERSION_TEXT "1.3.24T / 21.09.2013"
//Stepper Movement Variables
char axis_codes[NUM_AXIS] = {'X', 'Y', 'Z', 'E'};
@ -1508,6 +1512,18 @@ FORCE_INLINE void process_commands()
#if (TEMP_0_PIN > -1) || defined (HEATER_USES_MAX6675) || defined HEATER_USES_AD595
showString(PSTR("ok T:"));
Serial.print(hotendtC);
showString(PSTR(" /"));
Serial.print(analog2temp(target_raw));
#if TEMP_1_PIN > -1 || defined BED_USES_AD595
showString(PSTR(" B:"));
Serial.print(bedtempC);
showString(PSTR(" /"));
Serial.print(analog2temp(target_bed_raw));
#else
Serial.print(PSTR(" B:0 /0"));
#endif
#ifdef PIDTEMP
showString(PSTR(" @:"));
Serial.print(heater_duty);
@ -1523,23 +1539,40 @@ FORCE_INLINE void process_commands()
showString(PSTR(",AU:"));
Serial.print(autotemp_setpoint);
#endif
#endif
#if TEMP_1_PIN > -1 || defined BED_USES_AD595
showString(PSTR(" B:"));
Serial.println(bedtempC);
#else
Serial.println();
showString(PSTR(" @:0"));
#if (HEATER_0_PIN > -1)
if(READ(HEATER_0_PIN))
Serial.println(255);
else
Serial.println(0);
#else
Serial.println(0);
#endif
#endif
showString(PSTR(" B@:"));
#if (HEATER_1_PIN > -1)
if(READ(HEATER_1_PIN))
Serial.println(255);
else
Serial.println(0);
#else
Serial.println(0);
#endif
#else
#error No temperature source available
#endif
return;
//break;
case 109: { // M109 - Wait for extruder heater to reach target.
case 109: // M109 - Wait for extruder heater to reach target.
{
#ifdef CHAIN_OF_COMMAND
st_synchronize(); // wait for all movements to finish
#endif
if (code_seen('S')) target_raw = temp2analogh(target_temp = code_value());
#ifdef WATCHPERIOD
if(target_raw>current_raw)
{
@ -1561,27 +1594,51 @@ FORCE_INLINE void process_commands()
residencyStart = -1;
/* continue to loop until we have reached the target temp
_and_ until TEMP_RESIDENCY_TIME hasn't passed since we reached it */
while( (target_direction ? (current_raw < target_raw) : (current_raw > target_raw))
|| (residencyStart > -1 && (millis() - residencyStart) < TEMP_RESIDENCY_TIME*1000) ) {
while((residencyStart == -1) ||
(residencyStart >= 0 && (((unsigned int) (millis() - residencyStart)) < (TEMP_RESIDENCY_TIME * 1000UL))) ) {
#else
while ( target_direction ? (current_raw < target_raw) : (current_raw > target_raw) ) {
#endif
if( (millis() - codenum) > 1000 ) //Print Temp Reading every 1 second while heating up/cooling down
#endif //TEMP_RESIDENCY_TIME
//Print Temp Reading every 1 second while heating up/cooling down
if( (millis() - codenum) > 1000UL )
{
showString(PSTR("T:"));
#ifndef TEMP_RESIDENCY_TIME
Serial.println( analog2temp(current_raw) );
#else
Serial.print( analog2temp(current_raw) );
showString(PSTR(" E:0"));
showString(PSTR(" W:"));
if(residencyStart > -1)
{
codenum = ((TEMP_RESIDENCY_TIME * 1000UL) - (millis() - residencyStart)) / 1000UL;
Serial.print( codenum );
}
else
{
Serial.print("?");
}
showString(PSTR(" D:"));
Serial.println( analog2temp(current_raw) - analog2temp(target_raw) );
#endif
codenum = millis();
}
//Call Heatercontrol
manage_heater();
#if (MINIMUM_FAN_START_SPEED > 0)
manage_fan_start_speed();
#endif
#ifdef TEMP_RESIDENCY_TIME
/* start/restart the TEMP_RESIDENCY_TIME timer whenever we reach target temp for the first time
or when current temp falls outside the hysteresis after target temp was reached */
if ( (residencyStart == -1 && target_direction && current_raw >= target_raw)
|| (residencyStart == -1 && !target_direction && current_raw <= target_raw)
|| (residencyStart > -1 && labs(analog2temp(current_raw) - analog2temp(target_raw)) > TEMP_HYSTERESIS) ) {
if ((residencyStart == -1 && target_direction && (analog2temp(current_raw) >= (analog2temp(target_raw)-TEMP_WINDOW))) ||
(residencyStart == -1 && !target_direction && (analog2temp(current_raw) <= (analog2temp(target_raw)+TEMP_WINDOW))) ||
(residencyStart > -1 && labs(analog2temp(current_raw) - analog2temp(target_raw)) > TEMP_HYSTERESIS) )
{
residencyStart = millis();
}
#endif

View file

@ -104,6 +104,10 @@ unsigned long previous_millis_heater, previous_millis_bed_heater, previous_milli
int maxttemp = temp2analogh(MAXTEMP);
#endif
#ifdef MAXTEMP_BED
int maxttemp_bed = temp2analogBed(MAXTEMP_BED);
#endif
#define HEAT_INTERVAL 250
@ -305,6 +309,9 @@ ISR(TIMER2_OVF_vect)
// Some information see:
// http://brettbeauregard.com/blog/2012/01/arduino-pid-autotune-library/
//------------------------------------------------------------------
//HEATER_CURRENT --> 255
#ifdef PID_AUTOTUNE
void PID_autotune(int PIDAT_test_temp)
{
@ -742,7 +749,11 @@ void PID_autotune(int PIDAT_test_temp)
#ifdef MINTEMP
#ifdef MAXTEMP_BED
if(current_bed_raw >= target_bed_raw || current_bed_raw < minttemp || current_bed_raw > maxttemp_bed)
#else
if(current_bed_raw >= target_bed_raw || current_bed_raw < minttemp)
#endif
#else
if(current_bed_raw >= target_bed_raw)
#endif