hall_sensor.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. /**********************************
  2. * 文件名称: hall_sensor.c
  3. * 功能描述: 霍尔传感器模块
  4. * 功能: 读取霍尔传感器信号,计算电机角度和速度
  5. **********************************/
  6. #include "main.h"
  7. #include "hall_sensor.h"
  8. Hall_TypeDef Hall = {0}; // 全局实例
  9. Hall_TypeDef* Hall_Get(void)
  10. {
  11. return &Hall;
  12. }
  13. /**
  14. * @brief TIM5中断处理函数
  15. * @note 处理霍尔传感器信号中断,计算电机角度和速度
  16. */
  17. void TIM5_IRQHandler(void)
  18. {
  19. float temp;
  20. if(TIM_GetFlagStatus(TIM5, TIM_FLAG_CC1) == SET)
  21. {
  22. Hall.ccr = (float)TIM_GetCapture1(TIM5);
  23. TIM_ClearFlag(TIM5, TIM_FLAG_CC1);
  24. // hall_angle_add = (float)HALL_ANGLE_FACTOR / temp;
  25. // hall_speed = (float)HALL_SPEED_FACTOR / temp;
  26. uint8_t W = GPIO_ReadInputDataBit(HALL_CH3_GPIO_PORT, HALL_CH3_PIN); // 需要根据实际进行修改
  27. uint8_t V = GPIO_ReadInputDataBit(HALL_CH2_GPIO_PORT, HALL_CH2_PIN);
  28. uint8_t U = GPIO_ReadInputDataBit(HALL_CH1_GPIO_PORT, HALL_CH1_PIN);
  29. Hall.state = U; //计算扇区
  30. Hall.state |= V << 1;
  31. Hall.state |= W << 2;
  32. switch(Hall.state)
  33. {
  34. // 645132
  35. case 0x06: Hall.angle = 0.0f; break;
  36. case 0x04: Hall.angle = PI / 3.0f; break;
  37. case 0x05: Hall.angle = 2 * PI / 3.0f; break;
  38. case 0x01: Hall.angle = PI; break;
  39. case 0x03: Hall.angle = 4 * PI / 3.0f; break;
  40. case 0x02: Hall.angle = 5 * PI / 3.0f; break;
  41. default: break;
  42. }
  43. Hall.angle += PHASE_SHIFT_ANGLE;
  44. if(Hall.angle < 0) Hall.angle += 2*PI;
  45. if(Hall.angle > 2*PI) Hall.angle -= 2*PI;
  46. }
  47. }