zephyr/scripts/utils/ntc_thermistor_table.py

97 lines
2.6 KiB
Python
Executable File

#!/usr/bin/env python3
# Copyright (c) 2023 Google LLC
# SPDX-License-Identifier: Apache-2.0
"""
Zephyr's NTC Thermistor DTS Table generator
###########################################
This script can be used to generate an NTC thermistor DTS node with a
"zephyr,compensation-table" property. This uses the Beta Parameter Equation
https://devxplained.eu/en/blog/temperature-measurement-with-ntcs#beta-parameter-equation
Look-up the following electrical characteristics in the thermistor's data sheet:
Nominal resistance (R25) - The thermistor's resistance measured at 25C
Beta value (25/85) - This is the resistance value at 25C and at 85C
Usage::
python3 ntc_thermistor_table.py \
-r25 10000 \
-b 3974 > thermistor.dtsi
"""
import argparse
import os
import math
def c_to_k(c: float):
""" Convert Celicius to Kelvin """
return c + 273.15
def beta_equation_calc_resistance(r25, beta, temp_c):
t0_kelvin = c_to_k(25)
exp = beta * ((1 / c_to_k(temp_c)) - (1 / t0_kelvin))
resistance = r25 * math.exp(exp)
return resistance
def main(
r25: float, beta: float, interval: int, temp_init: int, temp_final: int
) -> None:
temps_range = range(temp_init, temp_final + interval - 1, interval)
print(f"/* NTC Thermistor Table Generated with {os.path.basename(__file__)} */\n")
print(
f"thermistor_R25_{int(r25)}_B_{int(beta)}: thermistor-R25-{int(r25)}-B-{int(beta)} {{"
)
table = []
for temp in temps_range:
resistance = beta_equation_calc_resistance(r25, beta, temp)
table.append(f"<({int(temp)}) {int(resistance)}>")
tbl_string = ',\n\t\t'.join(table)
print(f"\tzephyr,compensation-table = {tbl_string};")
print(f"}};")
if __name__ == "__main__":
parser = argparse.ArgumentParser("NTC Thermistor generator", allow_abbrev=False)
parser.add_argument(
"-r25", type=float, required=True, help="Nominal resistance of thermistor"
)
parser.add_argument(
"-b", "--beta", type=float, required=True, help="Beta(25/85) value"
)
parser.add_argument(
"-i",
"--interval",
type=int,
required=False,
help="Generated table interval",
default=10,
)
parser.add_argument(
"-ti",
type=int,
required=False,
help="First temperature",
default=-25,
)
parser.add_argument(
"-tf",
type=int,
required=False,
help="Final temperature",
default=125,
)
args = parser.parse_args()
main(args.r25, args.beta, args.interval, args.ti, args.tf)