torque_sensor.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  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. TorqueSensor_Param_Struct_t TorqueSensor_1_Param;//传感器1参数
  9. TorqueSensor_Param_Struct_t TorqueSensor_2_Param;//传感器2参数
  10. TorqueSensor_Param_Struct_t TorqueSensor_3_Param;//传感器3参数
  11. uint16_t TorqueStartData = TORQUE_SENSOR_STARTDATA;//启动值
  12. TrueOrFalse_Flag_Struct_t IsTorqueOffSetUpdateEnable = FALSE;//运行中零点值动态更新标志
  13. /**************************局部函数定义*************************/
  14. /**************************全局函数定义*************************/
  15. //力矩传感器参数设为默认值
  16. void TorqueSensor_ParamSetDefaultData_Init(TorqueSensor_Param_Struct_t* p_TorqueSensor_Param, uint16_t AdcData)
  17. {
  18. uint8_t i;
  19. //校正系数设为1
  20. p_TorqueSensor_Param->Torque_Cal_K = 100;
  21. //零点初始值
  22. for(i=0; i<sizeof(TorqueOffSetData_Struct_t) / 2; i++)
  23. {
  24. memcpy((uint16_t*)(&p_TorqueSensor_Param->Torque_OffSetData.Data[0] + i), (uint16_t*)&AdcData, 2);
  25. }
  26. }
  27. //零点偏移历史值处理值
  28. void TorqueOffSetData_Process(TorqueOffSetData_Struct_t* p_TorqueOffSetData, uint16_t AdcData)
  29. {
  30. int16_t DiffData, TempData;
  31. uint8_t i, ArraySize;
  32. //更新零点值,运行中动态更新
  33. p_TorqueOffSetData->PresentData = AdcData;
  34. //历史缓存大小
  35. ArraySize = sizeof(p_TorqueOffSetData->Data) / 2;
  36. //历史缓存数据平均值和当此数据差值
  37. DiffData = GetAverageData(p_TorqueOffSetData->Data, ArraySize) - AdcData;
  38. //考虑力矩传感器零偏±20%的蠕变,零偏允许变化范围为:
  39. //±0.5mV/V * 20% * 5V * 125 = ±62.5mV
  40. //对应的ADC转换结果允许变化范围为:0.1mV/V * 5V * 125 / 3300mV * 4095 = 78
  41. if((DiffData > -120) && (DiffData < 120))//本次开机零偏相对历史数据变化较小
  42. {
  43. //缓存队列移位
  44. for(i=0; i<ArraySize - 1; i++)
  45. {
  46. p_TorqueOffSetData->Data[i] = p_TorqueOffSetData->Data[i+1];
  47. }
  48. p_TorqueOffSetData->Data[ArraySize - 1] = AdcData;
  49. //获取最大值
  50. TempData = GetMaxData(p_TorqueOffSetData->Data, ArraySize);
  51. if(TempData > p_TorqueOffSetData->MaxData)
  52. {
  53. p_TorqueOffSetData->MaxData = TempData;
  54. }
  55. //获取最小值
  56. TempData = GetMinData(p_TorqueOffSetData->Data, ArraySize);
  57. if(TempData < p_TorqueOffSetData->MinData)
  58. {
  59. p_TorqueOffSetData->MinData = TempData;
  60. }
  61. //数据存储,根据参数确定存储地址
  62. if(p_TorqueOffSetData == &TorqueSensor_1_Param.Torque_OffSetData)
  63. {
  64. SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_TORQUE_OFFSET_1, sizeof(TorqueOffSetData_Struct_t), (uint8_t*)p_TorqueOffSetData->Data);
  65. }
  66. else if(p_TorqueOffSetData == &TorqueSensor_2_Param.Torque_OffSetData)
  67. {
  68. SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_TORQUE_OFFSET_2, sizeof(TorqueOffSetData_Struct_t), (uint8_t*)p_TorqueOffSetData->Data);
  69. }
  70. else if(p_TorqueOffSetData == &TorqueSensor_3_Param.Torque_OffSetData)
  71. {
  72. SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_TORQUE_OFFSET_3, sizeof(TorqueOffSetData_Struct_t), (uint8_t*)p_TorqueOffSetData->Data);
  73. }
  74. }
  75. else
  76. {
  77. IsTorqueOffSetUpdateEnable = TRUE;
  78. }
  79. }
  80. //零点偏移值动态更新
  81. void TorqueOffSetData_Present_Update1(uint16_t* PresentData, uint16_t AdcData, uint8_t Cal_K, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  82. {
  83. static uint16_t Array[50];
  84. static TrueOrFalse_Flag_Struct_t IsArrayFullFalg = FALSE;
  85. static uint8_t i = 0;
  86. uint16_t TempData;
  87. static uint32_t ErrorDelayTimeCnt = 0;
  88. static uint32_t JudgeDelayTimeCnt = 0;
  89. //刚开机时,数组未存满
  90. if(IsArrayFullFalg == FALSE)
  91. {
  92. Array[i++] = AdcData;
  93. if(i >= 50)
  94. {
  95. IsArrayFullFalg = TRUE;
  96. i = 0;
  97. }
  98. }
  99. //存满后取滑动均值
  100. else
  101. {
  102. TempData = MovingAverageFilter(AdcData, Array, sizeof(Array) / 2);
  103. if(TempData < *PresentData)
  104. {
  105. if((HAL_GetTick() - JudgeDelayTimeCnt) > 1000)
  106. {
  107. //更新零点值
  108. *PresentData = TempData;
  109. }
  110. }
  111. else
  112. {
  113. JudgeDelayTimeCnt = HAL_GetTick();
  114. }
  115. }
  116. //判断零点是否超出范围
  117. //零位上限计算方法:(4096 - 零位AD) / 标定系数 >= 2100,控制的有效空间是2100
  118. if(*PresentData <= (4096 - (2100 * Cal_K / 100)))
  119. {
  120. ErrorDelayTimeCnt = HAL_GetTick();
  121. }
  122. if((HAL_GetTick() - ErrorDelayTimeCnt) > 10000)
  123. {
  124. p_MC_ErrorCode->ERROR_Bit.Fault_TorqueSensor = 1;
  125. //记录故障日志
  126. MC_ErrorLogSaveInfo.NotesInfo1 = 3;
  127. MC_ErrorLogSaveInfo.NotesInfo2 = *PresentData;
  128. RunLogSave_Update(&MC_ErrorLogSaveInfo);
  129. IsErrorLogSaveInfoUpdateFlag = TRUE;
  130. //存储故障次数
  131. MC_RunLog1.TQS_FaultCnt++;
  132. SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
  133. }
  134. }
  135. //零点偏移值动态更新
  136. void TorqueOffSetData_Present_Update2(uint16_t* PresentData, uint16_t AdcData, uint8_t Cal_K, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  137. {
  138. static uint16_t Array[50];
  139. static TrueOrFalse_Flag_Struct_t IsArrayFullFalg = FALSE;
  140. static uint8_t i = 0;
  141. uint16_t TempData;
  142. static uint32_t ErrorDelayTimeCnt = 0;
  143. static uint32_t JudgeDelayTimeCnt = 0;
  144. //刚开机时,数组未存满
  145. if(IsArrayFullFalg == FALSE)
  146. {
  147. Array[i++] = AdcData;
  148. if(i >= 50)
  149. {
  150. IsArrayFullFalg = TRUE;
  151. i = 0;
  152. }
  153. }
  154. //存满后取滑动均值
  155. else
  156. {
  157. TempData = MovingAverageFilter(AdcData, Array, sizeof(Array) / 2);
  158. if(TempData < *PresentData)
  159. {
  160. if((HAL_GetTick() - JudgeDelayTimeCnt) > 1000)
  161. {
  162. //更新零点值
  163. *PresentData = TempData;
  164. }
  165. }
  166. else
  167. {
  168. JudgeDelayTimeCnt = HAL_GetTick();
  169. }
  170. }
  171. //判断零点是否超出范围
  172. //零位上限计算方法:(4096 - 零位AD) / 标定系数 >= 2100,控制的有效空间是2100
  173. if(*PresentData <= (4096 - (2100 * Cal_K / 100)))
  174. {
  175. ErrorDelayTimeCnt = HAL_GetTick();
  176. }
  177. if((HAL_GetTick() - ErrorDelayTimeCnt) > 10000)
  178. {
  179. p_MC_ErrorCode->ERROR_Bit.Fault_TorqueSensor = 1;
  180. //记录故障日志
  181. MC_ErrorLogSaveInfo.NotesInfo1 = 3;
  182. MC_ErrorLogSaveInfo.NotesInfo2 = *PresentData;
  183. RunLogSave_Update(&MC_ErrorLogSaveInfo);
  184. IsErrorLogSaveInfoUpdateFlag = TRUE;
  185. //存储故障次数
  186. MC_RunLog1.TQS_FaultCnt++;
  187. SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
  188. }
  189. }
  190. //零点偏移值动态更新
  191. void TorqueOffSetData_Present_Update3(uint16_t* PresentData, uint16_t AdcData, uint8_t Cal_K, MC_ErrorCode_Struct_t* p_MC_ErrorCode)
  192. {
  193. static uint16_t Array[50];
  194. static TrueOrFalse_Flag_Struct_t IsArrayFullFalg = FALSE;
  195. static uint8_t i = 0;
  196. uint16_t TempData;
  197. static uint32_t ErrorDelayTimeCnt = 0;
  198. static uint32_t JudgeDelayTimeCnt = 0;
  199. //刚开机时,数组未存满
  200. if(IsArrayFullFalg == FALSE)
  201. {
  202. Array[i++] = AdcData;
  203. if(i >= 50)
  204. {
  205. IsArrayFullFalg = TRUE;
  206. i = 0;
  207. }
  208. }
  209. //存满后取滑动均值
  210. else
  211. {
  212. TempData = MovingAverageFilter(AdcData, Array, sizeof(Array) / 2);
  213. if(TempData < *PresentData)
  214. {
  215. if((HAL_GetTick() - JudgeDelayTimeCnt) > 1000)
  216. {
  217. //更新零点值
  218. *PresentData = TempData;
  219. }
  220. }
  221. else
  222. {
  223. JudgeDelayTimeCnt = HAL_GetTick();
  224. }
  225. }
  226. //判断零点是否超出范围
  227. //零位上限计算方法:(4096 - 零位AD) / 标定系数 >= 2100,控制的有效空间是2100
  228. if(*PresentData <= (4096 - (2100 * Cal_K / 100)))
  229. {
  230. ErrorDelayTimeCnt = HAL_GetTick();
  231. }
  232. if((HAL_GetTick() - ErrorDelayTimeCnt) > 10000)
  233. {
  234. p_MC_ErrorCode->ERROR_Bit.Fault_TorqueSensor = 1;
  235. //记录故障日志
  236. MC_ErrorLogSaveInfo.NotesInfo1 = 3;
  237. MC_ErrorLogSaveInfo.NotesInfo2 = *PresentData;
  238. RunLogSave_Update(&MC_ErrorLogSaveInfo);
  239. IsErrorLogSaveInfoUpdateFlag = TRUE;
  240. //存储故障次数
  241. MC_RunLog1.TQS_FaultCnt++;
  242. SaveParamToEEprom_24C02(&I2C_Handle_EEPROM, EEPROM_24C02_ADDR_RUN_LOG1, sizeof(MC_RunLog1_Struct_t), (uint8_t*)&MC_RunLog1.PowerOnCnt);
  243. }
  244. }