torque_sensor.c 3.2 KB

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