torque_sensor.c 7.0 KB

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