🩹 Misc temp sensor fixups (#27884)

Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
This commit is contained in:
ellensp 2025-05-28 06:01:01 +12:00 committed by GitHub
parent 843f79589c
commit 88d368ad9d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 51 additions and 43 deletions

View file

@ -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)

View file

@ -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

View file

@ -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;