diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index c51b0ed5ef..ff849d22dc 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -61,7 +61,7 @@ // @section info // Author info of this build printed to the host during boot and M115 -#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Original author or contributor. //#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) // @section machine @@ -802,6 +802,40 @@ //#define BED_LIMIT_SWITCHING // Keep the bed temperature within BED_HYSTERESIS of the target #endif +/** + * Peltier Bed - Heating and Cooling + * + * A Peltier device transfers heat from one side to the other in proportion to the amount of + * current flowing through the device and the direction of current flow. So the same device + * can both heat and cool. + * + * When "cooling" in addition to rejecting the heat transferred from the hot side to the cold + * side, the dissipated power (voltage * current) must also be rejected. Be sure to set up a + * fan that can be powered in sync with the Peltier unit. + * + * This feature is only set up to run in bang-bang mode because Peltiers don't handle PWM + * well without filter circuitry. + * + * Since existing 3D printers are made to handle relatively high current for the heated bed, + * we can use the heated bed power pins to control the Peltier power using the same G-codes + * as the heated bed (M140, M190, etc.). + * + * A second GPIO pin is required to control current direction. + * Two configurations are possible: Relay and H-Bridge + * + * (At this time only relay is supported. H-bridge requires 4 MOS switches configured in H-Bridge.) + * + * Power is handled by the bang-bang control loop: 0 or 255. + * Cooling applications are more common than heating, so the pin states are commonly: + * LOW = Heating = Relay Energized + * HIGH = Cooling = Relay in "Normal" state + */ +//#define PELTIER_BED +#if ENABLED(PELTIER_BED) + #define PELTIER_DIR_PIN -1 // Relay control pin for Peltier + #define PELTIER_DIR_HEAT_STATE LOW // The relay pin state that causes the Peltier to heat +#endif + // Add 'M190 R T' for more gradual M190 R bed cooling. //#define BED_ANNEALING_GCODE diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index fc3b26d8a0..3928078d64 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -203,7 +203,7 @@ // #if DISABLED(PIDTEMPBED) #define BED_CHECK_INTERVAL 5000 // (ms) Interval between checks in bang-bang control - #if ENABLED(BED_LIMIT_SWITCHING) + #if ANY(BED_LIMIT_SWITCHING, PELTIER_BED) #define BED_HYSTERESIS 2 // (°C) Only set the relevant heater state when ABS(T-target) > BED_HYSTERESIS #endif #endif diff --git a/Marlin/Makefile b/Marlin/Makefile index e5ba9cb341..0c5d7c2273 100644 --- a/Marlin/Makefile +++ b/Marlin/Makefile @@ -187,6 +187,17 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1033) # RAMPS Plus 3DYMY (Power outputs: Spindle, Controller Fan) else ifeq ($(HARDWARE_MOTHERBOARD),1034) +# RAMPS 1.6+ (Power outputs: Hotend, Fan, Bed) +else ifeq ($(HARDWARE_MOTHERBOARD),1035) +# RAMPS 1.6+ (Power outputs: Hotend0, Hotend1, Bed) +else ifeq ($(HARDWARE_MOTHERBOARD),1036) +# RAMPS 1.6+ (Power outputs: Hotend, Fan0, Fan1) +else ifeq ($(HARDWARE_MOTHERBOARD),1037) +# RAMPS 1.6+ (Power outputs: Hotend0, Hotend1, Fan) +else ifeq ($(HARDWARE_MOTHERBOARD),1038) +# RAMPS 1.6+ (Power outputs: Spindle, Controller Fan) +else ifeq ($(HARDWARE_MOTHERBOARD),1039) + # # RAMPS Derivatives - ATmega1280, ATmega2560 # @@ -221,108 +232,113 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1112) else ifeq ($(HARDWARE_MOTHERBOARD),1113) # BigTreeTech or BIQU KFB2.0 else ifeq ($(HARDWARE_MOTHERBOARD),1114) -# zrib V2.0 (Chinese RAMPS replica) +# Zonestar zrib V2.0 (Chinese RAMPS replica) else ifeq ($(HARDWARE_MOTHERBOARD),1115) -# zrib V5.2 (Chinese RAMPS replica) +# Zonestar zrib V5.2 (Chinese RAMPS replica) else ifeq ($(HARDWARE_MOTHERBOARD),1116) -# Felix 2.0+ Electronics Board (RAMPS like) +# Zonestar zrib V5.3 (Chinese RAMPS replica) else ifeq ($(HARDWARE_MOTHERBOARD),1117) -# Invent-A-Part RigidBoard +# Felix 2.0+ Electronics Board (RAMPS like) else ifeq ($(HARDWARE_MOTHERBOARD),1118) -# Invent-A-Part RigidBoard V2 +# Invent-A-Part RigidBoard else ifeq ($(HARDWARE_MOTHERBOARD),1119) -# Sainsmart 2-in-1 board +# Invent-A-Part RigidBoard V2 else ifeq ($(HARDWARE_MOTHERBOARD),1120) -# Ultimaker +# Sainsmart 2-in-1 board else ifeq ($(HARDWARE_MOTHERBOARD),1121) -# Ultimaker (Older electronics. Pre 1.5.4. This is rare) +# Ultimaker else ifeq ($(HARDWARE_MOTHERBOARD),1122) +# Ultimaker (Older electronics. Pre 1.5.4. This is rare) +else ifeq ($(HARDWARE_MOTHERBOARD),1123) MCU ?= atmega1280 PROG_MCU ?= m1280 # Azteeg X3 -else ifeq ($(HARDWARE_MOTHERBOARD),1123) -# Azteeg X3 Pro else ifeq ($(HARDWARE_MOTHERBOARD),1124) -# Ultimainboard 2.x (Uses TEMP_SENSOR 20) +# Azteeg X3 Pro else ifeq ($(HARDWARE_MOTHERBOARD),1125) -# Rumba +# Ultimainboard 2.x (Uses TEMP_SENSOR 20) else ifeq ($(HARDWARE_MOTHERBOARD),1126) -# Raise3D N series Rumba derivative +# Rumba else ifeq ($(HARDWARE_MOTHERBOARD),1127) -# Rapide Lite 200 (v1, low-cost RUMBA clone with drv) +# Raise3D N series Rumba derivative else ifeq ($(HARDWARE_MOTHERBOARD),1128) -# Formbot T-Rex 2 Plus +# Rapide Lite 200 (v1, low-cost RUMBA clone with drv) else ifeq ($(HARDWARE_MOTHERBOARD),1129) -# Formbot T-Rex 3 +# Formbot T-Rex 2 Plus else ifeq ($(HARDWARE_MOTHERBOARD),1130) -# Formbot Raptor +# Formbot T-Rex 3 else ifeq ($(HARDWARE_MOTHERBOARD),1131) -# Formbot Raptor 2 +# Formbot Raptor else ifeq ($(HARDWARE_MOTHERBOARD),1132) -# bq ZUM Mega 3D +# Formbot Raptor 2 else ifeq ($(HARDWARE_MOTHERBOARD),1133) -# MakeBoard Mini v2.1.2 by MicroMake +# bq ZUM Mega 3D else ifeq ($(HARDWARE_MOTHERBOARD),1134) -# TriGorilla Anycubic version 1.3-based on RAMPS EFB +# MakeBoard Mini v2.1.2 by MicroMake else ifeq ($(HARDWARE_MOTHERBOARD),1135) -# ... Ver 1.4 +# TriGorilla Anycubic version 1.3-based on RAMPS EFB else ifeq ($(HARDWARE_MOTHERBOARD),1136) -# ... Rev 1.1 (new servo pin order) +# ... Ver 1.4 else ifeq ($(HARDWARE_MOTHERBOARD),1137) -# Creality: Ender-4, CR-8 +# ... Rev 1.1 (new servo pin order) else ifeq ($(HARDWARE_MOTHERBOARD),1138) -# Creality: CR10S, CR20, CR-X +# Creality: Ender-4, CR-8 else ifeq ($(HARDWARE_MOTHERBOARD),1139) -# Dagoma F5 +# Creality: CR10S, CR20, CR-X else ifeq ($(HARDWARE_MOTHERBOARD),1140) -# FYSETC F6 1.3 +# Dagoma F5 else ifeq ($(HARDWARE_MOTHERBOARD),1141) -# FYSETC F6 1.4 +# Dagoma D6 (as found in the Dagoma DiscoUltimate V2 TMC) else ifeq ($(HARDWARE_MOTHERBOARD),1142) -# Wanhao Duplicator i3 Plus +# FYSETC F6 1.3 else ifeq ($(HARDWARE_MOTHERBOARD),1143) -# VORON Design +# FYSETC F6 1.4 else ifeq ($(HARDWARE_MOTHERBOARD),1144) -# Tronxy TRONXY-V3-1.0 +# Wanhao Duplicator i3 Plus else ifeq ($(HARDWARE_MOTHERBOARD),1145) -# Z-Bolt X Series +# VORON Design else ifeq ($(HARDWARE_MOTHERBOARD),1146) -# TT OSCAR +# Tronxy TRONXY-V3-1.0 else ifeq ($(HARDWARE_MOTHERBOARD),1147) -# Overlord/Overlord Pro +# Z-Bolt X Series else ifeq ($(HARDWARE_MOTHERBOARD),1148) -# ADIMLab Gantry v1 +# TT OSCAR else ifeq ($(HARDWARE_MOTHERBOARD),1149) -# ADIMLab Gantry v2 -else ifeq ($(HARDWARE_MOTHERBOARD),1150) # BIQU Tango V1 -else ifeq ($(HARDWARE_MOTHERBOARD),1151) +else ifeq ($(HARDWARE_MOTHERBOARD),1150) # MKS GEN L V2 -else ifeq ($(HARDWARE_MOTHERBOARD),1152) +else ifeq ($(HARDWARE_MOTHERBOARD),1151) # MKS GEN L V2.1 -else ifeq ($(HARDWARE_MOTHERBOARD),1153) +else ifeq ($(HARDWARE_MOTHERBOARD),1152) # Copymaster 3D -else ifeq ($(HARDWARE_MOTHERBOARD),1154) +else ifeq ($(HARDWARE_MOTHERBOARD),1153) # Ortur 4 -else ifeq ($(HARDWARE_MOTHERBOARD),1155) +else ifeq ($(HARDWARE_MOTHERBOARD),1154) # Tenlog D3 Hero IDEX printer +else ifeq ($(HARDWARE_MOTHERBOARD),1155) +# Tenlog D3, D5, D6 IDEX Printer else ifeq ($(HARDWARE_MOTHERBOARD),1156) -# Tenlog D3,5,6 Pro IDEX printers -else ifeq ($(HARDWARE_MOTHERBOARD),1157) # Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Fan, Bed) -else ifeq ($(HARDWARE_MOTHERBOARD),1158) +else ifeq ($(HARDWARE_MOTHERBOARD),1157) # Ramps S 1.2 by Sakul.cz (Power outputs: Hotend0, Hotend1, Hotend2, Bed) -else ifeq ($(HARDWARE_MOTHERBOARD),1159) +else ifeq ($(HARDWARE_MOTHERBOARD),1158) # Ramps S 1.2 by Sakul.cz (Power outputs: Hotend, Fan0, Fan1, Bed) -else ifeq ($(HARDWARE_MOTHERBOARD),1160) +else ifeq ($(HARDWARE_MOTHERBOARD),1159) # Longer LK1 PRO / Alfawise U20 Pro (PRO version) -else ifeq ($(HARDWARE_MOTHERBOARD),1161) +else ifeq ($(HARDWARE_MOTHERBOARD),1160) # Longer LKx PRO / Alfawise Uxx Pro (PRO version) -else ifeq ($(HARDWARE_MOTHERBOARD),1162) -# Zonestar zrib V5.3 (Chinese RAMPS replica) -else ifeq ($(HARDWARE_MOTHERBOARD),1163) +else ifeq ($(HARDWARE_MOTHERBOARD),1161) # Pxmalion Core I3 +else ifeq ($(HARDWARE_MOTHERBOARD),1162) +# Panowin Cutlass (as found in the Panowin F1) +else ifeq ($(HARDWARE_MOTHERBOARD),1163) +# Kodama Bardo V1.x (as found in the Kodama Trinus) else ifeq ($(HARDWARE_MOTHERBOARD),1164) +# XTLW MFF V1.0 +else ifeq ($(HARDWARE_MOTHERBOARD),1165) +# XTLW MFF V2.0 +else ifeq ($(HARDWARE_MOTHERBOARD),1166) + # # RAMBo and derivatives @@ -340,7 +356,7 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1203) else ifeq ($(HARDWARE_MOTHERBOARD),1204) # abee Scoovo X9H else ifeq ($(HARDWARE_MOTHERBOARD),1205) -# Rambo ThinkerV2 +# ThinkerV2 else ifeq ($(HARDWARE_MOTHERBOARD),1206) # @@ -383,30 +399,40 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1315) else ifeq ($(HARDWARE_MOTHERBOARD),1316) # Geeetech GT2560 Rev B for A10(M/T/D) else ifeq ($(HARDWARE_MOTHERBOARD),1317) -# Geeetech GT2560 Rev B for A10(M/T/D) -else ifeq ($(HARDWARE_MOTHERBOARD),1318) # Geeetech GT2560 Rev B for Mecreator2 +else ifeq ($(HARDWARE_MOTHERBOARD),1318) +# Geeetech GT2560 Rev B for A20(M/T/D) else ifeq ($(HARDWARE_MOTHERBOARD),1319) -# Geeetech GT2560 Rev B for A20(M/T/D) +# Geeetech GT2560 Rev B for A10(M/T/D) else ifeq ($(HARDWARE_MOTHERBOARD),1320) -# Einstart retrofit -else ifeq ($(HARDWARE_MOTHERBOARD),1321) -# Wanhao 0ne+ i3 Mini -else ifeq ($(HARDWARE_MOTHERBOARD),1322) -# Leapfrog Xeed 2015 -else ifeq ($(HARDWARE_MOTHERBOARD),1323) -# PICA Shield (original version) -else ifeq ($(HARDWARE_MOTHERBOARD),1324) -# PICA Shield (rev C or later) -else ifeq ($(HARDWARE_MOTHERBOARD),1325) -# Intamsys 4.0 (Funmat HT) -else ifeq ($(HARDWARE_MOTHERBOARD),1326) -# Malyan M180 Mainboard Version 2 (no display function, direct G-code only) -else ifeq ($(HARDWARE_MOTHERBOARD),1327) # Geeetech GT2560 Rev B for A20(M/T/D) +else ifeq ($(HARDWARE_MOTHERBOARD),1321) +# Einstart retrofit +else ifeq ($(HARDWARE_MOTHERBOARD),1322) +# Wanhao 0ne+ i3 Mini +else ifeq ($(HARDWARE_MOTHERBOARD),1323) +# Overlord/Overlord Pro +else ifeq ($(HARDWARE_MOTHERBOARD),1324) +# ADIMLab Gantry v1 +else ifeq ($(HARDWARE_MOTHERBOARD),1325) +# ADIMLab Gantry v2 +else ifeq ($(HARDWARE_MOTHERBOARD),1326) +# Leapfrog Xeed 2015 +else ifeq ($(HARDWARE_MOTHERBOARD),1327) +# PICA Shield (original version) else ifeq ($(HARDWARE_MOTHERBOARD),1328) -# Mega controller & Protoneer CNC Shield V3.00 +# PICA Shield (rev C or later) else ifeq ($(HARDWARE_MOTHERBOARD),1329) +# Intamsys 4.0 (Funmat HT) +else ifeq ($(HARDWARE_MOTHERBOARD),1330) +# Malyan M180 Mainboard Version 2 (no display function, direct G-code only) +else ifeq ($(HARDWARE_MOTHERBOARD),1331) +# Mega controller & Protoneer CNC Shield V3.00 +else ifeq ($(HARDWARE_MOTHERBOARD),1332) +# WEEDO 62A board (TINA2, Monoprice Cadet, etc.) +else ifeq ($(HARDWARE_MOTHERBOARD),1333) +# Geeetech GT2560 V4.1B for A10(M/T/D) +else ifeq ($(HARDWARE_MOTHERBOARD),1334) # # ATmega1281, ATmega2561 @@ -440,7 +466,7 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1502) HARDWARE_VARIANT ?= Sanguino MCU ?= atmega644p PROG_MCU ?= m644p -# Melzi V2.0 +# Melzi V2 else ifeq ($(HARDWARE_MOTHERBOARD),1503) HARDWARE_VARIANT ?= Sanguino MCU ?= atmega1284p @@ -450,36 +476,41 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1504) HARDWARE_VARIANT ?= Sanguino MCU ?= atmega1284p PROG_MCU ?= m1284p -# Melzi Creality3D board (for CR-10 etc) +# Melzi Creality3D (for CR-10 etc) else ifeq ($(HARDWARE_MOTHERBOARD),1505) HARDWARE_VARIANT ?= Sanguino MCU ?= atmega1284p PROG_MCU ?= m1284p -# Melzi Malyan M150 board +# Melzi Creality3D (for Ender-2) else ifeq ($(HARDWARE_MOTHERBOARD),1506) HARDWARE_VARIANT ?= Sanguino MCU ?= atmega1284p PROG_MCU ?= m1284p -# Tronxy X5S +# Melzi Malyan M150 else ifeq ($(HARDWARE_MOTHERBOARD),1507) HARDWARE_VARIANT ?= Sanguino MCU ?= atmega1284p PROG_MCU ?= m1284p -# STB V1.1 +# Tronxy X5S else ifeq ($(HARDWARE_MOTHERBOARD),1508) HARDWARE_VARIANT ?= Sanguino MCU ?= atmega1284p PROG_MCU ?= m1284p -# Azteeg X1 +# STB V1.1 else ifeq ($(HARDWARE_MOTHERBOARD),1509) HARDWARE_VARIANT ?= Sanguino MCU ?= atmega1284p PROG_MCU ?= m1284p -# Anet 1.0 (Melzi clone) +# Azteeg X1 else ifeq ($(HARDWARE_MOTHERBOARD),1510) HARDWARE_VARIANT ?= Sanguino MCU ?= atmega1284p PROG_MCU ?= m1284p +# Anet 1.0 (Melzi clone) +else ifeq ($(HARDWARE_MOTHERBOARD),1511) + HARDWARE_VARIANT ?= Sanguino + MCU ?= atmega1284p + PROG_MCU ?= m1284p # ZoneStar ZMIB V2 else ifeq ($(HARDWARE_MOTHERBOARD),1511) HARDWARE_VARIANT ?= Sanguino diff --git a/Marlin/Version.h b/Marlin/Version.h index c5ff3bdc27..a38680ccf9 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2024-10-05" +//#define STRING_DISTRIBUTION_DATE "2024-10-11" /** * Defines a generic printer name to be output to the LCD after booting Marlin. diff --git a/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp b/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp index e508f90e61..bb011ec6f4 100644 --- a/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp +++ b/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp @@ -111,11 +111,11 @@ void TFT_FSMC::init() { HAL_SRAM_Init(&SRAMx, &timing, &extTiming); + __HAL_RCC_DMA2_CLK_ENABLE(); + #ifdef STM32F1xx - __HAL_RCC_DMA1_CLK_ENABLE(); - DMAtx.Instance = DMA1_Channel1; + DMAtx.Instance = DMA2_Channel1; #elif defined(STM32F4xx) - __HAL_RCC_DMA2_CLK_ENABLE(); DMAtx.Instance = DMA2_Stream0; DMAtx.Init.Channel = DMA_CHANNEL_0; DMAtx.Init.FIFOMode = DMA_FIFOMODE_ENABLE; diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index fb17669161..f48f6d28e1 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -79,8 +79,8 @@ #define BOARD_MKS_GEN_13 1112 // MKS GEN v1.3 or 1.4 #define BOARD_MKS_GEN_L 1113 // MKS GEN L #define BOARD_KFB_2 1114 // BigTreeTech or BIQU KFB2.0 -#define BOARD_ZRIB_V20 1115 // zrib V2.0 (Chinese RAMPS replica) -#define BOARD_ZRIB_V52 1116 // zrib V5.2 (Chinese RAMPS replica) +#define BOARD_ZRIB_V20 1115 // Zonestar zrib V2.0 (Chinese RAMPS replica) +#define BOARD_ZRIB_V52 1116 // Zonestar zrib V5.2 (Chinese RAMPS replica) #define BOARD_ZRIB_V53 1117 // Zonestar zrib V5.3 (Chinese RAMPS replica) #define BOARD_FELIX2 1118 // Felix 2.0+ Electronics Board (RAMPS like) #define BOARD_RIGIDBOARD 1119 // Invent-A-Part RigidBoard diff --git a/Marlin/src/inc/Changes.h b/Marlin/src/inc/Changes.h index 2842bda571..8e7a71ecfc 100644 --- a/Marlin/src/inc/Changes.h +++ b/Marlin/src/inc/Changes.h @@ -676,7 +676,7 @@ #elif defined(Z2_USE_ENDSTOP) #error "Z2_USE_ENDSTOP is obsolete. Instead set Z2_STOP_PIN directly. (e.g., 'Z2_USE_ENDSTOP _ZMAX_' becomes 'Z2_STOP_PIN Z_MAX_PIN')" #elif defined(Z3_USE_ENDSTOP) - #error "Z3_USE_ENDSTOP is obsolete. Instead set Z2_STOP_PIN directly. (e.g., 'Z3_USE_ENDSTOP _ZMAX_' becomes 'Z3_STOP_PIN Z_MAX_PIN')" + #error "Z3_USE_ENDSTOP is obsolete. Instead set Z3_STOP_PIN directly. (e.g., 'Z3_USE_ENDSTOP _ZMAX_' becomes 'Z3_STOP_PIN Z_MAX_PIN')" #elif defined(Z4_USE_ENDSTOP) #error "Z4_USE_ENDSTOP is obsolete. Instead set Z4_STOP_PIN directly. (e.g., 'Z4_USE_ENDSTOP _ZMAX_' becomes 'Z4_STOP_PIN Z_MAX_PIN')" #elif defined(INTEGRATED_BABYSTEPPING) diff --git a/Marlin/src/inc/Conditionals-5-post.h b/Marlin/src/inc/Conditionals-5-post.h index 8579afc6eb..55d91c4b81 100644 --- a/Marlin/src/inc/Conditionals-5-post.h +++ b/Marlin/src/inc/Conditionals-5-post.h @@ -3039,7 +3039,7 @@ #endif /** - * Heated bed requires settings + * Heated Bed required settings */ #if HAS_HEATED_BED #ifndef MIN_BED_POWER @@ -3049,6 +3049,14 @@ #define MAX_BED_POWER 255 #endif #define WRITE_HEATER_BED(v) WRITE(HEATER_BED_PIN, (v) ^ ENABLED(HEATER_BED_INVERTING)) + #if ENABLED(PELTIER_BED) + /** + * A "Heated Bed" Peltier device needs a direction (heat/cool) to be + * implemented by a relay (single pin) or H-bridge (2 or 4 pin). + * H-Bridge can also perform PWM. (Not recommended for Peltier devices). + */ + #define WRITE_PELTIER_DIR(v) WRITE(PELTIER_DIR_PIN, (v) ? PELTIER_DIR_HEAT_STATE : !PELTIER_DIR_HEAT_STATE) + #endif #endif /** diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 818af3e0be..9a8efb0b82 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1073,8 +1073,8 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i #error "DIRECT_STEPPING does not currently support more than 3 axes (i.e., XYZ)." #elif ENABLED(FOAMCUTTER_XYUV) && !(HAS_I_AXIS && HAS_J_AXIS) #error "FOAMCUTTER_XYUV requires I and J steppers to be enabled." -#elif ENABLED(LINEAR_ADVANCE) && HAS_I_AXIS - #error "LINEAR_ADVANCE does not currently support the inclusion of an I axis." +#elif ENABLED(LIN_ADVANCE) && HAS_I_AXIS + #error "LIN_ADVANCE does not currently support the inclusion of an I axis." #endif /** diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 9b94d51018..cef91c7dcb 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2024-10-05" + #define STRING_DISTRIBUTION_DATE "2024-10-11" #endif /** diff --git a/Marlin/src/inc/Warnings.cpp b/Marlin/src/inc/Warnings.cpp index f10408dd9c..0ccc9d6acf 100644 --- a/Marlin/src/inc/Warnings.cpp +++ b/Marlin/src/inc/Warnings.cpp @@ -921,3 +921,10 @@ #if defined(ARDUINO_ARCH_HC32) && F_CPU == 200000000 #warning "HC32 clock is assumed to be 200MHz. If this isn't the case for your board please submit a report so we can add support." #endif + +/** + * Peltier with PIDTEMPBED + */ +#if ALL(PELTIER_BED, PIDTEMPBED) + #warning "PELTIER_BED with PIDTEMPBED requires extra circuitry. Use with caution." +#endif diff --git a/Marlin/src/lcd/language/language_pt_br.h b/Marlin/src/lcd/language/language_pt_br.h index 3281b897d8..61a5c7348f 100644 --- a/Marlin/src/lcd/language/language_pt_br.h +++ b/Marlin/src/lcd/language/language_pt_br.h @@ -41,7 +41,6 @@ namespace LanguageNarrow_pt_br { LSTR MSG_MEDIA_ABORTING = _UxGT("Abortando..."); LSTR MSG_MEDIA_INSERTED = _UxGT("Cartão inserido"); LSTR MSG_MEDIA_REMOVED = _UxGT("Cartão removido"); - LSTR MSG_MEDIA_RELEASED = _UxGT("Cartão liberado"); LSTR MSG_MEDIA_WAITING = _UxGT("Aguardando cartão"); LSTR MSG_MEDIA_READ_ERROR = _UxGT("Erro de leitura"); LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB removido"); diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 7e5c4bc9fd..cbb3498f55 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -1882,7 +1882,7 @@ void Temperature::mintemp_error(const heater_id_t heater_id OPTARG(ERR_INCLUDE_T static bool last_pause_state; #endif - do { + do { // 'break' out of this block #if DISABLED(PIDTEMPBED) if (PENDING(ms, next_bed_check_ms) @@ -1908,39 +1908,64 @@ void Temperature::mintemp_error(const heater_id_t heater_id OPTARG(ERR_INCLUDE_T constexpr bool bed_timed_out = false; #endif - if (!bed_timed_out) { - if (is_bed_preheating()) { - temp_bed.soft_pwm_amount = MAX_BED_POWER >> 1; - } - else { - #if ENABLED(PIDTEMPBED) - temp_bed.soft_pwm_amount = WITHIN(temp_bed.celsius, BED_MINTEMP, BED_MAXTEMP) ? (int)get_pid_output_bed() >> 1 : 0; - #else - // Check if temperature is within the correct band - if (WITHIN(temp_bed.celsius, BED_MINTEMP, BED_MAXTEMP)) { - #if ENABLED(BED_LIMIT_SWITCHING) + if (bed_timed_out) break; - // Range-limited "bang-bang" bed heating - if (temp_bed.is_above_target(BED_HYSTERESIS)) - temp_bed.soft_pwm_amount = 0; - else if (temp_bed.is_below_target(BED_HYSTERESIS)) - temp_bed.soft_pwm_amount = MAX_BED_POWER >> 1; - - #else // !PIDTEMPBED && !BED_LIMIT_SWITCHING - - // Simple (noisy) "bang-bang" bed heating - temp_bed.soft_pwm_amount = temp_bed.is_below_target() ? MAX_BED_POWER >> 1 : 0; - - #endif - } - else { - temp_bed.soft_pwm_amount = 0; - WRITE_HEATER_BED(LOW); - } - #endif - } + if (is_bed_preheating()) { + temp_bed.soft_pwm_amount = MAX_BED_POWER >> 1; + break; } + #if ENABLED(PIDTEMPBED) + + // + // PID Bed Heating + // + temp_bed.soft_pwm_amount = WITHIN(temp_bed.celsius, BED_MINTEMP, BED_MAXTEMP) ? (int)get_pid_output_bed() >> 1 : 0; + + #else // !PIDTEMPBED + + // + // Range-limited "bang-bang" bed heating + // + + // Bed Off if the current bed temperature is outside the allowed range + if (!WITHIN(temp_bed.celsius, BED_MINTEMP, BED_MAXTEMP)) { + temp_bed.soft_pwm_amount = 0; + WRITE_HEATER_BED(LOW); + break; + } + + #if ENABLED(PELTIER_BED) + /** + * Peltier bang-bang maintains max bed power but changes + * current direction to switch between heating/cooling. + */ + if (temp_bed.target && temp_bed.is_above_target(BED_HYSTERESIS)) { // Fast Cooling + temp_bed.soft_pwm_amount = MAX_BED_POWER; + temp_bed.peltier_dir_heating = false; + } + else if (temp_bed.is_below_target(BED_HYSTERESIS)) { // Heating + temp_bed.soft_pwm_amount = MAX_BED_POWER; + temp_bed.peltier_dir_heating = true; + } + else + temp_bed.soft_pwm_amount = 0; // Off (ambient cooling) + + #else // !PELTIER_BED + + #if ENABLED(BED_LIMIT_SWITCHING) + if (temp_bed.is_above_target(BED_HYSTERESIS)) // Cooling (implicit off) + temp_bed.soft_pwm_amount = 0; + else if (temp_bed.is_below_target(BED_HYSTERESIS)) // Heating + temp_bed.soft_pwm_amount = MAX_BED_POWER >> 1; + #else // Not bed limit switching + temp_bed.soft_pwm_amount = temp_bed.is_below_target() ? MAX_BED_POWER >> 1 : 0; + #endif + + #endif // !PELTIER_BED + + #endif // !PIDTEMPBED + } while (false); } @@ -2945,6 +2970,10 @@ void Temperature::init() { #endif #if HAS_HEATED_BED + #if ENABLED(PELTIER_BED) + SET_OUTPUT(PELTIER_DIR_PIN); + OUT_WRITE(PELTIER_DIR_PIN, !PELTIER_DIR_HEAT_STATE); + #endif #ifdef BOARD_OPENDRAIN_MOSFETS OUT_WRITE_OD(HEATER_BED_PIN, ENABLED(HEATER_BED_INVERTING)); #else @@ -3926,6 +3955,9 @@ void Temperature::isr() { #if HAS_HEATED_BED _PWM_MOD(BED, soft_pwm_bed, temp_bed); + #if ENABLED(PELTIER_BED) + WRITE_PELTIER_DIR(temp_bed.peltier_dir_heating); + #endif #endif #if HAS_HEATED_CHAMBER @@ -4392,15 +4424,15 @@ void Temperature::isr() { #if HAS_TEMP_SENSOR /** * Print a single heater state in the form: - * Bed: " B:nnn.nn /nnn.nn" - * Chamber: " C:nnn.nn /nnn.nn" - * Probe: " P:nnn.nn" - * Cooler: " L:nnn.nn /nnn.nn" - * Board: " M:nnn.nn" - * SoC: " S:nnn.nn" - * Redundant: " R:nnn.nn /nnn.nn" - * Extruder: " T0:nnn.nn /nnn.nn" - * With ADC: " T0:nnn.nn /nnn.nn (nnn.nn)" + * Extruder: " T0:nnn.nn /nnn.nn" + * Bed: " B:nnn.nn /nnn.nn" + * Chamber: " C:nnn.nn /nnn.nn" + * Cooler: " L:nnn.nn /nnn.nn" + * Probe: " P:nnn.nn" + * Board: " M:nnn.nn" + * SoC: " S:nnn.nn" + * Redundant: " R:nnn.nn /nnn.nn" + * With ADC: " T0:nnn.nn /nnn.nn (nnn.nn)" */ static void print_heater_state(const heater_id_t e, const_celsius_float_t c, const_celsius_float_t t OPTARG(SHOW_TEMP_ADC_VALUES, const float r) @@ -4418,12 +4450,12 @@ void Temperature::isr() { #if HAS_TEMP_CHAMBER case H_CHAMBER: k = 'C'; break; #endif - #if HAS_TEMP_PROBE - case H_PROBE: k = 'P'; show_t = false; break; - #endif #if HAS_TEMP_COOLER case H_COOLER: k = 'L'; break; #endif + #if HAS_TEMP_PROBE + case H_PROBE: k = 'P'; show_t = false; break; + #endif #if HAS_TEMP_BOARD case H_BOARD: k = 'M'; show_t = false; break; #endif @@ -4450,6 +4482,17 @@ void Temperature::isr() { delay(2); } + /** + * Print all heater states followed by power data on a single line. + * See print_heater_state for heater output strings. + * Power output strings are in the format: + * Extruder: " @:nnn" + * Bed: " B@:nnn" + * Peltier: " P@:H/C" + * Chamber: " C@:nnn" + * Cooler: " L@:nnn" + * Hotends: " @0:nnn @1:nnn ..." + */ void Temperature::print_heater_states(const int8_t target_extruder OPTARG(HAS_TEMP_REDUNDANT, const bool include_r/*=false*/) ) { @@ -4481,15 +4524,10 @@ void Temperature::isr() { HOTEND_LOOP() print_heater_state((heater_id_t)e, degHotend(e), degTargetHotend(e) OPTARG(SHOW_TEMP_ADC_VALUES, rawHotendTemp(e))); #endif SString<100> s(F(" @:"), getHeaterPower((heater_id_t)target_extruder)); - #if HAS_HEATED_BED - s.append(" B@:", getHeaterPower(H_BED)); - #endif - #if HAS_HEATED_CHAMBER - s.append(" C@:", getHeaterPower(H_CHAMBER)); - #endif - #if HAS_COOLER - s.append(" C@:", getHeaterPower(H_COOLER)); - #endif + TERN_(HAS_HEATED_BED, s.append(F(" B@:"), getHeaterPower(H_BED))); + TERN_(PELTIER_BED, s.append(F(" P@:"), temp_bed.peltier_dir_heating ? 'H' : 'C')); + TERN_(HAS_HEATED_CHAMBER, s.append(F(" C@:"), getHeaterPower(H_CHAMBER))); + TERN_(HAS_COOLER, s.append(F(" L@:"), getHeaterPower(H_COOLER))); #if HAS_MULTI_HOTEND HOTEND_LOOP() s.append(F(" @"), e, ':', getHeaterPower((heater_id_t)e)); #endif diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index d5ed80ad3a..0d5984b0f4 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -437,6 +437,9 @@ typedef struct HeaterInfo : public TempInfo { uint8_t soft_pwm_amount; bool is_below_target(const celsius_t offs=0) const { return (target - celsius > offs); } // celsius < target - offs bool is_above_target(const celsius_t offs=0) const { return (celsius - target > offs); } // celsius > target + offs + #if ENABLED(PELTIER_BED) + bool peltier_dir_heating; // = false + #endif } heater_info_t; // A heater with PID stabilization diff --git a/Marlin/src/pins/stm32h7/pins_BTT_SKR_V3_0.h b/Marlin/src/pins/stm32h7/pins_BTT_SKR_V3_0.h index d835486085..47c2d1cf37 100644 --- a/Marlin/src/pins/stm32h7/pins_BTT_SKR_V3_0.h +++ b/Marlin/src/pins/stm32h7/pins_BTT_SKR_V3_0.h @@ -21,6 +21,10 @@ */ #pragma once +/** + * BigTreeTech SKR 3 (STM32H743VI / STM32H723VG) + */ + #define BOARD_INFO_NAME "BTT SKR V3" #include "pins_BTT_SKR_V3_0_common.h" diff --git a/Marlin/src/pins/stm32h7/pins_BTT_SKR_V3_0_EZ.h b/Marlin/src/pins/stm32h7/pins_BTT_SKR_V3_0_EZ.h index 003f20f5cf..933ecf2dec 100644 --- a/Marlin/src/pins/stm32h7/pins_BTT_SKR_V3_0_EZ.h +++ b/Marlin/src/pins/stm32h7/pins_BTT_SKR_V3_0_EZ.h @@ -21,6 +21,10 @@ */ #pragma once +/** + * BigTreeTech SKR 3 EZ (STM32H743VI / STM32H723VG) + */ + #define BOARD_INFO_NAME "BTT SKR V3 EZ" #include "pins_BTT_SKR_V3_0_common.h" diff --git a/README.md b/README.md index 151765b8b6..43407f9da6 100644 --- a/README.md +++ b/README.md @@ -127,6 +127,16 @@ Name|Role|Link|Donate 🇺🇸 Bob Kuhn|Admin|[[@Bob-the-Kuhn](//github.com/Bob-the-Kuhn)]| 🇳🇱 Erik van der Zalm|Founder|[[@ErikZalm](//github.com/ErikZalm)]| +## Star History + + + + + + Star History Chart + + + ## License Marlin is published under the [GPL license](/LICENSE) because we believe in open development. The GPL comes with both rights and obligations. Whether you use Marlin firmware as the driver for your open or closed-source product, you must keep Marlin open, and you must provide your compatible Marlin source code to end users upon request. The most straightforward way to comply with the Marlin license is to make a fork of Marlin on Github, perform your modifications, and direct users to your modified fork. diff --git a/buildroot/share/PlatformIO/variants/MARLIN_BTT_EBB42_V1_1/variant_MARLIN_BTT_EBB42_V1_1.h b/buildroot/share/PlatformIO/variants/MARLIN_BTT_EBB42_V1_1/variant_MARLIN_BTT_EBB42_V1_1.h index 9373e2fa3b..170f8936bd 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_BTT_EBB42_V1_1/variant_MARLIN_BTT_EBB42_V1_1.h +++ b/buildroot/share/PlatformIO/variants/MARLIN_BTT_EBB42_V1_1/variant_MARLIN_BTT_EBB42_V1_1.h @@ -167,7 +167,7 @@ #endif // Extra HAL modules -#if !defined(HAL_DAC_MODULE_DISABLED) +#ifndef HAL_DAC_MODULE_DISABLED #define HAL_DAC_MODULE_ENABLED #endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F401RC/variant_MARLIN_STM32F401RC.h b/buildroot/share/PlatformIO/variants/MARLIN_F401RC/variant_MARLIN_STM32F401RC.h index 37d60d9306..779ef92a30 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_F401RC/variant_MARLIN_STM32F401RC.h +++ b/buildroot/share/PlatformIO/variants/MARLIN_F401RC/variant_MARLIN_STM32F401RC.h @@ -153,7 +153,7 @@ #endif // Extra HAL modules -#if !defined(HAL_SD_MODULE_DISABLED) +#ifndef HAL_SD_MODULE_DISABLED #define HAL_SD_MODULE_ENABLED #endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_G0B1VE/variant_MARLIN_STM32G0B1VE.h b/buildroot/share/PlatformIO/variants/MARLIN_G0B1VE/variant_MARLIN_STM32G0B1VE.h index e6f2251db0..0c999d2b89 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_G0B1VE/variant_MARLIN_STM32G0B1VE.h +++ b/buildroot/share/PlatformIO/variants/MARLIN_G0B1VE/variant_MARLIN_STM32G0B1VE.h @@ -225,7 +225,7 @@ #endif // Extra HAL modules -#if !defined(HAL_DAC_MODULE_DISABLED) +#ifndef HAL_DAC_MODULE_DISABLED #define HAL_DAC_MODULE_ENABLED #endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_H723VG/variant_MARLIN_STM32H723VG.h b/buildroot/share/PlatformIO/variants/MARLIN_H723VG/variant_MARLIN_STM32H723VG.h index c3e5c78ec5..e5072e8d30 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_H723VG/variant_MARLIN_STM32H723VG.h +++ b/buildroot/share/PlatformIO/variants/MARLIN_H723VG/variant_MARLIN_STM32H723VG.h @@ -228,16 +228,16 @@ #endif // Extra HAL modules -#if !defined(HAL_DAC_MODULE_DISABLED) +#ifndef HAL_DAC_MODULE_DISABLED #define HAL_DAC_MODULE_ENABLED #endif -#if !defined(HAL_ETH_MODULE_DISABLED) +#ifndef HAL_ETH_MODULE_DISABLED #define HAL_ETH_MODULE_ENABLED #endif -#if !defined(HAL_OSPI_MODULE_DISABLED) +#ifndef HAL_OSPI_MODULE_DISABLED #define HAL_OSPI_MODULE_ENABLED #endif -#if !defined(HAL_SD_MODULE_DISABLED) +#ifndef HAL_SD_MODULE_DISABLED #define HAL_SD_MODULE_ENABLED #endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_H723ZE/variant_MARLIN_STM32H723ZE.h b/buildroot/share/PlatformIO/variants/MARLIN_H723ZE/variant_MARLIN_STM32H723ZE.h index c9c631412a..ce6f6e7a06 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_H723ZE/variant_MARLIN_STM32H723ZE.h +++ b/buildroot/share/PlatformIO/variants/MARLIN_H723ZE/variant_MARLIN_STM32H723ZE.h @@ -269,16 +269,16 @@ #endif // Extra HAL modules -#if !defined(HAL_DAC_MODULE_DISABLED) +#ifndef HAL_DAC_MODULE_DISABLED #define HAL_DAC_MODULE_ENABLED #endif -#if !defined(HAL_ETH_MODULE_DISABLED) +#ifndef HAL_ETH_MODULE_DISABLED #define HAL_ETH_MODULE_ENABLED #endif -#if !defined(HAL_OSPI_MODULE_DISABLED) +#ifndef HAL_OSPI_MODULE_DISABLED #define HAL_OSPI_MODULE_ENABLED #endif -#if !defined(HAL_SD_MODULE_DISABLED) +#ifndef HAL_SD_MODULE_DISABLED #define HAL_SD_MODULE_ENABLED #endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_H723ZG/variant_MARLIN_STM32H723ZG.h b/buildroot/share/PlatformIO/variants/MARLIN_H723ZG/variant_MARLIN_STM32H723ZG.h index 1b518f01cf..5174ce0875 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_H723ZG/variant_MARLIN_STM32H723ZG.h +++ b/buildroot/share/PlatformIO/variants/MARLIN_H723ZG/variant_MARLIN_STM32H723ZG.h @@ -267,16 +267,16 @@ #endif // Extra HAL modules -#if !defined(HAL_DAC_MODULE_DISABLED) +#ifndef HAL_DAC_MODULE_DISABLED #define HAL_DAC_MODULE_ENABLED #endif -#if !defined(HAL_ETH_MODULE_DISABLED) +#ifndef HAL_ETH_MODULE_DISABLED #define HAL_ETH_MODULE_ENABLED #endif -#if !defined(HAL_OSPI_MODULE_DISABLED) +#ifndef HAL_OSPI_MODULE_DISABLED #define HAL_OSPI_MODULE_ENABLED #endif -#if !defined(HAL_SD_MODULE_DISABLED) +#ifndef HAL_SD_MODULE_DISABLED #define HAL_SD_MODULE_ENABLED #endif diff --git a/buildroot/share/scripts/languageExport.py b/buildroot/share/scripts/languageExport.py index 46485aa124..ca1998c18e 100755 --- a/buildroot/share/scripts/languageExport.py +++ b/buildroot/share/scripts/languageExport.py @@ -1,20 +1,22 @@ #!/usr/bin/env python3 ''' -languageExport.py +languageExport.py [--single] Export LCD language strings to CSV files for easier translation. -Use importTranslations.py to import CSV into the language files. +Use languageImport.py to import CSV into the language files. +Use --single to export all languages to a single CSV file. ''' import re from pathlib import Path +from sys import argv from languageUtil import namebyid LANGHOME = "Marlin/src/lcd/language" # Write multiple sheets if true, otherwise write one giant sheet -MULTISHEET = True +MULTISHEET = '--single' not in argv[1:] OUTDIR = 'out-csv' # Check for the path to the language files @@ -28,7 +30,7 @@ LIMIT = 0 # A dictionary to contain strings for each language. # Init with 'en' so English will always be first. -language_strings = { 'en': 0 } +language_strings = { 'en': {} } # A dictionary to contain all distinct LCD string names names = {} diff --git a/docs/ConfigEmbedding.md b/docs/ConfigEmbedding.md index 90075bc373..562661e111 100644 --- a/docs/ConfigEmbedding.md +++ b/docs/ConfigEmbedding.md @@ -3,7 +3,7 @@ Starting with version 2.0.9.3, Marlin can automatically extract the configuration used to generate the firmware and store it in the firmware binary. This is enabled by defining `CONFIGURATION_EMBEDDING` in `Configuration_adv.h`. ## How it's done -At the start of the PlatformIO build process, we create an embedded configuration by extracting all active options from the Configuration files and writing them out as JSON to `marlin_config.json`, which also includes specific build information (like the git revision, the build date, and some version information. The JSON file is then compressed in a ZIP archive called `.pio/build/mc.zip` which is converted into a C array and stored in a C++ file called `mc.h` which is included in the build. +At the start of the PlatformIO build process, we create an embedded configuration by extracting all active options from the Configuration files and writing them out as JSON to `marlin_config.json`, which also includes specific build information (like the git revision, the build date, and some version information). The JSON file is then compressed in a ZIP archive called `.pio/build/mc.zip` which is converted into a C array and stored in a C++ file called `mc.h` which is included in the build. ## Extracting configurations from a Marlin binary To get the configuration out of a binary firmware, you'll need a non-write-protected SD card inserted into the printer while running the firmware.