temperature.h 4.85 KB
Newer Older
MagoKimbra's avatar
MagoKimbra committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/*
  temperature.h - temperature controller
  Part of Marlin

  Copyright (c) 2011 Erik van der Zalm

  Grbl 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.

  Grbl 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 Grbl.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef TEMPERATURE_H
MagoKimbra's avatar
MagoKimbra committed
22
#define TEMPERATURE_H
MagoKimbra's avatar
MagoKimbra committed
23 24 25 26 27

// public functions
void tp_init();  //initialize the heating
void manage_heater(); //it is critical that this is called periodically.

Simone Primarosa's avatar
Simone Primarosa committed
28
#if ENABLED(FILAMENT_SENSOR)
MagoKimbra's avatar
MagoKimbra committed
29 30
  // For converting raw Filament Width to milimeters
  float analog2widthFil();
MagoKimbra's avatar
MagoKimbra committed
31

MagoKimbra's avatar
MagoKimbra committed
32
  // For converting raw Filament Width to an extrusion ratio
MagoKimbra's avatar
MagoKimbra committed
33 34 35
  int widthFil_to_size_ratio();
#endif

Simone Primarosa's avatar
Simone Primarosa committed
36
#if HAS(POWER_CONSUMPTION_SENSOR)
MagoKimbra's avatar
MagoKimbra committed
37
  // For converting raw Power Consumption to watt
Simone Primarosa's avatar
Simone Primarosa committed
38
  float analog2voltage();
MagoKimbra's avatar
MagoKimbra committed
39 40
  float analog2current();
  float analog2power();
Simone Primarosa's avatar
Simone Primarosa committed
41 42 43
  float raw_analog2voltage();
  float analog2error(float current);
  float analog2efficiency(float watt);
MagoKimbra's avatar
MagoKimbra committed
44 45 46 47
#endif

// low level conversion routines
// do not use these routines and variables outside of temperature.cpp
Simone Primarosa's avatar
Simone Primarosa committed
48
extern int target_temperature[4];
MagoKimbra's avatar
MagoKimbra committed
49
extern float current_temperature[4];
MagoKimbra's avatar
MagoKimbra committed
50
#if ENABLED(SHOW_TEMP_ADC_VALUES)
MagoKimbra's avatar
MagoKimbra committed
51 52 53 54 55
  extern int current_temperature_raw[4];
  extern int current_temperature_bed_raw;
#endif
extern int target_temperature_bed;
extern float current_temperature_bed;
MagoKimbra's avatar
MagoKimbra committed
56
#if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT)
MagoKimbra's avatar
MagoKimbra committed
57 58 59
  extern float redundant_temperature;
#endif

Simone Primarosa's avatar
Simone Primarosa committed
60
#if HAS(CONTROLLERFAN)
MagoKimbra's avatar
MagoKimbra committed
61 62 63
  extern unsigned char soft_pwm_bed;
#endif

MagoKimbra's avatar
MagoKimbra committed
64
#if ENABLED(PIDTEMP)
MagoKimbra's avatar
MagoKimbra committed
65
  extern float Kp[HOTENDS], Ki[HOTENDS], Kd[HOTENDS], Kc[HOTENDS];
MagoKimbra's avatar
MagoKimbra committed
66
  #define PID_PARAM(param, e) param[e] // use macro to point to array value
MagoKimbra's avatar
MagoKimbra committed
67
#endif
MagoKimbra's avatar
MagoKimbra committed
68

MagoKimbra's avatar
MagoKimbra committed
69
#if ENABLED(PIDTEMPBED)
MagoKimbra's avatar
MagoKimbra committed
70
  extern float bedKp, bedKi, bedKd;
MagoKimbra's avatar
MagoKimbra committed
71 72
#endif

MagoKimbra's avatar
MagoKimbra committed
73
#if ENABLED(PIDTEMP) || ENABLED(PIDTEMPBED)
MagoKimbra's avatar
MagoKimbra committed
74 75 76 77 78 79
  float scalePID_i(float i);
  float scalePID_d(float d);
  float unscalePID_i(float i);
  float unscalePID_d(float d);
#endif

MagoKimbra's avatar
MagoKimbra committed
80
#if ENABLED(BABYSTEPPING)
MagoKimbra's avatar
MagoKimbra committed
81 82
  extern volatile int babystepsTodo[3];
#endif
MagoKimbra's avatar
MagoKimbra committed
83

MagoKimbra's avatar
MagoKimbra committed
84 85 86 87 88 89 90 91 92 93 94 95
//high level conversion routines, for use outside of temperature.cpp
//inline so that there is no performance decrease.
//deg=degreeCelsius
#if HOTENDS <= 1
  #define HOTEND_ARG 0
#else
  #define HOTEND_ARG hotend
#endif

FORCE_INLINE float degHotend(uint8_t hotend) { return current_temperature[HOTEND_ARG]; }
FORCE_INLINE float degBed() { return current_temperature_bed; }

Simone Primarosa's avatar
Simone Primarosa committed
96
#if ENABLED(SHOW_TEMP_ADC_VALUES)
MagoKimbra's avatar
MagoKimbra committed
97 98 99 100 101 102 103
  FORCE_INLINE float rawHotendTemp(uint8_t hotend) { return current_temperature_raw[HOTEND_ARG]; }
  FORCE_INLINE float rawBedTemp() { return current_temperature_bed_raw; }
#endif

FORCE_INLINE float degTargetHotend(uint8_t hotend) { return target_temperature[HOTEND_ARG]; }
FORCE_INLINE float degTargetBed() { return target_temperature_bed; }

Simone Primarosa's avatar
Simone Primarosa committed
104
#if ENABLED(THERMAL_PROTECTION_HOTENDS)
MagoKimbra's avatar
MagoKimbra committed
105
  void start_watching_heater(int h = 0);
MagoKimbra's avatar
MagoKimbra committed
106
#endif
MagoKimbra's avatar
MagoKimbra committed
107

MagoKimbra's avatar
MagoKimbra committed
108
FORCE_INLINE void setTargetHotend(const float& celsius, uint8_t hotend) {
MagoKimbra's avatar
MagoKimbra committed
109
  target_temperature[HOTEND_ARG] = celsius;
MagoKimbra's avatar
MagoKimbra committed
110
  #if ENABLED(THERMAL_PROTECTION_HOTENDS)
MagoKimbra's avatar
MagoKimbra committed
111 112 113
    start_watching_heater(HOTEND_ARG);
  #endif
}
MagoKimbra's avatar
MagoKimbra committed
114
FORCE_INLINE void setTargetBed(const float& celsius) { target_temperature_bed = celsius; }
MagoKimbra's avatar
MagoKimbra committed
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145

FORCE_INLINE bool isHeatingHotend(uint8_t hotend) { return target_temperature[HOTEND_ARG] > current_temperature[HOTEND_ARG]; }
FORCE_INLINE bool isHeatingBed() { return target_temperature_bed > current_temperature_bed; }

FORCE_INLINE bool isCoolingHotend(uint8_t hotend) { return target_temperature[HOTEND_ARG] < current_temperature[HOTEND_ARG]; }
FORCE_INLINE bool isCoolingBed() { return target_temperature_bed < current_temperature_bed; }

#define HOTEND_ROUTINES(NR) \
  FORCE_INLINE float degHotend##NR() { return degHotend(NR); } \
  FORCE_INLINE float degTargetHotend##NR() { return degTargetHotend(NR); } \
  FORCE_INLINE void setTargetHotend##NR(const float c) { setTargetHotend(c, NR); } \
  FORCE_INLINE bool isHeatingHotend##NR() { return isHeatingHotend(NR); } \
  FORCE_INLINE bool isCoolingHotend##NR() { return isCoolingHotend(NR); }
HOTEND_ROUTINES(0);
#if HOTENDS > 1
  HOTEND_ROUTINES(1);
#else
  #define setTargetHotend1(c) do{}while(0)
#endif
#if HOTENDS > 2
  HOTEND_ROUTINES(2);
#else
  #define setTargetHotend2(c) do{}while(0)
#endif
#if HOTENDS > 3
  HOTEND_ROUTINES(3);
#else
  #define setTargetHotend3(c) do{}while(0)
#endif

int getHeaterPower(int heater);
MagoKimbra's avatar
MagoKimbra committed
146
void disable_all_heaters();
MagoKimbra's avatar
MagoKimbra committed
147 148
void updatePID();

MagoKimbra's avatar
MagoKimbra committed
149
void PID_autotune(float temp, int hotend, int ncycles);
MagoKimbra's avatar
MagoKimbra committed
150 151 152

void setExtruderAutoFanState(int pin, bool state);
void checkExtruderAutoFans();
153
extern void autotempShutdown();
MagoKimbra's avatar
MagoKimbra committed
154 155

#endif // TEMPERATURE_H