calibration.c 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /**
  2. * calibration.c - 电容值到油水比例的标定模块
  3. *
  4. * 支持:
  5. * - 添加/读取标定点
  6. * - 分段线性插值计算 (float cap -> float ratio)
  7. *
  8. */
  9. #include "calibration.h"
  10. #include <string.h>
  11. #include <stdio.h>
  12. CalibrationTable g_calibrationTable;
  13. // 初始化标定表
  14. void Calibration_Init(void)
  15. {
  16. memset(&g_calibrationTable, 0, sizeof(g_calibrationTable));
  17. // Calibration_LoadFromFlash();
  18. }
  19. // 添加或更新一个标定点
  20. bool Calibration_SetPoint(uint8_t index, float cap, float ratio)
  21. {
  22. if (index >= CALIBRATION_POINTS_MAX)
  23. return false;
  24. g_calibrationTable.points[index].cap_value = cap;
  25. g_calibrationTable.points[index].oil_water_ratio = ratio;
  26. // 更新有效点数量
  27. if (index >= g_calibrationTable.count)
  28. g_calibrationTable.count = index + 1;
  29. return true;
  30. }
  31. // 获取某个标定点
  32. bool Calibration_GetPoint(uint8_t index, float *cap, float *ratio)
  33. {
  34. if (index >= g_calibrationTable.count)
  35. return false;
  36. *cap = g_calibrationTable.points[index].cap_value;
  37. *ratio = g_calibrationTable.points[index].oil_water_ratio;
  38. return true;
  39. }
  40. // 插值转换:cap -> ratio(返回值带小数点后1位)
  41. float Calibration_ComputeRatio(float cap)
  42. {
  43. if (g_calibrationTable.count < 2)
  44. return 0.0f;
  45. for (int i = 0; i < g_calibrationTable.count - 1; i++)
  46. {
  47. CalibrationPoint p1 = g_calibrationTable.points[i];
  48. CalibrationPoint p2 = g_calibrationTable.points[i + 1];
  49. if (cap >= p1.cap_value && cap <= p2.cap_value)
  50. {
  51. float ratio = p1.oil_water_ratio +
  52. (cap - p1.cap_value) * (p2.oil_water_ratio - p1.oil_water_ratio) /
  53. (p2.cap_value - p1.cap_value);
  54. if (ratio < 0.0f) ratio = 0.0f;
  55. if (ratio > 100.0f) ratio = 100.0f;
  56. return ((int)(ratio * 10 + 0.5f)) / 10.0f; // 保留1位小数
  57. }
  58. }
  59. // 超出边界处理
  60. if (cap < g_calibrationTable.points[0].cap_value)
  61. return g_calibrationTable.points[0].oil_water_ratio;
  62. return g_calibrationTable.points[g_calibrationTable.count - 1].oil_water_ratio;
  63. }