ntc_temperature.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #include "ntc_temperature.h"
  2. // 热敏电阻表,单位 kΩ,温度范围 -20°C ~ 125°C,对应146个点
  3. const float ntc_r_table[] = {
  4. 470.0207, 444.1102, 419.7806, 396.9266, 375.4503, 355.2610, 336.2743, 318.4118, 301.6008, 285.7737,
  5. 270.8672, 256.8230, 243.5863, 231.1064, 219.3359, 208.2307, 197.7495, 187.8540, 178.5083, 169.6789,
  6. 161.3346, 153.4462, 145.9864, 138.9297, 132.2521, 125.9314, 119.9466, 114.2781, 108.9076, 103.8180,
  7. 98.9930, 94.4176, 90.0777, 85.9599, 82.0517, 78.3414, 74.8180, 71.4712, 68.2913, 65.2690,
  8. 62.3959, 59.6638, 57.0651, 54.5927, 52.2398, 50.0000, 47.8674, 45.8364, 43.9015, 42.0579,
  9. 40.3007, 38.6256, 37.0282, 35.5047, 34.0512, 32.6642, 31.3404, 30.0766, 28.8698, 27.7172,
  10. 26.6160, 25.5638, 24.5582, 23.5969, 22.6776, 21.7985, 20.9576, 20.1530, 19.3830, 18.6459,
  11. 17.9403, 17.2647, 16.6175, 15.9976, 15.4036, 14.8343, 14.2886, 13.7655, 13.2639, 12.7828,
  12. 12.3213, 11.8785, 11.4535, 11.0457, 10.6541, 10.2782, 9.9172, 9.5704, 9.2373, 8.9172,
  13. 8.6096, 8.3139, 8.0297, 7.7564, 7.4935, 7.2407, 6.9975, 6.7635, 6.5383, 6.3216,
  14. 6.1129, 5.9120, 5.7186, 5.5323, 5.3528, 5.1800, 5.0134, 4.8528, 4.6981, 4.5489,
  15. 4.4051, 4.2664, 4.1326, 4.0036, 3.8792, 3.7591, 3.6432, 3.5313, 3.4234, 3.3191,
  16. 3.2185, 3.1213, 3.0274, 2.9367, 2.8491, 2.7645, 2.6827, 2.6037, 2.5273, 2.4534,
  17. 2.3820, 2.3129, 2.2461, 2.1815, 2.1190, 2.0586, 2.0001, 1.9434, 1.8886, 1.8356,
  18. 1.7842, 1.7345, 1.6864, 1.6398, 1.5946, 1.5509
  19. };
  20. #define NTC_TEMP_MIN -20
  21. #define NTC_TEMP_MAX 125
  22. // 线性插值查找温度
  23. float NTC_GetTemperature(float r_ntc_kohm)
  24. {
  25. const int table_size = sizeof(ntc_r_table) / sizeof(ntc_r_table[0]);
  26. for (int i = 0; i < table_size - 1; ++i)
  27. {
  28. if (r_ntc_kohm >= ntc_r_table[i + 1] && r_ntc_kohm <= ntc_r_table[i])
  29. {
  30. float r1 = ntc_r_table[i];
  31. float r2 = ntc_r_table[i + 1];
  32. float t1 = NTC_TEMP_MIN + i;
  33. float t2 = NTC_TEMP_MIN + i + 1;
  34. // 线性插值
  35. return t1 + (r_ntc_kohm - r1) * (t2 - t1) / (r2 - r1);
  36. }
  37. }
  38. // 超出范围
  39. return -999.9f;
  40. }
  41. // 通过电压计算热敏电阻值
  42. float NTC_CalculateResistance(float v_ntc, float v_ref, float r_fixed)
  43. {
  44. if (v_ntc <= 0.0f || v_ntc >= v_ref)
  45. return -1.0f;
  46. return r_fixed * (v_ref / v_ntc - 1.0f); // 单位:kΩ
  47. }