/********************************** * 文件名称: 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; } }