torque_sensor.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #include "torque_sensor.h"
  2. #include "stdlib.h"
  3. #include "string.h"
  4. #include "math_tools.h"
  5. #include "eeprom_24c02.h"
  6. #include "log_save.h"
  7. //全局变量定义
  8. TorqueOffSetData_Struct_t TorqueOffSetData;
  9. TrueOrFalse_Flag_Struct_t IsTorqueOffSetUpdateEnable = FALSE;
  10. /**************************局部函数定义*************************/
  11. /**************************全局函数定义*************************/
  12. //获取默认零点偏移值
  13. void TorqueOffSetDefaultData_Init(TorqueOffSetData_Struct_t* p_TorqueOffSetData, uint16_t AdcData)
  14. {
  15. uint8_t i;
  16. for(i=0; i<sizeof(TorqueOffSetData_Struct_t) / 2; i++)
  17. {
  18. memcpy((uint16_t*)(&p_TorqueOffSetData->Data[0] + i), (uint16_t*)&AdcData, 2);
  19. }
  20. }
  21. //零点偏移历史值处理值
  22. void TorqueOffSetData_Process(TorqueOffSetData_Struct_t* p_TorqueOffSetData, uint16_t AdcData)
  23. {
  24. int16_t DiffData, TempData;
  25. uint8_t i, ArraySize;
  26. //更新零点值,运行中动态更新
  27. p_TorqueOffSetData->PresentData = AdcData;
  28. //历史缓存大小
  29. ArraySize = sizeof(p_TorqueOffSetData->Data) / 2;
  30. //历史缓存数据平均值和当此数据差值
  31. DiffData = GetAverageData(p_TorqueOffSetData->Data, ArraySize) - AdcData;
  32. //考虑力矩传感器零偏±20%的蠕变,零偏允许变化范围为:
  33. //±0.5mV/V * 20% * 5V * 125 = ±62.5mV
  34. //对应的ADC转换结果允许变化范围为:0.1mV/V * 5V * 125 / 3300mV * 4095 = 78
  35. if((DiffData > -120) && (DiffData < 120))//本次开机零偏相对历史数据变化较小
  36. {
  37. //缓存队列移位
  38. for(i=0; i<ArraySize - 1; i++)
  39. {
  40. p_TorqueOffSetData->Data[i] = p_TorqueOffSetData->Data[i+1];
  41. }
  42. p_TorqueOffSetData->Data[ArraySize - 1] = AdcData;
  43. //获取最大值
  44. TempData = GetMaxData(p_TorqueOffSetData->Data, ArraySize);
  45. if(TempData > p_TorqueOffSetData->MaxData)
  46. {
  47. p_TorqueOffSetData->MaxData = TempData;
  48. }
  49. //获取最小值
  50. TempData = GetMinData(p_TorqueOffSetData->Data, ArraySize);
  51. if(TempData < p_TorqueOffSetData->MinData)
  52. {
  53. p_TorqueOffSetData->MinData = TempData;
  54. }
  55. //数据存储
  56. SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_TORQUE_OFFSET, sizeof(TorqueOffSetData), (uint8_t*)TorqueOffSetData.Data);
  57. }
  58. else
  59. {
  60. IsTorqueOffSetUpdateEnable = TRUE;
  61. }
  62. }
  63. //零点偏移值动态更新
  64. void TorqueOffSetData_Present_Update(uint16_t* PresentData, uint16_t AdcData, uint8_t Cal_K, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  65. {
  66. static uint16_t Array[50];
  67. static TrueOrFalse_Flag_Struct_t IsArrayFullFalg = FALSE;
  68. static uint8_t i = 0;
  69. uint16_t TempData;
  70. static uint32_t ErrorDelayTimeCnt = 0;
  71. static uint32_t JudgeDelayTimeCnt = 0;
  72. //刚开机时,数组未存满
  73. if(IsArrayFullFalg == FALSE)
  74. {
  75. Array[i++] = AdcData;
  76. if(i >= 50)
  77. {
  78. IsArrayFullFalg = TRUE;
  79. i = 0;
  80. }
  81. }
  82. //存满后取滑动均值
  83. else
  84. {
  85. TempData = MovingAverageFilter(AdcData, Array, sizeof(Array) / 2);
  86. if(TempData < *PresentData)
  87. {
  88. if((HAL_GetTick() - JudgeDelayTimeCnt) > 1000)
  89. {
  90. //更新零点值
  91. *PresentData = TempData;
  92. }
  93. }
  94. else
  95. {
  96. JudgeDelayTimeCnt = HAL_GetTick();
  97. }
  98. }
  99. //判断零点是否超出范围
  100. //零位上限计算方法:(4096 - 零位AD) / 标定系数 >= 2100,控制的有效空间是2100
  101. if(*PresentData <= (4096 - (2100 * Cal_K / 100)))
  102. {
  103. ErrorDelayTimeCnt = HAL_GetTick();
  104. }
  105. if((HAL_GetTick() - ErrorDelayTimeCnt) > 10000)
  106. {
  107. p_MC_ErrorCode->ERROR_Bit.Fault_TorqueSensor = 1;
  108. //记录故障日志
  109. MC_ErrorLogSaveInfo.NotesInfo1 = 3;
  110. MC_ErrorLogSaveInfo.NotesInfo2 = *PresentData;
  111. ErrorLogSave_Update(&MC_ErrorLogSaveInfo);
  112. IsErrorLogSaveInfoUpdateFlag = TRUE;
  113. //存储故障次数
  114. MC_RunLog1.TQS_FaultCnt++;
  115. RunLogSaveIndex = 1;
  116. }
  117. }