cadence_sensor.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. #include "cadence_sensor.h"
  2. #include "adc.h"
  3. //局部变量定义
  4. const uint8_t ForwardDir_EncoderData[4] = {2,0,3,1};//判断正转用的编码顺序表,正转时信号为:2,0,1,3
  5. const uint8_t BackwardDir_EncoderData[4] = {1,3,0,2};//判断反转用的编码顺序表,反转时信号为:3,1,0,2
  6. //全局变量定义
  7. MC_CadenceResult_Struct_t MC_CadenceResult = {0, MC_Cadence_Stop, TRUE, 0};
  8. uint16_t MC_Cadence_Array[10] = {0};
  9. /**************************局部函数定义*************************/
  10. /**************************全局函数定义*************************/
  11. uint8_t Cadence_ReadHallState(void)
  12. {
  13. uint8_t CadenceValue;
  14. GPIO_PinState hall_a, hall_b;
  15. hall_a = HAL_GPIO_ReadPin(CADENCE_2_GPIO_Port, CADENCE_2_Pin);
  16. CadenceValue = (uint8_t)hall_a;
  17. hall_b = HAL_GPIO_ReadPin(CADENCE_1_GPIO_Port, CADENCE_1_Pin);
  18. CadenceValue |= (uint8_t)hall_b << 1;
  19. return(CadenceValue & 0x03);
  20. }
  21. //踏频传感器IO初始化
  22. void CadenceSensor_GPIO_Init(void)
  23. {
  24. GPIO_InitTypeDef GPIO_InitStruct;
  25. __HAL_RCC_GPIOA_CLK_ENABLE();
  26. __HAL_RCC_GPIOB_CLK_ENABLE();
  27. GPIO_InitStruct.Pin = CADENCE_1_Pin;
  28. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  29. GPIO_InitStruct.Pull = GPIO_PULLUP;
  30. HAL_GPIO_Init(CADENCE_1_GPIO_Port, &GPIO_InitStruct);
  31. GPIO_InitStruct.Pin = CADENCE_2_Pin;
  32. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  33. GPIO_InitStruct.Pull = GPIO_PULLUP;
  34. HAL_GPIO_Init(CADENCE_2_GPIO_Port, &GPIO_InitStruct);
  35. }
  36. #define T_FIFO_LENGTH 30
  37. uint16_t T_FIFO[T_FIFO_LENGTH]={0};
  38. uint8_t T_Index=0;
  39. uint32_t T_sum=0;
  40. uint8_t T_fifo_full_falg=0;
  41. uint16_t torque_temp=0;
  42. uint16_t torqueByCadence_180=0;
  43. uint8_t cadence_start_flag=0;
  44. //踏频传感器检测处理
  45. void CadenceSensor_Process(MC_CadenceResult_Struct_t* p_MC_CadenceResult, uint16_t StopDelayTime, uint8_t StarCount, TrueOrFalse_Flag_Struct_t UpSlopeFlag)
  46. {
  47. static MC_CadenceSensorStatus_Struct_t MC_CadenceSensorStatus;
  48. static TrueOrFalse_Flag_Struct_t IsFirstEnterFalg = TRUE;
  49. //读取霍尔信号
  50. MC_CadenceSensorStatus.HallGropuStatus = Cadence_ReadHallState();
  51. if(IsFirstEnterFalg == TRUE)
  52. {
  53. MC_CadenceSensorStatus.HallGropuStatus_Old = MC_CadenceSensorStatus.HallGropuStatus;
  54. IsFirstEnterFalg = FALSE;
  55. }
  56. //判断踏频正反转,踏频信号触发计数
  57. static uint16_t BackwordDelayCnt1 = 0;
  58. static uint16_t BackwordDelayCnt2 = 0;
  59. if(MC_CadenceSensorStatus.HallGropuStatus != MC_CadenceSensorStatus.HallGropuStatus_Old)
  60. {
  61. if(MC_CadenceSensorStatus.HallGropuStatus_Old == ForwardDir_EncoderData[MC_CadenceSensorStatus.HallGropuStatus & 0x03])//上一次的编码,与正转的编码顺序一致,则为正转
  62. {
  63. //正转
  64. p_MC_CadenceResult->Cadence_Dir = MC_Cadence_Forward;
  65. BackwordDelayCnt1 = 0;
  66. BackwordDelayCnt2 = 0;
  67. //踏频信号计数
  68. p_MC_CadenceResult->TrigCount++;
  69. }
  70. else if(MC_CadenceSensorStatus.HallGropuStatus_Old == BackwardDir_EncoderData[MC_CadenceSensorStatus.HallGropuStatus & 0x03])//反转做延时判断
  71. {
  72. //反转
  73. BackwordDelayCnt1++;
  74. if(BackwordDelayCnt1 >= 4)//检测到连续4次反向脉冲则判断为反转,约4/120*360=12度
  75. {
  76. p_MC_CadenceResult->Cadence_Dir = MC_Cadence_Backward;
  77. BackwordDelayCnt1 = 0;
  78. }
  79. }
  80. else//蹋频波形异常情况下,延时判断为反转
  81. {
  82. //反转
  83. BackwordDelayCnt2++;
  84. if(BackwordDelayCnt2 > 10)
  85. {
  86. p_MC_CadenceResult->Cadence_Dir = MC_Cadence_Backward;
  87. BackwordDelayCnt2 = 0;
  88. }
  89. }
  90. }
  91. //踏频计算及启动和停止判断
  92. static uint32_t CadenceCalTimeCnt = 0; //用于计算蹋频值
  93. static int32_t Cadence_ActiveFlt = 0;
  94. uint16_t CadenceTemp;
  95. static uint8_t CadenceStarFlagCnt = 0; //用于判断启动
  96. static uint32_t CadenceStopJudgeTimeCnt = 0; //用于判断停止
  97. uint8_t CadenceStartThresholdValue = 2; //踏频启动阈值,霍尔信号数,6度/个
  98. if((MC_CadenceSensorStatus.HallGropuStatus & 0x01) != (MC_CadenceSensorStatus.HallGropuStatus_Old & 0x01))
  99. {
  100. //踏频计算及滤波处理
  101. CadenceTemp = 1000 / (HAL_GetTick() - CadenceCalTimeCnt);//转1圈有60个信号,根据两个信号之间的时间计算踏频值rpm
  102. CadenceCalTimeCnt = HAL_GetTick();
  103. Cadence_ActiveFlt += (((int32_t)CadenceTemp << 8) - Cadence_ActiveFlt) >> 4;
  104. p_MC_CadenceResult->Cadence_Data = (uint8_t)(Cadence_ActiveFlt >> 8);
  105. /*根据踏频信号,采样最近180度内力矩平均值*/
  106. torque_temp = ADC_SensorData.TorqueSensor;
  107. if(T_fifo_full_falg != 0)
  108. {
  109. T_sum -= T_FIFO[T_Index];
  110. T_sum += torque_temp;
  111. T_FIFO[T_Index] = torque_temp;
  112. }
  113. T_Index++;
  114. if(T_Index >= T_FIFO_LENGTH)
  115. {
  116. T_Index = 0;
  117. if(T_fifo_full_falg == 0)
  118. {
  119. T_fifo_full_falg = 1;
  120. }
  121. else if(T_fifo_full_falg == 1)
  122. {
  123. T_fifo_full_falg = 2;
  124. }
  125. }
  126. if(T_fifo_full_falg == 1)
  127. {
  128. if(T_Index == 0)
  129. {
  130. torqueByCadence_180 = torque_temp;
  131. }
  132. else
  133. {
  134. torqueByCadence_180 = T_sum / T_Index;
  135. }
  136. }
  137. else if(T_fifo_full_falg == 2)
  138. {
  139. torqueByCadence_180 = T_sum / T_FIFO_LENGTH;
  140. }
  141. else
  142. {
  143. torqueByCadence_180 = torque_temp;
  144. }
  145. /*踏频信号采样*/
  146. /*踏频信号采样*/
  147. /*上坡时,启动阈值为1*/
  148. if(UpSlopeFlag == TRUE)
  149. {
  150. CadenceStartThresholdValue = 1;
  151. }
  152. else
  153. {
  154. CadenceStartThresholdValue = StarCount;
  155. }
  156. //起步判断
  157. if(p_MC_CadenceResult->Cadence_Dir == MC_Cadence_Forward)
  158. {
  159. CadenceStarFlagCnt++;
  160. if(CadenceStarFlagCnt >= CadenceStartThresholdValue)
  161. {
  162. p_MC_CadenceResult->IsStopFlag = FALSE;
  163. cadence_start_flag = 1;
  164. }
  165. }
  166. else
  167. {
  168. p_MC_CadenceResult->IsStopFlag = TRUE;
  169. cadence_start_flag = 0;
  170. }
  171. //更新停机计时数值
  172. CadenceStopJudgeTimeCnt = HAL_GetTick();
  173. }
  174. //停机判断
  175. if(p_MC_CadenceResult->Cadence_Data < (1500 / StopDelayTime))
  176. {
  177. StopDelayTime *= 3;
  178. }
  179. if((HAL_GetTick() - CadenceStopJudgeTimeCnt) > StopDelayTime)
  180. {
  181. p_MC_CadenceResult->IsStopFlag = TRUE;
  182. p_MC_CadenceResult->Cadence_Dir = MC_Cadence_Stop;
  183. p_MC_CadenceResult->Cadence_Data = 0;
  184. CadenceTemp = 0;
  185. Cadence_ActiveFlt = 0;
  186. CadenceStarFlagCnt =0;
  187. for(uint8_t i=0;i<T_FIFO_LENGTH;i++)
  188. {
  189. T_FIFO[i] = 0;
  190. }
  191. T_Index = 0;
  192. T_sum = 0;
  193. T_fifo_full_falg=0;
  194. torqueByCadence_180 = 0;
  195. cadence_start_flag = 0;
  196. }
  197. MC_CadenceSensorStatus.HallGropuStatus_Old = MC_CadenceSensorStatus.HallGropuStatus;
  198. }