/********************************** * 文件名称: hall_sensor.c * 功能描述: 霍尔传感器模块 * 功能: 读取霍尔传感器信号,计算电机角度和速度 **********************************/ #include "main.h" #include "hall_sensor.h" #include "motor_define.h" #define SPEED_FILTER_DEPTH 8 Hall_TypeDef Hall = {0}; // 全局实例 Hall_TypeDef* Hall_Get(void) { return &Hall; } static float speed_history[SPEED_FILTER_DEPTH] = {0}; static uint8_t speed_idx = 0; float Get_Filtered_Speed(void) { speed_history[speed_idx++] =(Hall.speed[0]+Hall.speed[1]+Hall.speed[2]+Hall.speed[3]+Hall.speed[4]+Hall.speed[5])/6.0f; if(speed_idx >= SPEED_FILTER_DEPTH) speed_idx = 0; float sum = 0; for(int i=0; i= 2*PI) Hall.angle -= 2*PI; if(Hall.angle < 0) Hall.angle += 2*PI; } void Hall_Init_For_Startup(void) { // 清零速度数组 for(int i = 0; i < 6; i++) { Hall.speed[i] = 0.0f; Hall.theta[i] = 0.0f; Hall.count[i] = 0; } // 清零速度历史 for(int i = 0; i < SPEED_FILTER_DEPTH; i++) speed_history[i] = 0.0f; speed_idx = 0; // 重置角度增量 Hall.angle_add = 0.0f; Hall.Speed = 0.0f; // 重置计数值 Hall.ccr = 0; // 强制获取当前霍尔状态 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 | (V << 1) | (W << 2); Hall.state_last = Hall.state; }