From 88d368ad9ded208c7a8f10459aa2c560eed407db Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Wed, 28 May 2025 06:01:01 +1200 Subject: [PATCH] =?UTF-8?q?=F0=9F=A9=B9=20Misc=20temp=20sensor=20fixups=20?= =?UTF-8?q?(#27884)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Scott Lahteine --- Marlin/src/HAL/GD32_MFL/temp_soc.h | 2 +- Marlin/src/HAL/STM32/temp_soc.h | 2 +- Marlin/src/module/temperature.cpp | 90 ++++++++++++++++-------------- 3 files changed, 51 insertions(+), 43 deletions(-) diff --git a/Marlin/src/HAL/GD32_MFL/temp_soc.h b/Marlin/src/HAL/GD32_MFL/temp_soc.h index eeb144c422..5f1be64e43 100644 --- a/Marlin/src/HAL/GD32_MFL/temp_soc.h +++ b/Marlin/src/HAL/GD32_MFL/temp_soc.h @@ -26,4 +26,4 @@ #define TS_TYPICAL_SLOPE 4.5 // TODO: Implement voltage scaling (calibrated Vrefint) and ADC resolution scaling (when applicable) -#define TEMP_SOC_SENSOR(RAW) ((TS_TYPICAL_V - (RAW) / float(OVERSAMPLENR) / float(HAL_ADC_RANGE) * (float(ADC_VREF_MV) / 1000)) / ((TS_TYPICAL_SLOPE) / 1000) + TS_TYPICAL_TEMP) +#define TEMP_SOC_SENSOR(RAW) ((TS_TYPICAL_V - (RAW) / float(OVERSAMPLENR) / float(HAL_ADC_RANGE) * (float(ADC_VREF_MV) / 1000.0f)) / ((TS_TYPICAL_SLOPE) / 1000.0f) + TS_TYPICAL_TEMP) diff --git a/Marlin/src/HAL/STM32/temp_soc.h b/Marlin/src/HAL/STM32/temp_soc.h index 05fad695c3..cc165dd5e4 100644 --- a/Marlin/src/HAL/STM32/temp_soc.h +++ b/Marlin/src/HAL/STM32/temp_soc.h @@ -341,6 +341,6 @@ #elif defined(TS_TYPICAL_V) && defined(TS_TYPICAL_SLOPE) && defined(TS_TYPICAL_TEMP) - #define TEMP_SOC_SENSOR(RAW) ((TS_TYPICAL_V - (RAW) / float(OVERSAMPLENR) / float(HAL_ADC_RANGE) * (float(ADC_VREF_MV) / 1000.0f)) / ((TS_TYPICAL_SLOPE) / 1000) + TS_TYPICAL_TEMP) + #define TEMP_SOC_SENSOR(RAW) ((TS_TYPICAL_V - (RAW) / float(OVERSAMPLENR) / float(HAL_ADC_RANGE) * (float(ADC_VREF_MV) / 1000.0f)) / ((TS_TYPICAL_SLOPE) / 1000.0f) + TS_TYPICAL_TEMP) #endif diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 5c760a7689..c1684a9fe1 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -2460,11 +2460,6 @@ void Temperature::task() { UNUSED(ms); } -// For a 5V input the AD595 returns a value scaled with 10mV per °C. (Minimum input voltage is 5V.) -#define TEMP_AD595(RAW) ((RAW) * (ADC_VREF_MV / 10) / float(HAL_ADC_RANGE) / (OVERSAMPLENR) * (TEMP_SENSOR_AD595_GAIN) + TEMP_SENSOR_AD595_OFFSET) -// For a 5V input the AD8495 returns a value scaled with 5mV per °C. (Minimum input voltage is 2.7V.) -#define TEMP_AD8495(RAW) ((RAW) * (ADC_VREF_MV / 5) / float(HAL_ADC_RANGE) / (OVERSAMPLENR) * (TEMP_SENSOR_AD8495_GAIN) + TEMP_SENSOR_AD8495_OFFSET) - /** * Bisect search for the range of the 'raw' value, then interpolate * proportionally between the under and over values. @@ -2604,6 +2599,22 @@ void Temperature::task() { } #endif +#if ANY_THERMISTOR_IS(-1) + // For a 5V input the AD595 returns a value scaled with 10mV per °C. (Minimum input voltage is 5V.) + static constexpr celsius_float_t temp_ad595(const raw_adc_t raw) { + return raw * (float(ADC_VREF_MV) / 10.0f) / float(HAL_ADC_RANGE) / (OVERSAMPLENR) + * (TEMP_SENSOR_AD595_GAIN) + (TEMP_SENSOR_AD595_OFFSET); + } +#endif + +#if ANY_THERMISTOR_IS(-4) + // For a 5V input the AD8495 returns a value scaled with 5mV per °C. (Minimum input voltage is 2.7V.) + static constexpr celsius_float_t temp_ad8495(const raw_adc_t raw) { + return raw * (float(ADC_VREF_MV) / 5.0f) / float(HAL_ADC_RANGE) / (OVERSAMPLENR) + * (TEMP_SENSOR_AD8495_GAIN) + (TEMP_SENSOR_AD8495_OFFSET); + } +#endif + #if HAS_HOTEND // Derived from RepRap FiveD extruder::getTemperature() // For hot end temperature measurement. @@ -2630,9 +2641,9 @@ void Temperature::task() { return (int16_t)raw * 0.25f; #endif #elif TEMP_SENSOR_0_IS_AD595 - return TEMP_AD595(raw); + return temp_ad595(raw); #elif TEMP_SENSOR_0_IS_AD8495 - return TEMP_AD8495(raw); + return temp_ad8495(raw); #else break; #endif @@ -2649,9 +2660,9 @@ void Temperature::task() { return (int16_t)raw * 0.25f; #endif #elif TEMP_SENSOR_1_IS_AD595 - return TEMP_AD595(raw); + return temp_ad595(raw); #elif TEMP_SENSOR_1_IS_AD8495 - return TEMP_AD8495(raw); + return temp_ad8495(raw); #else break; #endif @@ -2668,9 +2679,9 @@ void Temperature::task() { return (int16_t)raw * 0.25f; #endif #elif TEMP_SENSOR_2_IS_AD595 - return TEMP_AD595(raw); + return temp_ad595(raw); #elif TEMP_SENSOR_2_IS_AD8495 - return TEMP_AD8495(raw); + return temp_ad8495(raw); #else break; #endif @@ -2678,9 +2689,9 @@ void Temperature::task() { #if TEMP_SENSOR_3_IS_CUSTOM return user_thermistor_to_deg_c(CTI_HOTEND_3, raw); #elif TEMP_SENSOR_3_IS_AD595 - return TEMP_AD595(raw); + return temp_ad595(raw); #elif TEMP_SENSOR_3_IS_AD8495 - return TEMP_AD8495(raw); + return temp_ad8495(raw); #else break; #endif @@ -2688,9 +2699,9 @@ void Temperature::task() { #if TEMP_SENSOR_4_IS_CUSTOM return user_thermistor_to_deg_c(CTI_HOTEND_4, raw); #elif TEMP_SENSOR_4_IS_AD595 - return TEMP_AD595(raw); + return temp_ad595(raw); #elif TEMP_SENSOR_4_IS_AD8495 - return TEMP_AD8495(raw); + return temp_ad8495(raw); #else break; #endif @@ -2698,9 +2709,9 @@ void Temperature::task() { #if TEMP_SENSOR_5_IS_CUSTOM return user_thermistor_to_deg_c(CTI_HOTEND_5, raw); #elif TEMP_SENSOR_5_IS_AD595 - return TEMP_AD595(raw); + return temp_ad595(raw); #elif TEMP_SENSOR_5_IS_AD8495 - return TEMP_AD8495(raw); + return temp_ad8495(raw); #else break; #endif @@ -2708,9 +2719,9 @@ void Temperature::task() { #if TEMP_SENSOR_6_IS_CUSTOM return user_thermistor_to_deg_c(CTI_HOTEND_6, raw); #elif TEMP_SENSOR_6_IS_AD595 - return TEMP_AD595(raw); + return temp_ad595(raw); #elif TEMP_SENSOR_6_IS_AD8495 - return TEMP_AD8495(raw); + return temp_ad8495(raw); #else break; #endif @@ -2718,9 +2729,9 @@ void Temperature::task() { #if TEMP_SENSOR_7_IS_CUSTOM return user_thermistor_to_deg_c(CTI_HOTEND_7, raw); #elif TEMP_SENSOR_7_IS_AD595 - return TEMP_AD595(raw); + return temp_ad595(raw); #elif TEMP_SENSOR_7_IS_AD8495 - return TEMP_AD8495(raw); + return temp_ad8495(raw); #else break; #endif @@ -2754,9 +2765,9 @@ void Temperature::task() { #elif TEMP_SENSOR_BED_IS_THERMISTOR SCAN_THERMISTOR_TABLE(TEMPTABLE_BED, TEMPTABLE_BED_LEN); #elif TEMP_SENSOR_BED_IS_AD595 - return TEMP_AD595(raw); + return temp_ad595(raw); #elif TEMP_SENSOR_BED_IS_AD8495 - return TEMP_AD8495(raw); + return temp_ad8495(raw); #else UNUSED(raw); return 0; @@ -2772,9 +2783,9 @@ void Temperature::task() { #elif TEMP_SENSOR_CHAMBER_IS_THERMISTOR SCAN_THERMISTOR_TABLE(TEMPTABLE_CHAMBER, TEMPTABLE_CHAMBER_LEN); #elif TEMP_SENSOR_CHAMBER_IS_AD595 - return TEMP_AD595(raw); + return temp_ad595(raw); #elif TEMP_SENSOR_CHAMBER_IS_AD8495 - return TEMP_AD8495(raw); + return temp_ad8495(raw); #else UNUSED(raw); return 0; @@ -2790,9 +2801,9 @@ void Temperature::task() { #elif TEMP_SENSOR_COOLER_IS_THERMISTOR SCAN_THERMISTOR_TABLE(TEMPTABLE_COOLER, TEMPTABLE_COOLER_LEN); #elif TEMP_SENSOR_COOLER_IS_AD595 - return TEMP_AD595(raw); + return temp_ad595(raw); #elif TEMP_SENSOR_COOLER_IS_AD8495 - return TEMP_AD8495(raw); + return temp_ad8495(raw); #else UNUSED(raw); return 0; @@ -2808,9 +2819,9 @@ void Temperature::task() { #elif TEMP_SENSOR_PROBE_IS_THERMISTOR SCAN_THERMISTOR_TABLE(TEMPTABLE_PROBE, TEMPTABLE_PROBE_LEN); #elif TEMP_SENSOR_PROBE_IS_AD595 - return TEMP_AD595(raw); + return temp_ad595(raw); #elif TEMP_SENSOR_PROBE_IS_AD8495 - return TEMP_AD8495(raw); + return temp_ad8495(raw); #else UNUSED(raw); return 0; @@ -2826,9 +2837,9 @@ void Temperature::task() { #elif TEMP_SENSOR_BOARD_IS_THERMISTOR SCAN_THERMISTOR_TABLE(TEMPTABLE_BOARD, TEMPTABLE_BOARD_LEN); #elif TEMP_SENSOR_BOARD_IS_AD595 - return TEMP_AD595(raw); + return temp_ad595(raw); #elif TEMP_SENSOR_BOARD_IS_AD8495 - return TEMP_AD8495(raw); + return temp_ad8495(raw); #else UNUSED(raw); return 0; @@ -2839,14 +2850,11 @@ void Temperature::task() { #if HAS_TEMP_SOC // For SoC temperature measurement. celsius_float_t Temperature::analog_to_celsius_soc(const raw_adc_t raw) { - return ( - #ifdef TEMP_SOC_SENSOR - TEMP_SOC_SENSOR(raw) - #else - 0 - #error "TEMP_SENSOR_SOC requires the TEMP_SOC_SENSOR(RAW) macro to be defined for your board." - #endif - ); + #ifndef TEMP_SOC_SENSOR + #error "TEMP_SENSOR_SOC requires the TEMP_SOC_SENSOR(RAW) macro to be defined for your board." + #define TEMP_SOC_SENSOR(...) 0 + #endif + return TEMP_SOC_SENSOR(raw); } #endif @@ -2864,9 +2872,9 @@ void Temperature::task() { #elif TEMP_SENSOR_REDUNDANT_IS_THERMISTOR SCAN_THERMISTOR_TABLE(TEMPTABLE_REDUNDANT, TEMPTABLE_REDUNDANT_LEN); #elif TEMP_SENSOR_REDUNDANT_IS_AD595 - return TEMP_AD595(raw); + return temp_ad595(raw); #elif TEMP_SENSOR_REDUNDANT_IS_AD8495 - return TEMP_AD8495(raw); + return temp_ad8495(raw); #else UNUSED(raw); return 0;