#!/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)