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