hall_sensor.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. #include "hall_sensor.h"
  2. #include "fault_check.h"
  3. //全局变量定义
  4. const uint8_t HallSensorGroup_Encoder_Forward[8] = {1,3,6,2,5,1,4,1};//霍尔正转编码表,正转时信号为:1,3,2,6,4,5
  5. const uint8_t HallSensorGroup_Encoder_Backward[8] = {1,5,3,1,6,4,2,1};//霍尔反转编码表,反转时信号为:1,5,4,6,2,3
  6. //电角度值
  7. const uint16_t HallAngle_Data[8] =
  8. {
  9. 0,
  10. HALL_ORIGIN * 65536 / 360 + ANGLE_60D,
  11. HALL_ORIGIN * 65536 / 360 + ANGLE_120D + ANGLE_60D,
  12. HALL_ORIGIN * 65536 / 360 + ANGLE_120D,
  13. HALL_ORIGIN * 65536 / 360 - ANGLE_60D + 65535,
  14. HALL_ORIGIN * 65536 / 360 + 65535,
  15. HALL_ORIGIN * 65536 / 360 - ANGLE_120D + 65535,
  16. 0
  17. };
  18. //全局变量定义
  19. MC_HallSensorData_Struct_t MC_HallSensorData = {0, 0, 0, 0, True, True, 0};
  20. MC_VirtualPosition_Struct_t MC_VirtualPosition = {20, 0};
  21. /**************************局部函数定义*************************/
  22. /**************************全局函数定义*************************/
  23. //读取霍尔传感器IO状态
  24. uint8_t Hall_ReadState(void)
  25. {
  26. uint8_t ReadValue;
  27. if(MC_HallSensorData.InverterExistFlag == True) //存在反相器
  28. {
  29. ReadValue = (uint8_t)(HAL_GPIO_ReadPin(HALL_C_GPIO_Port, HALL_C_Pin)); //HALL C
  30. ReadValue |= (uint8_t)(HAL_GPIO_ReadPin(HALL_B_GPIO_Port, HALL_B_Pin)) << 1; //HALL B
  31. ReadValue |= (uint8_t)(HAL_GPIO_ReadPin(HALL_A_GPIO_Port, HALL_A_Pin)) << 2; //HALL A
  32. }
  33. else //不存在反相器,软件反相
  34. {
  35. ReadValue = (uint8_t)((HAL_GPIO_ReadPin(HALL_C_GPIO_Port, HALL_C_Pin) == GPIO_PIN_RESET)?1:0); //HALL C
  36. ReadValue |= (uint8_t)((HAL_GPIO_ReadPin(HALL_B_GPIO_Port, HALL_B_Pin) == GPIO_PIN_RESET)?1:0) << 1; //HALL B
  37. ReadValue |= (uint8_t)((HAL_GPIO_ReadPin(HALL_A_GPIO_Port, HALL_A_Pin) == GPIO_PIN_RESET)?1:0) << 2; //HALL A
  38. }
  39. return(ReadValue & 0x07);
  40. }
  41. //霍尔传感器IO初始化
  42. void HallSensor_GPIO_Init(void)
  43. {
  44. GPIO_InitTypeDef GPIO_InitStruct;
  45. __HAL_RCC_GPIOC_CLK_ENABLE();
  46. GPIO_InitStruct.Pin = HALL_C_Pin|HALL_A_Pin|HALL_B_Pin;
  47. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  48. GPIO_InitStruct.Pull = GPIO_PULLUP;
  49. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  50. }
  51. void HallSensorAngle_Init(void)
  52. {
  53. //初始化电角度值
  54. MC_HallSensorData.SVM_Angle = HallAngle_Data[Hall_ReadState()] + ANGLE_60D / 2;
  55. //PWM计数值清零
  56. MC_HallSensorData.PWM_NumCnt = 0;
  57. }
  58. void HallSensor_Process(void)
  59. {
  60. static MC_HallSensorStatus_Struct_t MC_HallSensorStatus;
  61. static TrueOrFalse_Flag_Struct_t IsFirstEnterFalg = True;
  62. uint8_t HallStatus1, HallStatus2, HallStatus3;
  63. HallStatus1 = Hall_ReadState();
  64. HallStatus2 = Hall_ReadState();
  65. HallStatus3 = Hall_ReadState();
  66. //连续采集三次霍尔,三次状态都一致才更新霍尔状态,防us级干扰
  67. if( (HallStatus1==HallStatus2)&&(HallStatus2==HallStatus3) )
  68. {
  69. MC_HallSensorStatus.HallGropuStatus = HallStatus3;
  70. }
  71. if(IsFirstEnterFalg == True)
  72. {
  73. MC_HallSensorStatus.HallGropuStatus_Old = MC_HallSensorStatus.HallGropuStatus;
  74. IsFirstEnterFalg = False;
  75. }
  76. //启动和停止状态更新
  77. static uint8_t HallSensorTrigCnt = 0;
  78. static uint32_t StopDelayTimeCnt = 0;
  79. static uint8_t backwardcount = 0;
  80. if(MC_HallSensorStatus.HallGropuStatus != MC_HallSensorStatus.HallGropuStatus_Old)
  81. {
  82. StopDelayTimeCnt = HAL_GetTick();
  83. if(HallSensorTrigCnt != 0)
  84. {
  85. HallSensorTrigCnt++;
  86. }
  87. else
  88. {
  89. MC_HallSensorData.IsStopFlag = False;
  90. }
  91. }
  92. else
  93. {
  94. if((HAL_GetTick() - StopDelayTimeCnt) > 200)//超时200ms霍尔信号不变化,认为静止
  95. {
  96. MC_HallSensorData.IsStopFlag = True;
  97. HallSensorTrigCnt = 0;
  98. MC_HallSensorData.motorspeed = 0;
  99. MC_HallSensorData.motorspeed_RCFlt = 0;
  100. backwardcount = 0;
  101. MC_HallSensorData.BackwardFlag = False;
  102. }
  103. }
  104. //步进角和电角度计算
  105. static uint8_t HallSensorAngleCnt = 0;
  106. if(MC_HallSensorData.IsStopFlag == True)
  107. {
  108. HallSensorAngleCnt = 0;//停止时清零,防止下次启动异常
  109. }
  110. if(MC_HallSensorStatus.HallGropuStatus == HallSensorGroup_Encoder_Forward[MC_HallSensorStatus.HallGropuStatus_Old])
  111. {
  112. //步进角计算
  113. if(MC_HallSensorData.PWM_NumCnt != 0)
  114. {
  115. MC_HallSensorData.Delta_Angle = ANGLE_60D / MC_HallSensorData.PWM_NumCnt;
  116. }
  117. //电角度计算
  118. else
  119. {
  120. MC_HallSensorData.Delta_Angle = 1;
  121. }
  122. HallSensorAngleCnt++;
  123. if(HallSensorAngleCnt>2)
  124. {
  125. MC_HallSensorData.motorspeed = 18750/MC_HallSensorData.PWM_NumCnt;
  126. backwardcount = 0;
  127. MC_HallSensorData.BackwardFlag = False;
  128. }
  129. if(HallSensorAngleCnt < 15)
  130. {
  131. MC_HallSensorData.SVM_Angle = HallAngle_Data[MC_HallSensorStatus.HallGropuStatus] + (ANGLE_60D >> 1);
  132. MC_HallSensorData.Delta_Angle = 0;
  133. }
  134. else //15个霍尔变化后,在FOC中计算电角度
  135. {
  136. HallSensorAngleCnt = 15;
  137. MC_HallSensorData.SVM_Angle = HallAngle_Data[MC_HallSensorStatus.HallGropuStatus];
  138. }
  139. MC_HallSensorData.PWM_NumCnt = 0;
  140. MC_HallSensorData.Delta_AngleSum = 0;
  141. }
  142. else if(MC_HallSensorStatus.HallGropuStatus_Old == HallSensorGroup_Encoder_Forward[MC_HallSensorStatus.HallGropuStatus])
  143. {
  144. HallSensorAngleCnt = 0;
  145. MC_HallSensorData.Delta_Angle = 0;
  146. MC_HallSensorData.SVM_Angle = HallAngle_Data[MC_HallSensorStatus.HallGropuStatus] + (ANGLE_60D >> 1);
  147. MC_HallSensorData.PWM_NumCnt = 0xFFFF;
  148. if(++backwardcount>5)
  149. {
  150. backwardcount = 6;
  151. MC_HallSensorData.BackwardFlag = True;
  152. }
  153. }
  154. //霍尔传感器故障检测
  155. MC_Fault_HallSensor_Process(MC_HallSensorStatus, &MC_ErrorCode);
  156. MC_HallSensorStatus.HallGropuStatus_Old = MC_HallSensorStatus.HallGropuStatus;
  157. }
  158. //电机转速计算
  159. int16_t MotorSpeedCal(uint16_t SVM_Angle, TrueOrFalse_Flag_Struct_t IsStopFlag)
  160. {
  161. static uint8_t PreCnt = 0;
  162. static uint16_t SVM_Angle_Old = 0;
  163. int32_t AngleStep = 0;
  164. static int32_t FreqMotorFlt = 0, motrospeedFltSum=0;
  165. int16_t FreqMotor = 0;
  166. static int16_t Result = 0;
  167. PreCnt++;
  168. if(PreCnt >=15 )
  169. {
  170. PreCnt = 0;
  171. AngleStep = (int32_t)(MC_HallSensorData.SVM_Angle - SVM_Angle_Old);
  172. if(AngleStep < 0)
  173. {
  174. AngleStep = (int32_t)(MC_HallSensorData.SVM_Angle + 65535 - SVM_Angle_Old);
  175. }
  176. if(AngleStep > 20000)
  177. {
  178. AngleStep = 0;
  179. }
  180. SVM_Angle_Old = MC_HallSensorData.SVM_Angle;
  181. AngleStep = AngleStep * 1000;//f = [Angle(k-1)-Angle(k)]/Tc
  182. FreqMotorFlt += (AngleStep - FreqMotorFlt) >> 8;
  183. FreqMotor = FreqMotorFlt >> 16;
  184. Result = 60 * FreqMotor >> 3;// 8n=60*f/p
  185. motrospeedFltSum += ((MC_HallSensorData.motorspeed<<10) - motrospeedFltSum)>>5;
  186. MC_HallSensorData.motorspeed_RCFlt = motrospeedFltSum>>10;
  187. }
  188. if(IsStopFlag == True)
  189. {
  190. Result = 0;
  191. }
  192. return Result;
  193. }