Skip to content

Commit

Permalink
temperature_mcu: add reference_voltage (#99)
Browse files Browse the repository at this point in the history
This allows for boards that don't run their ADC with 3.3V to output
accurate MCU temperature readings.

Signed-off-by: Peter Stehrer <peter.stehrer@cloudflight.io>
Co-authored-by: Peter Stehrer <peter.stehrer@cloudflight.io>
  • Loading branch information
dalegaard and ClfStehrer committed Nov 17, 2023
1 parent a52d731 commit 2ceaf5b
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 23 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions docs/Config_Reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
81 changes: 58 additions & 23 deletions klippy/extras/temperature_mcu.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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):
Expand All @@ -153,51 +164,75 @@ 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)

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)

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)

Expand Down

0 comments on commit 2ceaf5b

Please sign in to comment.