From 130e39a5bfeac78626bf5ffc46d3d52556ec8597 Mon Sep 17 00:00:00 2001 From: Peter Stehrer Date: Fri, 29 Jul 2022 13:36:37 +0200 Subject: [PATCH] temperature_mcu: add reference_voltage This allows for boards that don't run their ADC with 3.3V to output accurate MCU temperature readings. Signed-off-by: Peter Stehrer --- README.md | 2 + docs/Config_Reference.md | 2 + klippy/extras/temperature_mcu.py | 81 +++++++++++++++++++++++--------- 3 files changed, 62 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index c7a98af2a..4be4b815a 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,8 @@ Features merged into the master branch: - [danger_options: expose the multi mcu homing timeout as a parameter](https://github.com/DangerKlippers/danger-klipper/pull/93) +- [temperature_mcu: add reference_voltage](https://github.com/DangerKlippers/danger-klipper/pull/99) ([klipper#5713](https://github.com/Klipper3d/klipper/pull/5713)) + If you're feeling adventurous, take a peek at the extra features in the bleeding-edge branch: - [dmbutyugin's advanced-features branch](https://github.com/DangerKlippers/danger-klipper/pull/69) [dmbutyugin/advanced-features](https://github.com/dmbutyugin/klipper/commits/advanced-features) diff --git a/docs/Config_Reference.md b/docs/Config_Reference.md index e3d4503f6..5f81f9ca8 100644 --- a/docs/Config_Reference.md +++ b/docs/Config_Reference.md @@ -2814,6 +2814,8 @@ monitor these temperatures. sensor_type: temperature_mcu #sensor_mcu: mcu # The micro-controller to read from. The default is "mcu". +#reference_voltage: +# The reference voltage for the ADC of the mcu. Default is 3.3 #sensor_temperature1: #sensor_adc1: # Specify the above two parameters (a temperature in Celsius and an diff --git a/klippy/extras/temperature_mcu.py b/klippy/extras/temperature_mcu.py index 9a5397929..349c248e4 100644 --- a/klippy/extras/temperature_mcu.py +++ b/klippy/extras/temperature_mcu.py @@ -20,6 +20,9 @@ def __init__(self, config): self.debug_read_cmd = None # Read config mcu_name = config.get("sensor_mcu", "mcu") + self.reference_voltage = config.getfloat( + "reference_voltage", default=3.3 + ) self.temp1 = config.getfloat("sensor_temperature1", None) if self.temp1 is not None: self.adc1 = config.getfloat("sensor_adc1", minval=0.0, maxval=1.0) @@ -126,20 +129,28 @@ def config_unknown(self): ) def config_rp2040(self): - self.slope = 3.3 / -0.001721 - self.base_temperature = self.calc_base(27.0, 0.706 / 3.3) + self.slope = self.reference_voltage / -0.001721 + self.base_temperature = self.calc_base( + 27.0, 0.706 / self.reference_voltage + ) def config_sam3(self): - self.slope = 3.3 / 0.002650 - self.base_temperature = self.calc_base(27.0, 0.8 / 3.3) + self.slope = self.reference_voltage / 0.002650 + self.base_temperature = self.calc_base( + 27.0, 0.8 / self.reference_voltage + ) def config_sam4(self): - self.slope = 3.3 / 0.004700 - self.base_temperature = self.calc_base(27.0, 1.44 / 3.3) + self.slope = self.reference_voltage / 0.004700 + self.base_temperature = self.calc_base( + 27.0, 1.44 / self.reference_voltage + ) def config_same70(self): - self.slope = 3.3 / 0.002330 - self.base_temperature = self.calc_base(25.0, 0.72 / 3.3) + self.slope = self.reference_voltage / 0.002330 + self.base_temperature = self.calc_base( + 25.0, 0.72 / self.reference_voltage + ) def config_samd21(self, addr=0x00806030): def get1v(val): @@ -153,8 +164,12 @@ def get1v(val): hot_temp = ((cal1 >> 12) & 0xFF) + ((cal1 >> 20) & 0xF) / 10.0 room_1v = get1v((cal1 >> 24) & 0xFF) hot_1v = get1v((cal2 >> 0) & 0xFF) - room_adc = ((cal2 >> 8) & 0xFFF) * room_1v / (3.3 * 4095.0) - hot_adc = ((cal2 >> 20) & 0xFFF) * hot_1v / (3.3 * 4095.0) + room_adc = ( + ((cal2 >> 8) & 0xFFF) * room_1v / (self.reference_voltage * 4095.0) + ) + hot_adc = ( + ((cal2 >> 20) & 0xFFF) * hot_1v / (self.reference_voltage * 4095.0) + ) self.slope = (hot_temp - room_temp) / (hot_adc - room_adc) self.base_temperature = self.calc_base(room_temp, room_adc) @@ -162,16 +177,24 @@ def config_samd51(self): self.config_samd21(addr=0x00800100) def config_stm32f1(self): - self.slope = 3.3 / -0.004300 - self.base_temperature = self.calc_base(25.0, 1.43 / 3.3) + self.slope = self.reference_voltage / -0.004300 + self.base_temperature = self.calc_base( + 25.0, 1.43 / self.reference_voltage + ) def config_stm32f2(self): - self.slope = 3.3 / 0.002500 - self.base_temperature = self.calc_base(25.0, 0.76 / 3.3) + self.slope = self.reference_voltage / 0.002500 + self.base_temperature = self.calc_base( + 25.0, 0.76 / self.reference_voltage + ) def config_stm32f4(self, addr1=0x1FFF7A2C, addr2=0x1FFF7A2E): - cal_adc_30 = self.read16(addr1) / 4095.0 - cal_adc_110 = self.read16(addr2) / 4095.0 + cal_adc_30 = ( + self.read16(addr1) * 3.3 / (self.reference_voltage * 4095.0) + ) + cal_adc_110 = ( + self.read16(addr2) * 3.3 / (self.reference_voltage * 4095.0) + ) self.slope = (110.0 - 30.0) / (cal_adc_110 - cal_adc_30) self.base_temperature = self.calc_base(30.0, cal_adc_30) @@ -179,25 +202,37 @@ def config_stm32f0x2(self): self.config_stm32f4(addr1=0x1FFFF7B8, addr2=0x1FFFF7C2) def config_stm32f070(self): - self.slope = 3.3 / -0.004300 + self.slope = self.reference_voltage / -0.004300 cal_adc_30 = self.read16(0x1FFFF7B8) / 4095.0 self.base_temperature = self.calc_base(30.0, cal_adc_30) def config_stm32g0(self): - cal_adc_30 = self.read16(0x1FFF75A8) * 3.0 / (3.3 * 4095.0) - cal_adc_130 = self.read16(0x1FFF75CA) * 3.0 / (3.3 * 4095.0) + cal_adc_30 = ( + self.read16(0x1FFF75A8) * 3.0 / (self.reference_voltage * 4095.0) + ) + cal_adc_130 = ( + self.read16(0x1FFF75CA) * 3.0 / (self.reference_voltage * 4095.0) + ) self.slope = (130.0 - 30.0) / (cal_adc_130 - cal_adc_30) self.base_temperature = self.calc_base(30.0, cal_adc_30) def config_stm32h723(self): - cal_adc_30 = self.read16(0x1FF1E820) / 4095.0 - cal_adc_130 = self.read16(0x1FF1E840) / 4095.0 + cal_adc_30 = ( + self.read16(0x1FF1E820) * 3.3 / (self.reference_voltage * 4095.0) + ) + cal_adc_130 = ( + self.read16(0x1FF1E840) * 3.3 / (self.reference_voltage * 4095.0) + ) self.slope = (130.0 - 30.0) / (cal_adc_130 - cal_adc_30) self.base_temperature = self.calc_base(30.0, cal_adc_30) def config_stm32h7(self): - cal_adc_30 = self.read16(0x1FF1E820) / 65535.0 - cal_adc_110 = self.read16(0x1FF1E840) / 65535.0 + cal_adc_30 = ( + self.read16(0x1FF1E820) * 3.3 / (self.reference_voltage * 65535.0) + ) + cal_adc_110 = ( + self.read16(0x1FF1E840) * 3.3 / (self.reference_voltage * 65535.0) + ) self.slope = (110.0 - 30.0) / (cal_adc_110 - cal_adc_30) self.base_temperature = self.calc_base(30.0, cal_adc_30)