cadence_sensor.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  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};
  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)
  37. {
  38. static MC_CadenceSensorStatus_Struct_t MC_CadenceSensorStatus;
  39. static TrueOrFalse_Flag_Struct_t IsFirstEnterFalg = TRUE;
  40. static uint8_t CadenceTest = 0;
  41. //读取霍尔信号
  42. MC_CadenceSensorStatus.HallGropuStatus = Cadence_ReadHallState();
  43. CadenceTest = MC_CadenceSensorStatus.HallGropuStatus & 0x01;
  44. if(IsFirstEnterFalg == TRUE)
  45. {
  46. MC_CadenceSensorStatus.HallGropuStatus_Old = MC_CadenceSensorStatus.HallGropuStatus;
  47. IsFirstEnterFalg = FALSE;
  48. }
  49. //判断踏频正反转
  50. static uint16_t BackwordDelayCnt1 = 0;
  51. static uint16_t BackwordDelayCnt2 = 0;
  52. if(MC_CadenceSensorStatus.HallGropuStatus != MC_CadenceSensorStatus.HallGropuStatus_Old)
  53. {
  54. if(MC_CadenceSensorStatus.HallGropuStatus_Old == ForwardDir_EncoderData[MC_CadenceSensorStatus.HallGropuStatus & 0x03])//上一次的编码,与正转的编码顺序一致,则为正转
  55. {
  56. //正转
  57. p_MC_CadenceResult->Cadence_Dir = MC_Cadence_Forward;
  58. BackwordDelayCnt1 = 0;
  59. BackwordDelayCnt2 = 0;
  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 uint8_t CadenceStarFlagCnt = 0; //用于判断启动
  85. static uint32_t CadenceStopJudgeTimeCnt = 0;
  86. if((MC_CadenceSensorStatus.HallGropuStatus & 0x01) != (MC_CadenceSensorStatus.HallGropuStatus_Old & 0x01))
  87. {
  88. //踏频计算
  89. p_MC_CadenceResult->Cadence_Data = 1000 / (HAL_GetTick() - CadenceCalTimeCnt);
  90. CadenceCalTimeCnt = HAL_GetTick();
  91. //起步判断
  92. if(p_MC_CadenceResult->Cadence_Dir == MC_Cadence_Forward)
  93. {
  94. CadenceStarFlagCnt++;
  95. if(CadenceStarFlagCnt >= 2)
  96. {
  97. p_MC_CadenceResult->IsStopFlag = FALSE;
  98. }
  99. }
  100. else
  101. {
  102. p_MC_CadenceResult->IsStopFlag = TRUE;
  103. }
  104. //更新停机计时数值
  105. CadenceStopJudgeTimeCnt = HAL_GetTick();
  106. }
  107. //停机判断
  108. if((HAL_GetTick() - CadenceStopJudgeTimeCnt) > StopDelayTime)
  109. {
  110. p_MC_CadenceResult->IsStopFlag = TRUE;
  111. p_MC_CadenceResult->Cadence_Dir = MC_Cadence_Stop;
  112. p_MC_CadenceResult->Cadence_Data = 0;
  113. CadenceStarFlagCnt =0;
  114. }
  115. MC_CadenceSensorStatus.HallGropuStatus_Old = MC_CadenceSensorStatus.HallGropuStatus;
  116. }