NTC Thermistor Driver
API reference
Loading...
Searching...
No Matches
ntc_conversion.hpp
Go to the documentation of this file.
1
6#pragma once
7#include <cmath>
8#include <cstdint>
9
10//--------------------------------------
11// Conversion Constants
12//--------------------------------------
13
14namespace NTC::Constants {
15constexpr float ABSOLUTE_ZERO_CELSIUS_ = -273.15F;
16constexpr float KELVIN_OFFSET_ =
17 273.15F;
18constexpr float REFERENCE_TEMPERATURE_C_ =
19 25.0F;
20// Default Steinhart-Hart coefficients: the TDK NTCG163JF103FT1S, fitted
21// exactly to the nominal resistances of its spec sheet's Table 3 at -40 C
22// (188.5 kOhm), 25 C (10.00 kOhm) and 125 C (0.534 kOhm). Within 0.2 C of
23// Table 3 from -40 C to +125 C and 0.41 C at +150 C.
24constexpr float STEINHART_HART_A_ =
25 8.767633e-4F;
26constexpr float STEINHART_HART_B_ =
27 2.527899e-4F;
28constexpr float STEINHART_HART_C_ =
29 1.906681e-7F;
30
31// Validation limits
32constexpr float MIN_RESISTANCE_OHMS_ =
33 0.1F;
34constexpr float MAX_RESISTANCE_OHMS_ =
35 1000000.0F;
36constexpr float MIN_TEMPERATURE_CELSIUS_ =
37 -273.15F;
38constexpr float MAX_TEMPERATURE_CELSIUS_ =
39 1000.0F;
40constexpr float MIN_BETA_VALUE_ = 1000.0F;
41constexpr float MAX_BETA_VALUE_ = 5000.0F;
42
43// Numerical precision constants
44constexpr float EPSILON_FLOAT_ = 1e-6F;
45constexpr float EPSILON_DOUBLE_ = 1e-12F;
46constexpr float ONE_FLOAT_ = 1.0F;
47constexpr float ZERO_FLOAT_ = 0.0F;
48
49// Time conversion constants
50constexpr uint32_t MILLISECONDS_PER_SECOND_ =
51 1000U;
52
53// Temperature conversion constants
55 9.0F / 5.0F;
56constexpr float FAHRENHEIT_OFFSET_ = 32.0F;
58 5.0F / 9.0F;
59} // namespace NTC::Constants
60
61//--------------------------------------
62// Conversion Methods
63//--------------------------------------
64
65namespace NTC {
66
86bool ConvertResistanceToTemperatureBeta(float resistance_ohms,
87 float resistance_at_25c,
88 float beta_value,
89 float *temperature_celsius) noexcept;
90
99bool ConvertTemperatureToResistanceBeta(float temperature_celsius,
100 float resistance_at_25c,
101 float beta_value,
102 float *resistance_ohms) noexcept;
103
126 float resistance_ohms, float coeff_a, float coeff_b, float coeff_c,
127 float *temperature_celsius) noexcept;
128
144 float temperature_celsius, float coeff_a, float coeff_b, float coeff_c,
145 float *resistance_ohms) noexcept;
146
158bool ConvertResistanceToTemperatureDefault(float resistance_ohms,
159 float *temperature_celsius) noexcept;
160
168bool ConvertTemperatureToResistanceDefault(float temperature_celsius,
169 float *resistance_ohms) noexcept;
170
171//--------------------------------------
172// Voltage Divider Calculations
173//--------------------------------------
174
183bool CalculateThermistorResistance(float voltage_thermistor,
184 float reference_voltage,
185 float series_resistance,
186 float *resistance_ohms) noexcept;
187
196bool CalculateThermistorVoltage(float resistance_ohms, float reference_voltage,
197 float series_resistance,
198 float *voltage_thermistor) noexcept;
199
207bool CalculateVoltageDividerRatio(float resistance_ohms,
208 float series_resistance,
209 float *ratio) noexcept;
210
211//--------------------------------------
212// Validation Functions
213//--------------------------------------
214
222bool ValidateResistance(float resistance_ohms, float min_resistance,
223 float max_resistance) noexcept;
224
232bool ValidateTemperature(float temperature_celsius, float min_temperature,
233 float max_temperature) noexcept;
234
242bool ValidateVoltage(float voltage_volts, float min_voltage,
243 float max_voltage) noexcept;
244
250bool ValidateBetaValue(float beta_value) noexcept;
251
264bool ValidateSteinhartHartCoefficients(float coeff_a, float coeff_b,
265 float coeff_c) noexcept;
266
267//--------------------------------------
268// Utility Functions
269//--------------------------------------
270
280bool CalculateBetaValue(float temp1_celsius, float resistance1_ohms,
281 float temp2_celsius, float resistance2_ohms,
282 float *beta_value) noexcept;
283
303 float temp1_celsius, float resistance1_ohms, float temp2_celsius,
304 float resistance2_ohms, float temp3_celsius, float resistance3_ohms,
305 float *coeff_a, float *coeff_b, float *coeff_c) noexcept;
306
324bool CalculateTemperatureAccuracy(float resistance_ohms,
325 float resistance_at_25c, float beta_value,
326 float resistance_tolerance,
327 float beta_tolerance,
328 float *accuracy_celsius) noexcept;
329
335[[deprecated("pass R25 and B: CalculateTemperatureAccuracy(R, r25, beta, "
336 "tol_r, tol_b, &acc)")]]
337bool CalculateTemperatureAccuracy(float resistance_ohms,
338 float resistance_tolerance,
339 float beta_tolerance,
340 float *accuracy_celsius) noexcept;
341
355bool CalculateOptimalSeriesResistance(float thermistor_resistance_at_25c,
356 float beta_value, float min_temperature,
357 float max_temperature,
358 float *optimal_resistance) noexcept;
359
364[[deprecated("pass B: CalculateOptimalSeriesResistance(r25, beta, t_min, "
365 "t_max, &r)")]]
366bool CalculateOptimalSeriesResistance(float thermistor_resistance_at_25c,
367 float min_temperature,
368 float max_temperature,
369 float *optimal_resistance) noexcept;
370
371} // namespace NTC::Constants
372
373//--------------------------------------
374// Conversion Methods
375//--------------------------------------
376
377namespace NTC {
378
398bool ConvertResistanceToTemperatureBeta(float resistance_ohms,
399 float resistance_at_25c,
400 float beta_value,
401 float *temperature_celsius) noexcept;
402
411bool ConvertTemperatureToResistanceBeta(float temperature_celsius,
412 float resistance_at_25c,
413 float beta_value,
414 float *resistance_ohms) noexcept;
415
438 float resistance_ohms, float coeff_a, float coeff_b, float coeff_c,
439 float *temperature_celsius) noexcept;
440
456 float temperature_celsius, float coeff_a, float coeff_b, float coeff_c,
457 float *resistance_ohms) noexcept;
458
470bool ConvertResistanceToTemperatureDefault(float resistance_ohms,
471 float *temperature_celsius) noexcept;
472
480bool ConvertTemperatureToResistanceDefault(float temperature_celsius,
481 float *resistance_ohms) noexcept;
482
483//--------------------------------------
484// Voltage Divider Calculations
485//--------------------------------------
486
495bool CalculateThermistorResistance(float voltage_thermistor,
496 float reference_voltage,
497 float series_resistance,
498 float *resistance_ohms) noexcept;
499
508bool CalculateThermistorVoltage(float resistance_ohms, float reference_voltage,
509 float series_resistance,
510 float *voltage_thermistor) noexcept;
511
519bool CalculateVoltageDividerRatio(float resistance_ohms,
520 float series_resistance,
521 float *ratio) noexcept;
522
523//--------------------------------------
524// Validation Functions
525//--------------------------------------
526
534bool ValidateResistance(float resistance_ohms, float min_resistance,
535 float max_resistance) noexcept;
536
544bool ValidateTemperature(float temperature_celsius, float min_temperature,
545 float max_temperature) noexcept;
546
554bool ValidateVoltage(float voltage_volts, float min_voltage,
555 float max_voltage) noexcept;
556
562bool ValidateBetaValue(float beta_value) noexcept;
563
576bool ValidateSteinhartHartCoefficients(float coeff_a, float coeff_b,
577 float coeff_c) noexcept;
578
579//--------------------------------------
580// Utility Functions
581//--------------------------------------
582
592bool CalculateBetaValue(float temp1_celsius, float resistance1_ohms,
593 float temp2_celsius, float resistance2_ohms,
594 float *beta_value) noexcept;
595
615 float temp1_celsius, float resistance1_ohms, float temp2_celsius,
616 float resistance2_ohms, float temp3_celsius, float resistance3_ohms,
617 float *coeff_a, float *coeff_b, float *coeff_c) noexcept;
618
627bool CalculateTemperatureAccuracy(float resistance_ohms,
628 float resistance_tolerance,
629 float beta_tolerance,
630 float *accuracy_celsius) noexcept;
631
640bool CalculateOptimalSeriesResistance(float thermistor_resistance_at_25c,
641 float min_temperature,
642 float max_temperature,
643 float *optimal_resistance) noexcept;
644
645} // namespace NTC
Definition ntc_conversion.hpp:14
constexpr float CELSIUS_TO_FAHRENHEIT_MULTIPLIER_
Celsius to Fahrenheit multiplier.
Definition ntc_conversion.hpp:54
constexpr float MAX_BETA_VALUE_
Maximum valid beta value (K)
Definition ntc_conversion.hpp:41
constexpr float MAX_TEMPERATURE_CELSIUS_
Maximum valid temperature (°C)
Definition ntc_conversion.hpp:38
constexpr float EPSILON_DOUBLE_
Double precision epsilon.
Definition ntc_conversion.hpp:45
constexpr float MIN_TEMPERATURE_CELSIUS_
Minimum valid temperature (°C)
Definition ntc_conversion.hpp:36
constexpr float MIN_BETA_VALUE_
Minimum valid beta value (K)
Definition ntc_conversion.hpp:40
constexpr float ZERO_FLOAT_
Zero as float.
Definition ntc_conversion.hpp:47
constexpr float EPSILON_FLOAT_
Float comparison epsilon.
Definition ntc_conversion.hpp:44
constexpr float MAX_RESISTANCE_OHMS_
Maximum valid resistance (ohms)
Definition ntc_conversion.hpp:34
constexpr float ABSOLUTE_ZERO_CELSIUS_
Absolute zero in Celsius.
Definition ntc_conversion.hpp:15
constexpr float MIN_RESISTANCE_OHMS_
Minimum valid resistance (ohms)
Definition ntc_conversion.hpp:32
constexpr float FAHRENHEIT_TO_CELSIUS_MULTIPLIER_
Fahrenheit to Celsius multiplier.
Definition ntc_conversion.hpp:57
constexpr float STEINHART_HART_C_
Steinhart-Hart coefficient C (1/K)
Definition ntc_conversion.hpp:28
constexpr uint32_t MILLISECONDS_PER_SECOND_
Milliseconds per second.
Definition ntc_conversion.hpp:50
constexpr float FAHRENHEIT_OFFSET_
Fahrenheit offset.
Definition ntc_conversion.hpp:56
constexpr float REFERENCE_TEMPERATURE_C_
Reference temperature (25°C)
Definition ntc_conversion.hpp:18
constexpr float STEINHART_HART_A_
Steinhart-Hart coefficient A (1/K)
Definition ntc_conversion.hpp:24
constexpr float ONE_FLOAT_
One as float.
Definition ntc_conversion.hpp:46
constexpr float KELVIN_OFFSET_
Celsius to Kelvin conversion offset.
Definition ntc_conversion.hpp:16
constexpr float STEINHART_HART_B_
Steinhart-Hart coefficient B (1/K)
Definition ntc_conversion.hpp:26
Definition ntc_conversion.hpp:14
bool ValidateResistance(float resistance_ohms, float min_resistance, float max_resistance) noexcept
Validate resistance value.
Definition ntc_conversion.cpp:312
bool CalculateOptimalSeriesResistance(float thermistor_resistance_at_25c, float beta_value, float min_temperature, float max_temperature, float *optimal_resistance) noexcept
Calculate optimal series resistance for voltage divider.
Definition ntc_conversion.cpp:515
bool ConvertResistanceToTemperatureBeta(float resistance_ohms, float resistance_at_25c, float beta_value, float *temperature_celsius) noexcept
Convert resistance to temperature using beta parameter.
Definition ntc_conversion.cpp:27
bool CalculateTemperatureAccuracy(float resistance_ohms, float resistance_at_25c, float beta_value, float resistance_tolerance, float beta_tolerance, float *accuracy_celsius) noexcept
Worst-case temperature error from the R25 and B tolerances.
Definition ntc_conversion.cpp:465
bool CalculateBetaValue(float temp1_celsius, float resistance1_ohms, float temp2_celsius, float resistance2_ohms, float *beta_value) noexcept
Calculate beta value from two temperature-resistance pairs.
Definition ntc_conversion.cpp:356
bool CalculateThermistorResistance(float voltage_thermistor, float reference_voltage, float series_resistance, float *resistance_ohms) noexcept
Calculate thermistor resistance from voltage divider.
Definition ntc_conversion.cpp:221
bool CalculateVoltageDividerRatio(float resistance_ohms, float series_resistance, float *ratio) noexcept
Calculate voltage divider ratio.
Definition ntc_conversion.cpp:282
bool ConvertTemperatureToResistanceSteinhartHart(float temperature_celsius, float coeff_a, float coeff_b, float coeff_c, float *resistance_ohms) noexcept
Convert temperature to resistance using Steinhart-Hart equation.
Definition ntc_conversion.cpp:147
bool CalculateThermistorVoltage(float resistance_ohms, float reference_voltage, float series_resistance, float *voltage_thermistor) noexcept
Calculate voltage across thermistor from resistance.
Definition ntc_conversion.cpp:252
bool ValidateTemperature(float temperature_celsius, float min_temperature, float max_temperature) noexcept
Validate temperature value.
Definition ntc_conversion.cpp:318
bool ValidateBetaValue(float beta_value) noexcept
Validate beta value.
Definition ntc_conversion.cpp:329
bool ConvertResistanceToTemperatureDefault(float resistance_ohms, float *temperature_celsius) noexcept
Convert resistance to temperature using default Steinhart-Hart coefficients.
Definition ntc_conversion.cpp:201
bool ConvertResistanceToTemperatureSteinhartHart(float resistance_ohms, float coeff_a, float coeff_b, float coeff_c, float *temperature_celsius) noexcept
Convert resistance to temperature using Steinhart-Hart equation.
Definition ntc_conversion.cpp:113
bool ConvertTemperatureToResistanceDefault(float temperature_celsius, float *resistance_ohms) noexcept
Convert temperature to resistance using default Steinhart-Hart coefficients.
Definition ntc_conversion.cpp:209
bool ValidateVoltage(float voltage_volts, float min_voltage, float max_voltage) noexcept
Validate voltage value.
Definition ntc_conversion.cpp:324
bool ValidateSteinhartHartCoefficients(float coeff_a, float coeff_b, float coeff_c) noexcept
Validate Steinhart-Hart coefficients.
Definition ntc_conversion.cpp:335
bool CalculateSteinhartHartCoefficients(float temp1_celsius, float resistance1_ohms, float temp2_celsius, float resistance2_ohms, float temp3_celsius, float resistance3_ohms, float *coeff_a, float *coeff_b, float *coeff_c) noexcept
Calculate Steinhart-Hart coefficients from three temperature-resistance pairs.
Definition ntc_conversion.cpp:404
bool ConvertTemperatureToResistanceBeta(float temperature_celsius, float resistance_at_25c, float beta_value, float *resistance_ohms) noexcept
Convert temperature to resistance using beta parameter.
Definition ntc_conversion.cpp:70