Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
M
MarlinKimbra
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
machinery
MarlinKimbra
Commits
03152a21
Commit
03152a21
authored
9 years ago
by
MagoKimbra
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add PID_EXTRUSION_RATE
parent
c9fc2819
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
193 additions
and
88 deletions
+193
-88
changelog.md
Documentation/changelog.md
+1
-0
Configuration_Feature.h
MarlinKimbra/Configuration_Feature.h
+5
-0
Marlin_main.cpp
MarlinKimbra/Marlin_main.cpp
+27
-4
Marlin_main.h
MarlinKimbra/Marlin_main.h
+4
-1
configuration_store.cpp
MarlinKimbra/configuration_store.cpp
+56
-31
language.h
MarlinKimbra/language.h
+2
-0
temperature.cpp
MarlinKimbra/temperature.cpp
+96
-50
temperature.h
MarlinKimbra/temperature.h
+2
-2
No files found.
Documentation/changelog.md
View file @
03152a21
### Version 4.2.0
### Version 4.2.0
*
Add PID Extrusion Rate Kc in percent.
*
New configuration systems (Now you can create a separate file with all configuration and use it in you FW update)
*
New configuration systems (Now you can create a separate file with all configuration and use it in you FW update)
*
New namings for file
*
New namings for file
*
Added more documentation inside configuration file
*
Added more documentation inside configuration file
...
...
This diff is collapsed.
Click to expand it.
MarlinKimbra/Configuration_Feature.h
View file @
03152a21
...
@@ -169,11 +169,16 @@
...
@@ -169,11 +169,16 @@
// is more then PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max.
// is more then PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max.
#define PID_FUNCTIONAL_RANGE 10 // degC
#define PID_FUNCTIONAL_RANGE 10 // degC
#define PID_INTEGRAL_DRIVE_MAX PID_MAX // Limit for the integral term
#define PID_INTEGRAL_DRIVE_MAX PID_MAX // Limit for the integral term
// this adds an experimental additional term to the heating power, proportional to the extrusion speed.
// if Kc is chosen well, the additional required power due to increased melting should be compensated.
//#define PID_ADD_EXTRUSION_RATE
#define LPQ_MAX_LEN 50
// HotEnd{HE0,HE1,HE2,HE3}
// HotEnd{HE0,HE1,HE2,HE3}
#define DEFAULT_Kp {40, 40, 40, 40} // Kp for E0, E1, E2, E3
#define DEFAULT_Kp {40, 40, 40, 40} // Kp for E0, E1, E2, E3
#define DEFAULT_Ki {07, 07, 07, 07} // Ki for E0, E1, E2, E3
#define DEFAULT_Ki {07, 07, 07, 07} // Ki for E0, E1, E2, E3
#define DEFAULT_Kd {60, 60, 60, 60} // Kd for E0, E1, E2, E3
#define DEFAULT_Kd {60, 60, 60, 60} // Kd for E0, E1, E2, E3
#define DEFAULT_Kc {100, 100, 100, 100} // heating power = Kc * (e_speed)
/***********************************************************************/
/***********************************************************************/
...
...
This diff is collapsed.
Click to expand it.
MarlinKimbra/Marlin_main.cpp
View file @
03152a21
...
@@ -195,7 +195,7 @@
...
@@ -195,7 +195,7 @@
* M250 - Set LCD contrast C<contrast value> (value 0..63)
* M250 - Set LCD contrast C<contrast value> (value 0..63)
* M280 - Set servo position absolute. P: servo index, S: angle or microseconds
* M280 - Set servo position absolute. P: servo index, S: angle or microseconds
* M300 - Play beep sound S<frequency Hz> P<duration ms>
* M300 - Play beep sound S<frequency Hz> P<duration ms>
* M301 - Set PID parameters P I
and D
* M301 - Set PID parameters P I
D and C
* M302 - Allow cold extrudes, or set the minimum extrude S<temperature>.
* M302 - Allow cold extrudes, or set the minimum extrude S<temperature>.
* M303 - PID relay autotune S<temperature> sets the target temperature. (default target temperature = 150C)
* M303 - PID relay autotune S<temperature> sets the target temperature. (default target temperature = 150C)
* M304 - Set bed PID parameters P I and D
* M304 - Set bed PID parameters P I and D
...
@@ -489,6 +489,10 @@ unsigned long printer_usage_seconds;
...
@@ -489,6 +489,10 @@ unsigned long printer_usage_seconds;
boolean
chdkActive
=
false
;
boolean
chdkActive
=
false
;
#endif
#endif
#if ENABLED(PIDTEMP) && ENABLED(PID_ADD_EXTRUSION_RATE)
int
lpq_len
=
20
;
#endif
//===========================================================================
//===========================================================================
//================================ Functions ================================
//================================ Functions ================================
//===========================================================================
//===========================================================================
...
@@ -5899,25 +5903,44 @@ inline void gcode_M226() {
...
@@ -5899,25 +5903,44 @@ inline void gcode_M226() {
#if ENABLED(PIDTEMP)
#if ENABLED(PIDTEMP)
/**
/**
* M301: Set PID parameters P I D
* M301: Set PID parameters P I D (and optionally C, L)
*
* P[float] Kp term
* I[float] Ki term (unscaled)
* D[float] Kd term (unscaled)
*
* With PID_ADD_EXTRUSION_RATE:
*
* C[float] Kc term
* L[float] LPQ length
*/
*/
inline
void
gcode_M301
()
{
inline
void
gcode_M301
()
{
// multi-hotend PID patch: M301 updates or prints a single hotend's PID values
// multi-hotend PID patch: M301 updates or prints a single hotend's PID values
// default behaviour (omitting E parameter) is to update for hotend 0 only
// default behaviour (omitting E parameter) is to update for hotend 0 only
int
e
=
code_seen
(
'
E
'
)
?
code_value
()
:
0
;
// hotend being updated
int
e
=
code_seen
(
'
H
'
)
?
code_value
()
:
0
;
// hotend being updated
if
(
e
<
HOTENDS
)
{
// catch bad input value
if
(
e
<
HOTENDS
)
{
// catch bad input value
if
(
code_seen
(
'P'
))
PID_PARAM
(
Kp
,
e
)
=
code_value
();
if
(
code_seen
(
'P'
))
PID_PARAM
(
Kp
,
e
)
=
code_value
();
if
(
code_seen
(
'I'
))
PID_PARAM
(
Ki
,
e
)
=
scalePID_i
(
code_value
());
if
(
code_seen
(
'I'
))
PID_PARAM
(
Ki
,
e
)
=
scalePID_i
(
code_value
());
if
(
code_seen
(
'D'
))
PID_PARAM
(
Kd
,
e
)
=
scalePID_d
(
code_value
());
if
(
code_seen
(
'D'
))
PID_PARAM
(
Kd
,
e
)
=
scalePID_d
(
code_value
());
#if ENABLED(PID_ADD_EXTRUSION_RATE)
if
(
code_seen
(
'C'
))
PID_PARAM
(
Kc
,
e
)
=
code_value
();
if
(
code_seen
(
'L'
))
lpq_len
=
code_value
();
NOMORE
(
lpq_len
,
LPQ_MAX_LEN
);
#endif
updatePID
();
updatePID
();
ECHO_SMV
(
OK
,
"e:"
,
e
);
ECHO_SMV
(
OK
,
"e:"
,
e
);
ECHO_MV
(
" p:"
,
PID_PARAM
(
Kp
,
e
));
ECHO_MV
(
" p:"
,
PID_PARAM
(
Kp
,
e
));
ECHO_MV
(
" i:"
,
unscalePID_i
(
PID_PARAM
(
Ki
,
e
)));
ECHO_MV
(
" i:"
,
unscalePID_i
(
PID_PARAM
(
Ki
,
e
)));
ECHO_EMV
(
" d:"
,
unscalePID_d
(
PID_PARAM
(
Kd
,
e
)));
ECHO_MV
(
" d:"
,
unscalePID_d
(
PID_PARAM
(
Kd
,
e
)));
#if ENABLED(PID_ADD_EXTRUSION_RATE)
ECHO_MV
(
" c:"
,
PID_PARAM
(
Kc
,
e
));
#endif
ECHO_E
;
}
}
else
{
else
{
ECHO_LM
(
ER
,
MSG_INVALID_EXTRUDER
);
ECHO_LM
(
ER
,
MSG_INVALID_EXTRUDER
);
...
...
This diff is collapsed.
Click to expand it.
MarlinKimbra/Marlin_main.h
View file @
03152a21
...
@@ -10,7 +10,6 @@ void idle(bool ignore_stepper_queue = false);
...
@@ -10,7 +10,6 @@ void idle(bool ignore_stepper_queue = false);
void
manage_inactivity
(
bool
ignore_stepper_queue
=
false
);
void
manage_inactivity
(
bool
ignore_stepper_queue
=
false
);
void
FlushSerialRequestResend
();
void
FlushSerialRequestResend
();
void
ok_to_send
();
void
ok_to_send
();
...
@@ -172,6 +171,10 @@ extern int fanSpeed;
...
@@ -172,6 +171,10 @@ extern int fanSpeed;
extern
void
IDLE_OOZING_retract
(
bool
retracting
);
extern
void
IDLE_OOZING_retract
(
bool
retracting
);
#endif
#endif
#if ENABLED(PIDTEMP) && ENABLED(PID_ADD_EXTRUSION_RATE)
extern
int
lpq_len
;
#endif
#if ENABLED(FWRETRACT)
#if ENABLED(FWRETRACT)
extern
bool
autoretract_enabled
;
extern
bool
autoretract_enabled
;
extern
bool
retracted
[
EXTRUDERS
];
// extruder[n].retracted
extern
bool
retracted
[
EXTRUDERS
];
// extruder[n].retracted
...
...
This diff is collapsed.
Click to expand it.
MarlinKimbra/configuration_store.cpp
View file @
03152a21
...
@@ -29,10 +29,10 @@
...
@@ -29,10 +29,10 @@
*
*
*/
*/
#define EEPROM_VERSION "V2
4
"
#define EEPROM_VERSION "V2
5
"
/**
/**
* V2
4
EEPROM Layout:
* V2
5
EEPROM Layout:
*
*
* ver
* ver
* M92 XYZ E0 ... axis_steps_per_unit X,Y,Z,E0 ... (per extruder)
* M92 XYZ E0 ... axis_steps_per_unit X,Y,Z,E0 ... (per extruder)
...
@@ -77,10 +77,11 @@
...
@@ -77,10 +77,11 @@
* M145 S2 F gumPreheatFanSpeed
* M145 S2 F gumPreheatFanSpeed
*
*
* PIDTEMP:
* PIDTEMP:
* M301 E0 PID Kp[0], Ki[0], Kd[0]
* M301 E0 PIDC Kp[0], Ki[0], Kd[0], Kc[0]
* M301 E1 PID Kp[1], Ki[1], Kd[1]
* M301 E1 PIDC Kp[1], Ki[1], Kd[1], Kc[1]
* M301 E2 PID Kp[2], Ki[2], Kd[2]
* M301 E2 PIDC Kp[2], Ki[2], Kd[2], Kc[2]
* M301 E3 PID Kp[3], Ki[3], Kd[3]
* M301 E3 PIDC Kp[3], Ki[3], Kd[3], Kc[3]
* M301 L lpq_len
*
*
* PIDTEMPBED:
* PIDTEMPBED:
* M304 PID bedKp, bedKi, bedKd
* M304 PID bedKp, bedKi, bedKd
...
@@ -199,13 +200,19 @@ void Config_StoreSettings() {
...
@@ -199,13 +200,19 @@ void Config_StoreSettings() {
EEPROM_WRITE_VAR
(
i
,
gumPreheatFanSpeed
);
EEPROM_WRITE_VAR
(
i
,
gumPreheatFanSpeed
);
#if ENABLED(PIDTEMP)
#if ENABLED(PIDTEMP)
for
(
int
e
=
0
;
e
<
HOTENDS
;
e
++
)
{
for
(
int
h
=
0
;
h
<
HOTENDS
;
h
++
)
{
EEPROM_WRITE_VAR
(
i
,
PID_PARAM
(
Kp
,
e
));
EEPROM_WRITE_VAR
(
i
,
PID_PARAM
(
Kp
,
h
));
EEPROM_WRITE_VAR
(
i
,
PID_PARAM
(
Ki
,
e
));
EEPROM_WRITE_VAR
(
i
,
PID_PARAM
(
Ki
,
h
));
EEPROM_WRITE_VAR
(
i
,
PID_PARAM
(
Kd
,
e
));
EEPROM_WRITE_VAR
(
i
,
PID_PARAM
(
Kd
,
h
));
EEPROM_WRITE_VAR
(
i
,
PID_PARAM
(
Kc
,
h
));
}
}
#endif
#endif
#if DISABLED(PID_ADD_EXTRUSION_RATE)
int
lpq_len
=
20
;
#endif
EEPROM_WRITE_VAR
(
i
,
lpq_len
);
#if ENABLED(PIDTEMPBED)
#if ENABLED(PIDTEMPBED)
EEPROM_WRITE_VAR
(
i
,
bedKp
);
EEPROM_WRITE_VAR
(
i
,
bedKp
);
EEPROM_WRITE_VAR
(
i
,
bedKi
);
EEPROM_WRITE_VAR
(
i
,
bedKi
);
...
@@ -336,13 +343,19 @@ void Config_RetrieveSettings() {
...
@@ -336,13 +343,19 @@ void Config_RetrieveSettings() {
EEPROM_READ_VAR
(
i
,
gumPreheatFanSpeed
);
EEPROM_READ_VAR
(
i
,
gumPreheatFanSpeed
);
#if ENABLED(PIDTEMP)
#if ENABLED(PIDTEMP)
for
(
int8_t
e
=
0
;
e
<
HOTENDS
;
e
++
)
{
for
(
int8_t
h
=
0
;
h
<
HOTENDS
;
h
++
)
{
EEPROM_READ_VAR
(
i
,
PID_PARAM
(
Kp
,
e
));
EEPROM_READ_VAR
(
i
,
PID_PARAM
(
Kp
,
h
));
EEPROM_READ_VAR
(
i
,
PID_PARAM
(
Ki
,
e
));
EEPROM_READ_VAR
(
i
,
PID_PARAM
(
Ki
,
h
));
EEPROM_READ_VAR
(
i
,
PID_PARAM
(
Kd
,
e
));
EEPROM_READ_VAR
(
i
,
PID_PARAM
(
Kd
,
h
));
EEPROM_READ_VAR
(
i
,
PID_PARAM
(
Kc
,
h
));
}
}
#endif // PIDTEMP
#endif // PIDTEMP
#if DISABLED(PID_ADD_EXTRUSION_RATE)
int
lpq_len
;
#endif
EEPROM_READ_VAR
(
i
,
lpq_len
);
#if ENABLED(PIDTEMPBED)
#if ENABLED(PIDTEMPBED)
EEPROM_READ_VAR
(
i
,
bedKp
);
EEPROM_READ_VAR
(
i
,
bedKp
);
EEPROM_READ_VAR
(
i
,
bedKi
);
EEPROM_READ_VAR
(
i
,
bedKi
);
...
@@ -420,14 +433,15 @@ void Config_ResetDefault() {
...
@@ -420,14 +433,15 @@ void Config_ResetDefault() {
float
tmp6
[]
=
DEFAULT_Kp
;
float
tmp6
[]
=
DEFAULT_Kp
;
float
tmp7
[]
=
DEFAULT_Ki
;
float
tmp7
[]
=
DEFAULT_Ki
;
float
tmp8
[]
=
DEFAULT_Kd
;
float
tmp8
[]
=
DEFAULT_Kd
;
float
tmp9
[]
=
DEFAULT_Kc
;
#endif // PIDTEMP
#endif // PIDTEMP
#if ENABLED(HOTEND_OFFSET_X) && ENABLED(HOTEND_OFFSET_Y)
#if ENABLED(HOTEND_OFFSET_X) && ENABLED(HOTEND_OFFSET_Y)
float
tmp
9
[]
=
HOTEND_OFFSET_X
;
float
tmp
10
[]
=
HOTEND_OFFSET_X
;
float
tmp1
0
[]
=
HOTEND_OFFSET_Y
;
float
tmp1
1
[]
=
HOTEND_OFFSET_Y
;
#else
#else
float
tmp9
[]
=
{
0
};
float
tmp10
[]
=
{
0
};
float
tmp10
[]
=
{
0
};
float
tmp11
[]
=
{
0
};
#endif
#endif
for
(
int8_t
i
=
0
;
i
<
3
+
EXTRUDERS
;
i
++
)
{
for
(
int8_t
i
=
0
;
i
<
3
+
EXTRUDERS
;
i
++
)
{
...
@@ -459,14 +473,14 @@ void Config_ResetDefault() {
...
@@ -459,14 +473,14 @@ void Config_ResetDefault() {
else
else
max_e_jerk
[
i
]
=
tmp5
[
max_i
-
1
];
max_e_jerk
[
i
]
=
tmp5
[
max_i
-
1
];
#if HOTENDS > 1
#if HOTENDS > 1
max_i
=
sizeof
(
tmp
9
)
/
sizeof
(
*
tmp9
);
max_i
=
sizeof
(
tmp
10
)
/
sizeof
(
*
tmp10
);
if
(
i
<
max_i
)
if
(
i
<
max_i
)
hotend_offset
[
X_AXIS
][
i
]
=
tmp
9
[
i
];
hotend_offset
[
X_AXIS
][
i
]
=
tmp
10
[
i
];
else
else
hotend_offset
[
X_AXIS
][
i
]
=
0
;
hotend_offset
[
X_AXIS
][
i
]
=
0
;
max_i
=
sizeof
(
tmp1
0
)
/
sizeof
(
*
tmp10
);
max_i
=
sizeof
(
tmp1
1
)
/
sizeof
(
*
tmp11
);
if
(
i
<
max_i
)
if
(
i
<
max_i
)
hotend_offset
[
Y_AXIS
][
i
]
=
tmp1
0
[
i
];
hotend_offset
[
Y_AXIS
][
i
]
=
tmp1
1
[
i
];
else
else
hotend_offset
[
Y_AXIS
][
i
]
=
0
;
hotend_offset
[
Y_AXIS
][
i
]
=
0
;
#endif // HOTENDS > 1
#endif // HOTENDS > 1
...
@@ -535,11 +549,15 @@ void Config_ResetDefault() {
...
@@ -535,11 +549,15 @@ void Config_ResetDefault() {
#endif
#endif
#if ENABLED(PIDTEMP)
#if ENABLED(PIDTEMP)
for
(
int8_t
e
=
0
;
e
<
HOTENDS
;
e
++
)
{
for
(
int8_t
h
=
0
;
h
<
HOTENDS
;
h
++
)
{
Kp
[
e
]
=
tmp6
[
e
];
Kp
[
h
]
=
tmp6
[
h
];
Ki
[
e
]
=
scalePID_i
(
tmp7
[
e
]);
Ki
[
h
]
=
scalePID_i
(
tmp7
[
h
]);
Kd
[
e
]
=
scalePID_d
(
tmp8
[
e
]);
Kd
[
h
]
=
scalePID_d
(
tmp8
[
h
]);
Kc
[
h
]
=
tmp9
[
h
];
}
}
#if ENABLED(PID_ADD_EXTRUSION_RATE)
lpq_len
=
20
;
// default last-position-queue size
#endif
// call updatePID (similar to when we have processed M301)
// call updatePID (similar to when we have processed M301)
updatePID
();
updatePID
();
#endif // PIDTEMP
#endif // PIDTEMP
...
@@ -752,12 +770,19 @@ void Config_ResetDefault() {
...
@@ -752,12 +770,19 @@ void Config_ResetDefault() {
ECHO_LM
(
DB
,
"PID settings:"
);
ECHO_LM
(
DB
,
"PID settings:"
);
}
}
#if ENABLED(PIDTEMP)
#if ENABLED(PIDTEMP)
for
(
int
e
=
0
;
e
<
HOTENDS
;
e
++
)
{
for
(
int
h
=
0
;
h
<
HOTENDS
;
h
++
)
{
ECHO_SMV
(
DB
,
" M301 E"
,
e
);
ECHO_SMV
(
DB
,
" M301 H"
,
h
);
ECHO_MV
(
" P"
,
PID_PARAM
(
Kp
,
e
));
ECHO_MV
(
" P"
,
PID_PARAM
(
Kp
,
h
));
ECHO_MV
(
" I"
,
unscalePID_i
(
PID_PARAM
(
Ki
,
e
)));
ECHO_MV
(
" I"
,
unscalePID_i
(
PID_PARAM
(
Ki
,
h
)));
ECHO_EMV
(
" D"
,
unscalePID_d
(
PID_PARAM
(
Kd
,
e
)));
ECHO_MV
(
" D"
,
unscalePID_d
(
PID_PARAM
(
Kd
,
h
)));
}
#if ENABLED(PID_ADD_EXTRUSION_RATE)
ECHO_MV
(
" C"
,
PID_PARAM
(
Kc
,
h
));
#endif
ECHO_E
;
}
#if ENABLED(PID_ADD_EXTRUSION_RATE)
ECHO_SMV
(
DB
,
" M301 L"
,
lpq_len
);
#endif
#endif
#endif
#if ENABLED(PIDTEMPBED)
#if ENABLED(PIDTEMPBED)
ECHO_SMV
(
DB
,
" M304 P"
,
bedKp
);
// for compatibility with hosts, only echos values for E0
ECHO_SMV
(
DB
,
" M304 P"
,
bedKp
);
// for compatibility with hosts, only echos values for E0
...
...
This diff is collapsed.
Click to expand it.
MarlinKimbra/language.h
View file @
03152a21
...
@@ -179,6 +179,7 @@
...
@@ -179,6 +179,7 @@
#define MSG_KP " Kp: "
#define MSG_KP " Kp: "
#define MSG_KI " Ki: "
#define MSG_KI " Ki: "
#define MSG_KD " Kd: "
#define MSG_KD " Kd: "
#define MSG_KC " Kc: "
#define MSG_B "B:"
#define MSG_B "B:"
#define MSG_T "T:"
#define MSG_T "T:"
#define MSG_AT "@:"
#define MSG_AT "@:"
...
@@ -191,6 +192,7 @@
...
@@ -191,6 +192,7 @@
#define MSG_PID_DEBUG_PTERM " pTerm "
#define MSG_PID_DEBUG_PTERM " pTerm "
#define MSG_PID_DEBUG_ITERM " iTerm "
#define MSG_PID_DEBUG_ITERM " iTerm "
#define MSG_PID_DEBUG_DTERM " dTerm "
#define MSG_PID_DEBUG_DTERM " dTerm "
#define MSG_PID_DEBUG_CTERM " cTerm "
#define MSG_INVALID_EXTRUDER_NUM " - Invalid extruder number !"
#define MSG_INVALID_EXTRUDER_NUM " - Invalid extruder number !"
#define MSG_HEATER_BED "bed"
#define MSG_HEATER_BED "bed"
...
...
This diff is collapsed.
Click to expand it.
MarlinKimbra/temperature.cpp
View file @
03152a21
...
@@ -123,6 +123,12 @@ static volatile bool temp_meas_ready = false;
...
@@ -123,6 +123,12 @@ static volatile bool temp_meas_ready = false;
static
float
pTerm
[
HOTENDS
];
static
float
pTerm
[
HOTENDS
];
static
float
iTerm
[
HOTENDS
];
static
float
iTerm
[
HOTENDS
];
static
float
dTerm
[
HOTENDS
];
static
float
dTerm
[
HOTENDS
];
#if ENABLED(PID_ADD_EXTRUSION_RATE)
static
float
cTerm
[
HOTENDS
];
static
long
last_position
[
EXTRUDERS
];
static
long
lpq
[
LPQ_MAX_LEN
];
static
int
lpq_ptr
=
0
;
#endif
//int output;
//int output;
static
float
pid_error
[
HOTENDS
];
static
float
pid_error
[
HOTENDS
];
static
float
temp_iState_min
[
HOTENDS
];
static
float
temp_iState_min
[
HOTENDS
];
...
@@ -160,7 +166,7 @@ static unsigned char soft_pwm[HOTENDS];
...
@@ -160,7 +166,7 @@ static unsigned char soft_pwm[HOTENDS];
#endif
#endif
#if ENABLED(PIDTEMP)
#if ENABLED(PIDTEMP)
float
Kp
[
HOTENDS
],
Ki
[
HOTENDS
],
Kd
[
HOTENDS
];
float
Kp
[
HOTENDS
],
Ki
[
HOTENDS
],
Kd
[
HOTENDS
]
,
Kc
[
HOTENDS
]
;
#endif //PIDTEMP
#endif //PIDTEMP
// 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
...
@@ -390,8 +396,8 @@ void autotempShutdown() {
...
@@ -390,8 +396,8 @@ void autotempShutdown() {
void
updatePID
()
{
void
updatePID
()
{
#if ENABLED(PIDTEMP)
#if ENABLED(PIDTEMP)
for
(
int
e
=
0
;
e
<
HOTENDS
;
e
++
)
{
for
(
int
h
=
0
;
h
<
HOTENDS
;
h
++
)
{
temp_iState_max
[
e
]
=
PID_INTEGRAL_DRIVE_MAX
/
PID_PARAM
(
Ki
,
e
);
temp_iState_max
[
h
]
=
PID_INTEGRAL_DRIVE_MAX
/
PID_PARAM
(
Ki
,
h
);
}
}
#endif
#endif
#if ENABLED(PIDTEMPBED)
#if ENABLED(PIDTEMPBED)
...
@@ -484,13 +490,13 @@ void checkExtruderAutoFans() {
...
@@ -484,13 +490,13 @@ void checkExtruderAutoFans() {
//
//
// Temperature Error Handlers
// Temperature Error Handlers
//
//
inline
void
_temp_error
(
int
e
,
const
char
*
serial_msg
,
const
char
*
lcd_msg
)
{
inline
void
_temp_error
(
int
h
,
const
char
*
serial_msg
,
const
char
*
lcd_msg
)
{
static
bool
killed
=
false
;
static
bool
killed
=
false
;
if
(
IsRunning
())
{
if
(
IsRunning
())
{
ECHO_S
(
ER
);
ECHO_S
(
ER
);
PS_PGM
(
serial_msg
);
PS_PGM
(
serial_msg
);
ECHO_M
(
MSG_STOPPED_HEATER
);
ECHO_M
(
MSG_STOPPED_HEATER
);
if
(
e
>=
0
)
ECHO_EV
((
int
)
e
);
else
ECHO_EM
(
MSG_HEATER_BED
);
if
(
h
>=
0
)
ECHO_EV
((
int
)
h
);
else
ECHO_EM
(
MSG_HEATER_BED
);
#if ENABLED(ULTRA_LCD)
#if ENABLED(ULTRA_LCD)
lcd_setalertstatuspgm
(
lcd_msg
);
lcd_setalertstatuspgm
(
lcd_msg
);
#endif
#endif
...
@@ -506,63 +512,97 @@ inline void _temp_error(int e, const char *serial_msg, const char *lcd_msg) {
...
@@ -506,63 +512,97 @@ inline void _temp_error(int e, const char *serial_msg, const char *lcd_msg) {
#endif
#endif
}
}
void
max_temp_error
(
uint8_t
e
)
{
void
max_temp_error
(
uint8_t
h
)
{
_temp_error
(
e
,
PSTR
(
MSG_T_MAXTEMP
),
PSTR
(
MSG_ERR_MAXTEMP
));
_temp_error
(
h
,
PSTR
(
MSG_T_MAXTEMP
),
PSTR
(
MSG_ERR_MAXTEMP
));
}
}
void
min_temp_error
(
uint8_t
e
)
{
void
min_temp_error
(
uint8_t
h
)
{
_temp_error
(
e
,
PSTR
(
MSG_T_MINTEMP
),
PSTR
(
MSG_ERR_MINTEMP
));
_temp_error
(
h
,
PSTR
(
MSG_T_MINTEMP
),
PSTR
(
MSG_ERR_MINTEMP
));
}
}
float
get_pid_output
(
int
e
)
{
float
get_pid_output
(
int
h
)
{
float
pid_output
;
float
pid_output
;
#if ENABLED(PIDTEMP)
#if ENABLED(PIDTEMP)
#if ENABLED(PID_OPENLOOP)
#if ENABLED(PID_OPENLOOP)
pid_output
=
constrain
(
target_temperature
[
e
],
0
,
PID_MAX
);
pid_output
=
constrain
(
target_temperature
[
h
],
0
,
PID_MAX
);
#else
#else
pid_error
[
e
]
=
target_temperature
[
e
]
-
current_temperature
[
e
];
pid_error
[
h
]
=
target_temperature
[
h
]
-
current_temperature
[
h
];
dTerm
[
e
]
=
K2
*
PID_PARAM
(
Kd
,
e
)
*
(
current_temperature
[
e
]
-
temp_dState
[
e
])
+
K1
*
dTerm
[
e
];
dTerm
[
h
]
=
K2
*
PID_PARAM
(
Kd
,
h
)
*
(
current_temperature
[
h
]
-
temp_dState
[
h
])
+
K1
*
dTerm
[
h
];
temp_dState
[
e
]
=
current_temperature
[
e
];
temp_dState
[
h
]
=
current_temperature
[
h
];
if
(
pid_error
[
e
]
>
PID_FUNCTIONAL_RANGE
)
{
if
(
pid_error
[
h
]
>
PID_FUNCTIONAL_RANGE
)
{
pid_output
=
BANG_MAX
;
pid_output
=
BANG_MAX
;
pid_reset
[
e
]
=
true
;
pid_reset
[
h
]
=
true
;
}
}
else
if
(
pid_error
[
e
]
<
-
PID_FUNCTIONAL_RANGE
||
target_temperature
[
e
]
==
0
)
{
else
if
(
pid_error
[
h
]
<
-
PID_FUNCTIONAL_RANGE
||
target_temperature
[
h
]
==
0
)
{
pid_output
=
0
;
pid_output
=
0
;
pid_reset
[
e
]
=
true
;
pid_reset
[
h
]
=
true
;
}
}
else
{
else
{
if
(
pid_reset
[
e
])
{
if
(
pid_reset
[
h
])
{
temp_iState
[
e
]
=
0.0
;
temp_iState
[
h
]
=
0.0
;
pid_reset
[
e
]
=
false
;
pid_reset
[
h
]
=
false
;
}
}
pTerm
[
e
]
=
PID_PARAM
(
Kp
,
e
)
*
pid_error
[
e
];
pTerm
[
h
]
=
PID_PARAM
(
Kp
,
h
)
*
pid_error
[
h
];
temp_iState
[
e
]
+=
pid_error
[
e
];
temp_iState
[
h
]
+=
pid_error
[
h
];
temp_iState
[
e
]
=
constrain
(
temp_iState
[
e
],
temp_iState_min
[
e
],
temp_iState_max
[
e
]);
temp_iState
[
h
]
=
constrain
(
temp_iState
[
h
],
temp_iState_min
[
h
],
temp_iState_max
[
h
]);
iTerm
[
e
]
=
PID_PARAM
(
Ki
,
e
)
*
temp_iState
[
e
];
iTerm
[
h
]
=
PID_PARAM
(
Ki
,
h
)
*
temp_iState
[
h
];
pid_output
=
pTerm
[
h
]
+
iTerm
[
h
]
-
dTerm
[
h
];
#if ENABLED(PID_ADD_EXTRUSION_RATE)
cTerm
[
h
]
=
0
;
#if ENABLED(SINGLENOZZLE)
long
e_position
=
st_get_position
(
E_AXIS
);
if
(
e_position
>
last_position
[
active_extruder
])
{
lpq
[
lpq_ptr
++
]
=
e_position
-
last_position
[
active_extruder
];
last_position
[
active_extruder
]
=
e_position
;
}
else
{
lpq
[
lpq_ptr
++
]
=
0
;
}
if
(
lpq_ptr
>=
lpq_len
)
lpq_ptr
=
0
;
cTerm
[
0
]
=
(
lpq
[
lpq_ptr
]
/
axis_steps_per_unit
[
E_AXIS
+
active_extruder
])
*
Kc
[
0
];
pid_output
+=
cTerm
[
0
]
/
100.0
;
#else
if
(
h
==
active_extruder
)
{
long
e_position
=
st_get_position
(
E_AXIS
);
if
(
e_position
>
last_position
[
h
])
{
lpq
[
lpq_ptr
++
]
=
e_position
-
last_position
[
h
];
last_position
[
h
]
=
e_position
;
}
else
{
lpq
[
lpq_ptr
++
]
=
0
;
}
if
(
lpq_ptr
>=
lpq_len
)
lpq_ptr
=
0
;
cTerm
[
h
]
=
(
lpq
[
lpq_ptr
]
/
axis_steps_per_unit
[
E_AXIS
+
active_extruder
])
*
Kc
[
h
];
pid_output
+=
cTerm
[
h
]
/
100.0
;
}
#endif // SINGLENOZZLE
#endif // PID_ADD_EXTRUSION_RATE
pid_output
=
pTerm
[
e
]
+
iTerm
[
e
]
-
dTerm
[
e
];
if
(
pid_output
>
PID_MAX
)
{
if
(
pid_output
>
PID_MAX
)
{
if
(
pid_error
[
e
]
>
0
)
temp_iState
[
e
]
-=
pid_error
[
e
];
// conditional un-integration
if
(
pid_error
[
h
]
>
0
)
temp_iState
[
h
]
-=
pid_error
[
h
];
// conditional un-integration
pid_output
=
PID_MAX
;
pid_output
=
PID_MAX
;
}
}
else
if
(
pid_output
<
0
)
{
else
if
(
pid_output
<
0
)
{
if
(
pid_error
[
e
]
<
0
)
temp_iState
[
e
]
-=
pid_error
[
e
];
// conditional un-integration
if
(
pid_error
[
h
]
<
0
)
temp_iState
[
h
]
-=
pid_error
[
h
];
// conditional un-integration
pid_output
=
0
;
pid_output
=
0
;
}
}
}
}
#endif //PID_OPENLOOP
#endif //
PID_OPENLOOP
#if ENABLED(PID_DEBUG)
#if ENABLED(PID_DEBUG)
ECHO_SMV
(
DB
,
MSG_PID_DEBUG
,
e
);
ECHO_SMV
(
DB
,
MSG_PID_DEBUG
,
h
);
ECHO_MV
(
MSG_PID_DEBUG_INPUT
,
current_temperature
[
e
]);
ECHO_MV
(
MSG_PID_DEBUG_INPUT
,
current_temperature
[
h
]);
ECHO_MV
(
MSG_PID_DEBUG_OUTPUT
,
pid_output
);
ECHO_MV
(
MSG_PID_DEBUG_OUTPUT
,
pid_output
);
ECHO_MV
(
MSG_PID_DEBUG_PTERM
,
pTerm
[
e
]);
ECHO_MV
(
MSG_PID_DEBUG_PTERM
,
pTerm
[
h
]);
ECHO_MV
(
MSG_PID_DEBUG_ITERM
,
iTerm
[
e
]);
ECHO_MV
(
MSG_PID_DEBUG_ITERM
,
iTerm
[
h
]);
ECHO_EMV
(
MSG_PID_DEBUG_DTERM
,
dTerm
[
e
]);
ECHO_MV
(
MSG_PID_DEBUG_DTERM
,
dTerm
[
h
]);
#endif //PID_DEBUG
#if ENABLED(PID_ADD_EXTRUSION_RATE)
ECHO_MV
(
MSG_PID_DEBUG_CTERM
,
cTerm
[
h
]);
#endif
ECHO_E
;
#endif // PID_DEBUG
#else
/* PID off */
#else
/* PID off */
pid_output
=
(
current_temperature
[
e
]
<
target_temperature
[
e
])
?
PID_MAX
:
0
;
pid_output
=
(
current_temperature
[
h
]
<
target_temperature
[
h
])
?
PID_MAX
:
0
;
#endif
#endif
return
pid_output
;
return
pid_output
;
...
@@ -632,30 +672,30 @@ void manage_heater() {
...
@@ -632,30 +672,30 @@ void manage_heater() {
#endif
#endif
// Loop through all hotends
// Loop through all hotends
for
(
int
e
=
0
;
e
<
HOTENDS
;
e
++
)
{
for
(
int
h
=
0
;
h
<
HOTENDS
;
h
++
)
{
#if ENABLED(THERMAL_PROTECTION_HOTENDS)
#if ENABLED(THERMAL_PROTECTION_HOTENDS)
thermal_runaway_protection
(
&
thermal_runaway_state_machine
[
e
],
&
thermal_runaway_timer
[
e
],
current_temperature
[
e
],
target_temperature
[
e
],
e
,
THERMAL_PROTECTION_PERIOD
,
THERMAL_PROTECTION_HYSTERESIS
);
thermal_runaway_protection
(
&
thermal_runaway_state_machine
[
h
],
&
thermal_runaway_timer
[
h
],
current_temperature
[
h
],
target_temperature
[
h
],
h
,
THERMAL_PROTECTION_PERIOD
,
THERMAL_PROTECTION_HYSTERESIS
);
#endif
#endif
float
pid_output
=
get_pid_output
(
e
);
float
pid_output
=
get_pid_output
(
h
);
// Check if temperature is within the correct range
// Check if temperature is within the correct range
soft_pwm
[
e
]
=
current_temperature
[
e
]
>
minttemp
[
e
]
&&
current_temperature
[
e
]
<
maxttemp
[
e
]
?
(
int
)
pid_output
>>
1
:
0
;
soft_pwm
[
h
]
=
current_temperature
[
h
]
>
minttemp
[
h
]
&&
current_temperature
[
h
]
<
maxttemp
[
h
]
?
(
int
)
pid_output
>>
1
:
0
;
// Check if the temperature is failing to increase
// Check if the temperature is failing to increase
#if ENABLED(THERMAL_PROTECTION_HOTENDS)
#if ENABLED(THERMAL_PROTECTION_HOTENDS)
// Is it time to check this extruder's heater?
// Is it time to check this extruder's heater?
if
(
watch_heater_next_ms
[
e
]
&&
ms
>
watch_heater_next_ms
[
e
])
{
if
(
watch_heater_next_ms
[
h
]
&&
ms
>
watch_heater_next_ms
[
h
])
{
// Has it failed to increase enough?
// Has it failed to increase enough?
if
(
degHotend
(
e
)
<
watch_target_temp
[
e
])
{
if
(
degHotend
(
h
)
<
watch_target_temp
[
h
])
{
// Stop!
// Stop!
_temp_error
(
e
,
PSTR
(
MSG_T_HEATING_FAILED
),
PSTR
(
MSG_HEATING_FAILED_LCD
));
_temp_error
(
h
,
PSTR
(
MSG_T_HEATING_FAILED
),
PSTR
(
MSG_HEATING_FAILED_LCD
));
}
}
else
{
else
{
// Start again if the target is still far off
// Start again if the target is still far off
start_watching_heater
(
e
);
start_watching_heater
(
h
);
}
}
}
}
...
@@ -828,8 +868,8 @@ static void updateTemperaturesFromRawValues() {
...
@@ -828,8 +868,8 @@ static void updateTemperaturesFromRawValues() {
#if ENABLED(HEATER_0_USES_MAX6675)
#if ENABLED(HEATER_0_USES_MAX6675)
current_temperature_raw
[
0
]
=
read_max6675
();
current_temperature_raw
[
0
]
=
read_max6675
();
#endif
#endif
for
(
uint8_t
e
=
0
;
e
<
HOTENDS
;
e
++
)
{
for
(
uint8_t
h
=
0
;
h
<
HOTENDS
;
h
++
)
{
current_temperature
[
e
]
=
analog2temp
(
current_temperature_raw
[
e
],
e
);
current_temperature
[
h
]
=
analog2temp
(
current_temperature_raw
[
h
],
h
);
}
}
current_temperature_bed
=
analog2tempBed
(
current_temperature_bed_raw
);
current_temperature_bed
=
analog2tempBed
(
current_temperature_bed_raw
);
#if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT)
#if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT)
...
@@ -932,12 +972,12 @@ void tp_init() {
...
@@ -932,12 +972,12 @@ void tp_init() {
#endif
#endif
// Finish init of mult hotends arrays
// Finish init of mult hotends arrays
for
(
int
e
=
0
;
e
<
HOTENDS
;
e
++
)
{
for
(
int
h
=
0
;
h
<
HOTENDS
;
h
++
)
{
// populate with the first value
// populate with the first value
maxttemp
[
e
]
=
maxttemp
[
0
];
maxttemp
[
h
]
=
maxttemp
[
0
];
#if ENABLED(PIDTEMP)
#if ENABLED(PIDTEMP)
temp_iState_min
[
e
]
=
0.0
;
temp_iState_min
[
h
]
=
0.0
;
temp_iState_max
[
e
]
=
PID_INTEGRAL_DRIVE_MAX
/
PID_PARAM
(
Ki
,
e
);
temp_iState_max
[
h
]
=
PID_INTEGRAL_DRIVE_MAX
/
PID_PARAM
(
Ki
,
h
);
#endif //PIDTEMP
#endif //PIDTEMP
#if ENABLED(PIDTEMPBED)
#if ENABLED(PIDTEMPBED)
temp_iState_min_bed
=
0.0
;
temp_iState_min_bed
=
0.0
;
...
@@ -945,6 +985,12 @@ void tp_init() {
...
@@ -945,6 +985,12 @@ void tp_init() {
#endif // PIDTEMPBED
#endif // PIDTEMPBED
}
}
#if ENABLED(PID_ADD_EXTRUSION_RATE)
for
(
int
e
=
0
;
e
<
EXTRUDERS
;
e
++
)
{
last_position
[
e
]
=
0
;
}
#endif
#if HAS(HEATER_0)
#if HAS(HEATER_0)
SET_OUTPUT
(
HEATER_0_PIN
);
SET_OUTPUT
(
HEATER_0_PIN
);
#endif
#endif
...
...
This diff is collapsed.
Click to expand it.
MarlinKimbra/temperature.h
View file @
03152a21
...
@@ -62,12 +62,12 @@ extern float current_temperature_bed;
...
@@ -62,12 +62,12 @@ extern float current_temperature_bed;
#endif
#endif
#if ENABLED(PIDTEMP)
#if ENABLED(PIDTEMP)
extern
float
Kp
[
HOTENDS
],
Ki
[
HOTENDS
],
Kd
[
HOTENDS
];
extern
float
Kp
[
HOTENDS
],
Ki
[
HOTENDS
],
Kd
[
HOTENDS
]
,
Kc
[
HOTENDS
]
;
#define PID_PARAM(param, e) param[e] // use macro to point to array value
#define PID_PARAM(param, e) param[e] // use macro to point to array value
#endif
#endif
#if ENABLED(PIDTEMPBED)
#if ENABLED(PIDTEMPBED)
extern
float
bedKp
,
bedKi
,
bedKd
;
extern
float
bedKp
,
bedKi
,
bedKd
;
#endif
#endif
#if ENABLED(PIDTEMP) || ENABLED(PIDTEMPBED)
#if ENABLED(PIDTEMP) || ENABLED(PIDTEMPBED)
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment