You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.6 KiB
96 lines
2.6 KiB
#!/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)
|
|
|