cadence_sensor.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. #include "cadence_sensor.h"
  2. //局部变量定义
  3. const uint8_t ForwardDir_EncoderData[4] = {2,0,3,1};//判断正转用的编码顺序表,正转时信号为:2,0,1,3
  4. const uint8_t BackwardDir_EncoderData[4] = {1,3,0,2};//判断反转用的编码顺序表,反转时信号为:3,1,0,2
  5. //全局变量定义
  6. MC_CadenceResult_Struct_t MC_CadenceResult = {0, MC_Cadence_Stop, TRUE, 0};
  7. uint16_t MC_Cadence_Array[10] = {0};
  8. /**************************局部函数定义*************************/
  9. /**************************全局函数定义*************************/
  10. uint8_t Cadence_ReadHallState(void)
  11. {
  12. uint8_t CadenceValue;
  13. GPIO_PinState hall_a, hall_b;
  14. hall_a = HAL_GPIO_ReadPin(CADENCE_2_GPIO_Port, CADENCE_2_Pin);
  15. CadenceValue = (uint8_t)hall_a;
  16. hall_b = HAL_GPIO_ReadPin(CADENCE_1_GPIO_Port, CADENCE_1_Pin);
  17. CadenceValue |= (uint8_t)hall_b << 1;
  18. return(CadenceValue & 0x03);
  19. }
  20. //踏频传感器IO初始化
  21. void CadenceSensor_GPIO_Init(void)
  22. {
  23. GPIO_InitTypeDef GPIO_InitStruct;
  24. __HAL_RCC_GPIOA_CLK_ENABLE();
  25. __HAL_RCC_GPIOB_CLK_ENABLE();
  26. GPIO_InitStruct.Pin = CADENCE_1_Pin;
  27. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  28. GPIO_InitStruct.Pull = GPIO_PULLUP;
  29. HAL_GPIO_Init(CADENCE_1_GPIO_Port, &GPIO_InitStruct);
  30. GPIO_InitStruct.Pin = CADENCE_2_Pin;
  31. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  32. GPIO_InitStruct.Pull = GPIO_PULLUP;
  33. HAL_GPIO_Init(CADENCE_2_GPIO_Port, &GPIO_InitStruct);
  34. }
  35. //踏频传感器检测处理
  36. void CadenceSensor_Process(MC_CadenceResult_Struct_t* p_MC_CadenceResult, uint16_t StopDelayTime, uint8_t StarCount, TrueOrFalse_Flag_Struct_t UpSlopeFlag)
  37. {
  38. static MC_CadenceSensorStatus_Struct_t MC_CadenceSensorStatus;
  39. static TrueOrFalse_Flag_Struct_t IsFirstEnterFalg = TRUE;
  40. //读取霍尔信号
  41. MC_CadenceSensorStatus.HallGropuStatus = Cadence_ReadHallState();
  42. if(IsFirstEnterFalg == TRUE)
  43. {
  44. MC_CadenceSensorStatus.HallGropuStatus_Old = MC_CadenceSensorStatus.HallGropuStatus;
  45. IsFirstEnterFalg = FALSE;
  46. }
  47. //判断踏频正反转,踏频信号触发计数
  48. static uint16_t BackwordDelayCnt1 = 0;
  49. static uint16_t BackwordDelayCnt2 = 0;
  50. if(MC_CadenceSensorStatus.HallGropuStatus != MC_CadenceSensorStatus.HallGropuStatus_Old)
  51. {
  52. if(MC_CadenceSensorStatus.HallGropuStatus_Old == ForwardDir_EncoderData[MC_CadenceSensorStatus.HallGropuStatus & 0x03])//上一次的编码,与正转的编码顺序一致,则为正转
  53. {
  54. //正转
  55. p_MC_CadenceResult->Cadence_Dir = MC_Cadence_Forward;
  56. BackwordDelayCnt1 = 0;
  57. BackwordDelayCnt2 = 0;
  58. //踏频信号计数
  59. p_MC_CadenceResult->TrigCount++;
  60. }
  61. else if(MC_CadenceSensorStatus.HallGropuStatus_Old == BackwardDir_EncoderData[MC_CadenceSensorStatus.HallGropuStatus & 0x03])//反转做延时判断
  62. {
  63. //反转
  64. BackwordDelayCnt1++;
  65. if(BackwordDelayCnt1 >= 4)//检测到连续4次反向脉冲则判断为反转,约4/120*360=12度
  66. {
  67. p_MC_CadenceResult->Cadence_Dir = MC_Cadence_Backward;
  68. BackwordDelayCnt1 = 0;
  69. }
  70. }
  71. else//蹋频波形异常情况下,延时判断为反转
  72. {
  73. //反转
  74. BackwordDelayCnt2++;
  75. if(BackwordDelayCnt2 > 10)
  76. {
  77. p_MC_CadenceResult->Cadence_Dir = MC_Cadence_Backward;
  78. BackwordDelayCnt2 = 0;
  79. }
  80. }
  81. }
  82. //踏频计算及启动和停止判断
  83. static uint32_t CadenceCalTimeCnt = 0; //用于计算蹋频值
  84. static int32_t Cadence_ActiveFlt = 0;
  85. uint16_t CadenceTemp;
  86. static uint8_t CadenceStarFlagCnt = 0; //用于判断启动
  87. static uint32_t CadenceStopJudgeTimeCnt = 0; //用于判断停止
  88. uint8_t CadenceStartThresholdValue = 2; //踏频启动阈值,霍尔信号数,6度/个
  89. if((MC_CadenceSensorStatus.HallGropuStatus & 0x01) != (MC_CadenceSensorStatus.HallGropuStatus_Old & 0x01))
  90. {
  91. //踏频计算及滤波处理
  92. CadenceTemp = 1000 / (HAL_GetTick() - CadenceCalTimeCnt);//转1圈有60个信号,根据两个信号之间的时间计算踏频值rpm
  93. CadenceCalTimeCnt = HAL_GetTick();
  94. Cadence_ActiveFlt += (((int32_t)CadenceTemp << 8) - Cadence_ActiveFlt) >> 4;
  95. p_MC_CadenceResult->Cadence_Data = (uint8_t)(Cadence_ActiveFlt >> 8);
  96. /*上坡时,启动阈值为1*/
  97. if(UpSlopeFlag == TRUE)
  98. {
  99. CadenceStartThresholdValue = 1;
  100. }
  101. else
  102. {
  103. CadenceStartThresholdValue = StarCount;
  104. }
  105. //起步判断
  106. if(p_MC_CadenceResult->Cadence_Dir == MC_Cadence_Forward)
  107. {
  108. CadenceStarFlagCnt++;
  109. if(CadenceStarFlagCnt >= CadenceStartThresholdValue)
  110. {
  111. p_MC_CadenceResult->IsStopFlag = FALSE;
  112. }
  113. }
  114. else
  115. {
  116. p_MC_CadenceResult->IsStopFlag = TRUE;
  117. }
  118. //更新停机计时数值
  119. CadenceStopJudgeTimeCnt = HAL_GetTick();
  120. }
  121. //停机判断
  122. if(p_MC_CadenceResult->Cadence_Data < (1500 / StopDelayTime))
  123. {
  124. StopDelayTime *= 3;
  125. }
  126. if((HAL_GetTick() - CadenceStopJudgeTimeCnt) > StopDelayTime)
  127. {
  128. p_MC_CadenceResult->IsStopFlag = TRUE;
  129. p_MC_CadenceResult->Cadence_Dir = MC_Cadence_Stop;
  130. p_MC_CadenceResult->Cadence_Data = 0;
  131. CadenceTemp = 0;
  132. Cadence_ActiveFlt = 0;
  133. CadenceStarFlagCnt =0;
  134. }
  135. MC_CadenceSensorStatus.HallGropuStatus_Old = MC_CadenceSensorStatus.HallGropuStatus;
  136. }