torque_sensor.c 6.3 KB

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