/** * bldc_hw.h — 无感方波 BLDC 硬件抽象层 * * 引脚定义、外设基地址、系统参数宏、Q15 定点数宏 * 所有可调参数集中在此文件头部,方便调试修改 */ #ifndef BLDC_HW_H #define BLDC_HW_H #include #include "stm32f10x.h" /* ==================== 系统时钟 ==================== */ #define SYSCLK_FREQ 72000000UL #define APB1_FREQ 36000000UL #define APB2_FREQ 72000000UL /* ==================== 电机参数 ==================== */ #define MOTOR_POLE_PAIRS 7 /* 极对数 */ #define MOTOR_VOLTAGE 12 /* 额定电压 V */ #define MOTOR_CURRENT_RATED 2000 /* 额定电流 mA */ #define MOTOR_CURRENT_MAX 2500 /* 最大电流 mA */ #define MOTOR_SPEED_NOM 3000 /* 额定转速 RPM */ /* ==================== PWM 参数(TIM1) ==================== */ #define PWM_FREQ_HZ 20000UL /* PWM 频率 20kHz */ #define PWM_ARR_VALUE (SYSCLK_FREQ / 2 / PWM_FREQ_HZ) /* 1800 */ #define PWM_DEADTIME_NS 1000 /* 死区 1μs */ #define PWM_DEADTIME_CLK (PWM_DEADTIME_NS / (1000000000UL / SYSCLK_FREQ)) /* 72 */ #define PWM_DUTY_MAX 1710 /* 最大占空比 (ARR - 死区), 约 95% */ #define PWM_DUTY_MIN 10 /* 最小占空比 */ /* ==================== ADC 参数 ==================== */ #define ADC_SAMPLE_TIME ADC_SampleTime_239Cycles5 /* ~3μs @ 12MHz */ #define ADC_VREF_MV 3300 /* Vref+ = 3.3V */ #define ADC_RESOLUTION 4096 /* 12-bit */ #define BEMF_DIVIDER_RATIO 2 /* 分压比 (10k:10k = 2:1) */ #define BEMF_FILTER_TAPS 3 /* 滑动平均窗口 */ /* ==================== 电流采样参数 ==================== */ #define SHUNT_RESISTOR_MOHM 50 /* 0.05Ω */ #define AMP_GAIN 20 /* 运放放大倍数 */ #define CURRENT_ADC_FS_MV (ADC_VREF_MV) /* 满量程 mV */ #define CURRENT_FS_MA ((uint32_t)ADC_VREF_MV * 1000UL / ((uint32_t)SHUNT_RESISTOR_MOHM * (uint32_t)AMP_GAIN)) /* 满量程电流 (mA), 整数运算 */ /* ==================== 保护阈值 ==================== */ #define PROTECT_OC_TRIP_MA 2500 /* 软件过流阈值 mA */ #define PROTECT_OC_DURATION 2000 /* 过流判定时间 (PWM 周期计数, 2000 × 50μs = 100ms) */ #define PROTECT_STALL_TIME 2000 /* 堵转判定 (PWM 周期计数, 2000 × 50μs = 100ms) */ #define PROTECT_FAULT_SPEED 50 /* 最低转速检测阈值 RPM, 低于此判为堵转 */ /* ==================== 启动参数 ==================== */ #define ALIGN_TIME_MS 500 /* 预定位通电时间 ms */ #define ALIGN_PWM_DUTY 300 /* 预定位占空比 (ARR=1800, ≈ 16%) */ #define ACCEL_START_FREQ_HZ 30 /* 起始换相频率 Hz (电频率) */ #define ACCEL_STEP_COUNT 10 /* 每多少次换相后提速 */ #define ACCEL_RATE 110 /* 每步提速比例 110% */ #define ACCEL_TOTAL_STEPS 200 /* 最大加速步数 */ #define ACCEL_DUTY_MIN 180 /* 起始占空比 10% (180/1800) */ #define ACCEL_DUTY_MAX 900 /* 最大占空比 50% (900/1800) */ #define ACCEL_SETTLE_COUNT 6 /* 关环前需连续检测到的过零次数 */ /* ==================== 控制环参数 ==================== */ #define SPEED_LOOP_DIV 40 /* 速度环分频 (每 40 个 PWM 周期跑一次 = 500Hz) */ #define POSITION_LOOP_DIV 400 /* 位置环分频 (每 400 个 PWM 周期跑一次 = 50Hz) */ /* ==================== Q15 定点数宏 ==================== */ /* Q15: 1 位符号 + 15 位小数, 范围 [-1, 0.99997] */ #define Q15_SCALE 32768 #define Q15_ONE 32768 /* 1.0 in Q15 */ #define Q15_HALF 16384 /* 0.5 in Q15 */ #define Q15_FLOAT(x) ((int16_t)((x) * Q15_SCALE)) #define Q15_INT(x) ((x) << 15) static inline int16_t Q15_MUL(int16_t a, int16_t b) { return (int16_t)(((int32_t)a * b) >> 15); } static inline int16_t Q15_DIV(int16_t a, int16_t b) { if (b == 0) return 0; return (int16_t)(((int32_t)a << 15) / b); } /* ==================== 引脚定义 ==================== */ /* TIM1 高级定时器 PWM — PA8(UH), PA9(VH), PA10(WH), PB13(UL), PB14(VL), PB15(WL) */ /* BKIN — PB12 */ /* GPIO Ports */ #define GPIO_PORT_TIM_CH GPIOA #define GPIO_PORT_TIM_CHN GPIOB #define GPIO_PORT_BKIN GPIOB #define GPIO_PORT_FAULT_LED GPIOC /* TIM1 CH Pins */ #define GPIO_PIN_UH GPIO_Pin_8 /* PA8 — TIM1_CH1 */ #define GPIO_PIN_VH GPIO_Pin_9 /* PA9 — TIM1_CH2 */ #define GPIO_PIN_WH GPIO_Pin_10 /* PA10 — TIM1_CH3 */ #define GPIO_PIN_UL GPIO_Pin_13 /* PB13 — TIM1_CH1N */ #define GPIO_PIN_VL GPIO_Pin_14 /* PB14 — TIM1_CH2N */ #define GPIO_PIN_WL GPIO_Pin_15 /* PB15 — TIM1_CH3N */ #define GPIO_PIN_BKIN GPIO_Pin_12 /* PB12 — TIM1_BKIN */ #define GPIO_PIN_FAULT_LED GPIO_Pin_13 /* PC13 — 故障指示灯 */ /* ADC 引脚 */ #define GPIO_PIN_ADC_U GPIO_Pin_0 /* PA0 — ADC1_IN0 — U 相端电压 */ #define GPIO_PIN_ADC_V GPIO_Pin_1 /* PA1 — ADC1_IN1 — V 相端电压 */ #define GPIO_PIN_ADC_W GPIO_Pin_2 /* PA2 — ADC1_IN2 — W 相端电压 */ #define GPIO_PIN_ADC_I GPIO_Pin_3 /* PA3 — ADC1_IN3 — 母线电流 */ /* ADC 通道号 (注入组) */ #define ADC_INJ_CH_U 0 #define ADC_INJ_CH_V 1 #define ADC_INJ_CH_W 2 #define ADC_INJ_CH_I 3 #define ADC_INJ_CH_COUNT 4 /* ==================== 定时器捕获 (TIM2) ==================== */ #define TIM2_CAPTURE TIM2 #define GPIO_TIM2_CH1 GPIO_Pin_0 /* PA0 — TIM2_CH1 (输入捕获) */ #define GPIO_TIM2_CH1_PORT GPIOA /* ==================== 状态机状态枚举 ==================== */ typedef enum { FSM_STOP = 0, FSM_ALIGN = 1, FSM_ACCEL = 2, FSM_RUN = 3, FSM_FAULT = 4 } FsmState; /* ==================== 故障码 ==================== */ typedef enum { FAULT_NONE = 0, FAULT_OC_HARDWARE = 1, /* TIM1_BKIN 触发硬件刹车 */ FAULT_OC_SOFTWARE = 2, /* 软件过流 */ FAULT_STALL = 3, /* 堵转 */ FAULT_OVERVOLTAGE = 4, FAULT_UNDERVOLTAGE = 5, } FaultCode; /* ==================== 全局变量声明 ==================== */ extern volatile uint16_t g_adc_raw[ADC_INJ_CH_COUNT]; /* ADC 原始值 */ extern volatile uint16_t g_adc_filtered[3]; /* 三相滤波后值 */ extern volatile uint16_t g_i_bus_raw; /* 母线电流 ADC 原始值 */ extern volatile int16_t g_i_bus_ma; /* 母线电流 mA (Q15) */ extern volatile uint16_t g_bemf_samples[3][BEMF_FILTER_TAPS]; /* 滑动窗口 */ extern volatile uint8_t g_bemf_idx[3]; extern volatile uint32_t g_pwm_cycle_count; /* PWM 周期计数 */ extern volatile uint32_t g_comm_step; /* 当前换相步 (0-5) */ extern volatile uint32_t g_comm_count; /* 换相总计数 */ extern volatile uint16_t g_comm_interval_us; /* 上次换相间隔 μs */ extern volatile uint16_t g_comm_interval_pwm; /* 换相间隔 (PWM 周期数) */ extern volatile int16_t g_speed_rpm; /* 当前转速 (Q15) */ extern volatile int16_t g_current_ref_ma; /* 电流环参考值 (Q15, mA) */ extern volatile int16_t g_speed_ref_rpm; /* 速度环参考值 (Q15, RPM) */ extern volatile int16_t g_position_ref; /* 位置环参考值 */ extern volatile uint16_t g_pwm_duty; /* 当前 PWM 占空比 (0-ARR) */ extern volatile uint8_t g_run_enable; /* 运行使能 */ extern volatile uint8_t g_fault; /* 故障码 */ extern volatile FsmState g_state; /* 当前状态机状态 */ extern volatile uint8_t g_zero_cross_detected; /* 过零检测标志 */ extern volatile uint16_t g_accel_count; /* 启动加速计数 */ #endif /* BLDC_HW_H */