| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- /**********************************
- * 文件名称: hall_sensor.c
- * 功能描述: 霍尔传感器模块
- * 功能: 读取霍尔传感器信号,计算电机角度和速度
- **********************************/
- #include "main.h"
- #include "hall_sensor.h"
- Hall_TypeDef Hall = {0}; // 全局实例
- Hall_TypeDef* Hall_Get(void)
- {
- return &Hall;
- }
- /**
- * @brief TIM5中断处理函数
- * @note 处理霍尔传感器信号中断,计算电机角度和速度
- */
- void TIM5_IRQHandler(void)
- {
- float temp;
- if(TIM_GetFlagStatus(TIM5, TIM_FLAG_CC1) == SET)
- {
- Hall.ccr = (float)TIM_GetCapture1(TIM5);
- TIM_ClearFlag(TIM5, TIM_FLAG_CC1);
-
- // hall_angle_add = (float)HALL_ANGLE_FACTOR / temp;
- // hall_speed = (float)HALL_SPEED_FACTOR / temp;
- uint8_t W = GPIO_ReadInputDataBit(HALL_CH3_GPIO_PORT, HALL_CH3_PIN); // 需要根据实际进行修改
- uint8_t V = GPIO_ReadInputDataBit(HALL_CH2_GPIO_PORT, HALL_CH2_PIN);
- uint8_t U = GPIO_ReadInputDataBit(HALL_CH1_GPIO_PORT, HALL_CH1_PIN);
- Hall.state = U; //计算扇区
- Hall.state |= V << 1;
- Hall.state |= W << 2;
- switch(Hall.state)
- {
- // 645132
- case 0x06: Hall.angle = 0.0f; break;
- case 0x04: Hall.angle = PI / 3.0f; break;
- case 0x05: Hall.angle = 2 * PI / 3.0f; break;
- case 0x01: Hall.angle = PI; break;
- case 0x03: Hall.angle = 4 * PI / 3.0f; break;
- case 0x02: Hall.angle = 5 * PI / 3.0f; break;
- default: break;
- }
-
- Hall.angle += PHASE_SHIFT_ANGLE;
-
- if(Hall.angle < 0) Hall.angle += 2*PI;
- if(Hall.angle > 2*PI) Hall.angle -= 2*PI;
-
- }
- }
|