#ifndef _BSP_CHARGE_H_ #define _BSP_CHARGE_H_ #include #include "string.h" #include "gd32f30x.h" #include "os.h" #include "gd32f30x_rtc.h" #include #include #define PERIOD_VALUE (120000000UL/400000-1) /* 边沿对齐: f_pwm=120M/300=400kHz */ #define PWM_PERIOD_VALUE (120000000UL/400000-1) /**< PWM周期值 400kHz */ #define V_FACTOR ((110 + 10) / 10) //voltage factor:R1 = 110K,R2 = 10K #define VREF 3400 //3298// #define DEAD_TIME_VALUE (12) /**< 死区时间值(~100ns),防止MOSFET直通 */ #define ADC_BOOST ADC0 #define DMA_BOOST DMA0 #define RCU_ADC_BOOST RCU_ADC0 #define RCU_DMA_BOOST RCU_DMA0 #define DMA_CH_BOOST DMA_CH0 #define BAT_LED_PORT GPIOC #define BAT_LED_PIN GPIO_PIN_2 #define BAT_LED_ON gpio_bit_write(BAT_LED_PORT,BAT_LED_PIN,RESET); #define BAT_LED_OFF gpio_bit_write(BAT_LED_PORT,BAT_LED_PIN,SET); #define MCU_LED_PORT GPIOA #define MCU_LED_PIN GPIO_PIN_12 #define EN_PV_PORT GPIOC #define EN_PV_PIN GPIO_PIN_12 #define EN_BAT_SYSPOWER_PORT GPIOC //关闭电池给主板/通讯板供电的通道 #define EN_BAT_SYSPOWER_PIN GPIO_PIN_9 #define EN_CHARGE_PORT GPIOA /* 控制电池充电端口 */ #define EN_CHARGE_PIN GPIO_PIN_15 /* 控制电池充电引脚 */ /* 无PV,choose bat失效恒定电池输出 有PV,choose bat=0,电源输出,电池不输出 choose bat=1,电池也输出 理论上来说有PV的时候电池就没有输出的必要。这里不配引脚在3态也不太对,直接配0 */ #define EN_CHOOSE_BAT_PORT GPIOC /* choose bat */ #define EN_CHOOSE_BAT_PIN GPIO_PIN_1 /* */ #define BAT_HEAT_PORT GPIOC #define BAT_HEAT_PIN GPIO_PIN_8 #define SEN_HEAT_PORT GPIOD #define SEN_HEAT_PIN GPIO_PIN_2 #define KEY_PORT GPIOC #define KEY_PIN GPIO_PIN_13 #define BI1_KEY gpio_input_bit_get(GPIOC, GPIO_PIN_13)==SET #define BI0_KEY gpio_input_bit_get(GPIOC, GPIO_PIN_13)==RESET #define PV_ON gpio_bit_write(GPIOC,GPIO_PIN_10,RESET); #define PV_OFF gpio_bit_write(GPIOC,GPIO_PIN_10,SET); #define BATHEAT_ON gpio_bit_write(BAT_HEAT_PORT,BAT_HEAT_PIN,SET); #define BATHEAT_OFF gpio_bit_write(BAT_HEAT_PORT,BAT_HEAT_PIN,RESET); #define SHEAT_ON gpio_bit_write(SEN_HEAT_PORT,SEN_HEAT_PIN,SET); #define SHEAT_OFF gpio_bit_write(SEN_HEAT_PORT,SEN_HEAT_PIN,RESET); #define MCU_LED_ON gpio_bit_write(MCU_LED_PORT,MCU_LED_PIN,RESET); #define MCU_LED_OFF gpio_bit_write(MCU_LED_PORT,MCU_LED_PIN,SET); #define BAT_TOTAL_MIN (4000.0f) /**< 电池放电截止 4V */ #define CHARGE_CURRENT_CC 1000.0f /**< 恒流充电电流 1.0A (测试阶段) */ #define CHARGE_VOLTAGE_CV 29000.0f /**< 恒压充电电压 29.4V (7S×4.2V) ,设置充满29V*/ #define PRECHARGE_CURRENT 400.0f /**< 预充电电流 */ #define PRECHARGE_VOLTAGE 21000.0f /**< 预充电电压阈值 21V (7S×3.0V) */ #define PRECHARGE_TIMEOUT 600UL /**< 预充电超时时间 10分钟 (200mA激活, 含光伏波动裕量, g_system_tick=1Hz) */ #define CHARGE_TIMEOUT 28800UL /**< 总充电超时时间 8小时 (4AH/1A≈4h CC+2h CV+2h裕量, g_system_tick=1Hz) */ #define CHARGE_TERMINATE_CURRENT 200.0f /**< 充电终止电流 200mA (0.05C) */ #define RETRY_INTERVAL 60UL /**< 充电重试间隔 1分钟 (g_system_tick=1Hz, 60=60s) */ #define RECHARGE_VOLTAGE_THRESHOLD 28500.0f /**< 充满后重新充电阈值 28.5V */ #define CURRENT_RISE_TIMEOUT_S 5UL /**< 电流上升超时 5秒 (g_system_tick=1Hz) */ /** * @brief 安全电压参数 */ #define VIN_MIN_SAFE_MV 12000.0f /**< 输入电压安全下限12 */ #define VIN_MAX_SAFE_V 33000.0f #define CURRENT_HARD_LIMIT_MA (CHARGE_CURRENT_CC + 1000.0f) /**< 硬件电流限制 = CHARGE_CURRENT_CC + 1000mA 裕量 */ #define CURRENT_SOFT_LIMIT_MA 2050.0f /**< 软件电流限制 2050mA(控制阈值) */ #define OVER_OUTPUT_VOLTAGE_THRESHOLD 30000.0f /**< 过压保护阈值 30V */ #define OVER_OUT_CURRENT_THRESHOLD 1300.0f /**< 过流保护阈值 1.3A */ /* MOS管电流保护阈值 */ #define I_MOS_PROTECT_VALUE (0x900) /* 2304mV,对应14A MOS管电流 */ /** * @brief 错误代码定义 */ #define ERROR_NONE 0 /**< 无错误 */ #define ERROR_PRECHARGE_TIMEOUT 1 /**< 预充电超时错误 */ #define ERROR_CHARGE_TIMEOUT 2 /**< 充电超时错误 */ #define ERROR_CHARGE_RETRY_FAILED 3 /**< 充电重试失败错误 */ /** * @brief 保护去抖计数次数 */ #define PROTECT_DEBOUNCE_COUNT 5 /** * @brief 功率限制响应参数 */ #define POWER_LIMIT_RESPONSE_AGGRESSIVE 0.75f /**< 激进功率限制响应系数 */ #define POWER_LIMIT_RESPONSE_MODERATE 0.85f /**< 中等功率限制响应系数 */ #define POWER_LIMIT_SAFETY_MARGIN 0.98f /**< 功率计算安全裕度 2% */ /** * @brief 占空比限制 */ #define BUCK_DUTY_MIN 0.65f /**< Buck模式最小占空比 */ #define BUCK_DUTY_MAX 0.95f /**< Buck模式最大占空比 */ #define BOOST_DUTY_MIN 0.05f /**< Boost模式最小占空比 */ #define BOOST_DUTY_MAX 0.22f /**< Boost模式最大占空比 */ #define DUTY_STEP_PER_CALL 0.01f /**< 每次控制调用占空比调整步进 */ // IIR滤波器参数 #define ALPHA_V 0.05f /**< 电压一阶IIR滤波系数 */ #define ALPHA_I 0.02f /**< 电流一阶IIR滤波系数 (output = (1-α)*prev + α*raw) */ #define ONE_MINUS_ALPHA_I 0.98f /**< 电流IIR历史权重 (1.0f - ALPHA_I) */ #define MA_WINDOW 8 /**< 滑动平均滤波器窗口大小 */ #define VIN_INCREASE_THRESHOLD 5000.0f /**< 输入电压增加阈值 5V,用于触发软启动 */ /** * @brief 模式切换滞回参数(非对称滞回,防振荡) * - 退出 Buck/Boost: 压差 < EXIT_HYST_MV (3.0V) 即退出 * - 进入 Buck/Boost: 压差 > ENTER_THRESHOLD_MV (3.5V) 才进入 * - 滞回宽度: 0.5V (3.5V - 3.0V) */ #define EXIT_HYST_MV 3000.0f /**< 模式退出滞回电压 3.0V */ #define ENTER_THRESHOLD_MV 4000.0f /**< 模式进入阈值 4.0V(退出滞回)*/ /** * @brief PI控制器结构体 * @details 用于电流环和电压环的PI控制 */ typedef struct { /* ===== 控制参数 ===== */ float kp; float ki; float kd; /* ===== 参考值与反馈 ===== */ int32_t i_ref; /* 电流参考值 (mA),电压外环输出 → 电流内环输入 */ int32_t v_ref; /* 电压参考值 (mV) */ /* ===== 控制状态 ===== */ float integral; /* 积分状态 */ int32_t prev_error; /* 微分用(即使你不用kd也建议保留) */ /* ===== 输出 ===== */ float output; /* ===== 限幅 ===== */ int32_t out_min; int32_t out_max; /* ===== 积分限幅(关键优化) ===== */ int32_t integral_min; int32_t integral_max; /* ===== anti-windup ===== */ int32_t aw_gain; /* ===== 控制周期 ===== */ int32_t dt; /* ===== 模式控制(FSBB关键) ===== */ uint8_t mode; /* 0=idle 1=cc 2=cv 3=limit */ } PI_t; /* =============== 电平抽象(解耦逻辑与物理) =============== */ typedef enum { LED_LEVEL_OFF = SET, // 物理熄灭电平(高) LED_LEVEL_ON = RESET // 物理点亮电平(低) } LED_Level_t; /* =============== 状态机定义 =============== */ typedef enum { LED_STATE_OFF = 0, // 无电池 → 灭 LED_STATE_IDLE, // 电池在位/非充电 → 常亮 LED_STATE_CHARGING // 充电中 → 闪烁 } LED_State_t; /** * @brief VAUX 总线电源输入源选择 * @details VAUX 是系统一级中间母线电源(12V~24V), * 为后续 DCDC 提供输入,分别产生 3.3V(数字)和 10V(模拟/驱动)。 */ typedef enum { VAUX_BATTERY_DISABLE = 0, // 外部适配器供电(电池不输出) VAUX_BATTERY_ENABLE = 1, // 电池供电(电池接入VAUX总线) } VauxSource_t; /** * @brief 初始化电池指示灯(默认设为放电常亮) */ /** * @brief 设置电池充电状态(由外部充电检测调用) * @param is_charging true=充电中,false=放电/空闲 */ typedef enum { CHARGE_ON = 0, //allow charge battery CHARGE_OFF, //stop charge battery NULL_CHARGE, } BatteryChargeCmd_t; //FSBB circuit converter mode:recording the vin and battery typedef enum { BUCK_CONVERT_MODE = 0, /**< Buck降压模式:Vin > Vout */ BOOST_CONVERT_MODE, /**< Boost升压模式:Vin < Vout */ BUCK_BOOST_CONVERT_MODE, /**< Buck-Boost模式:Vin ≈ Vout */ IDLE_CONVERT_MODE, FAULT_CONVERT_MODE, } PowerConverterMode_t; /** * @brief 锂电池充电全阶段的状态枚举 * @details 标识电池充电过程的不同阶段:depends on the battery status when charging */ typedef enum { CHARGE_STATE_STANDY = 0, CHARGE_STATE_START = 1, /**< 起始状态/待机 */ CHARGE_STATE_PRECHARGE, /**< 预充电阶段(小电流激活电池) */ CHARGE_STATE_CC, /**< 恒流充电阶段 */ CHARGE_STATE_CV, /**< 恒压充电阶段 */ CHARGE_STATE_COMPLETE, /**< 充电完成 */ } ChargeState_t; /** * @brief FSBB电路的保护状态枚举 * @details 用于标识系统当前处于何种保护状态 */ typedef enum { PROTECT_NORMAL = 0, /**< 正常状态 */ PROTECT_OUTPUT_OVERVOLTAGE, /**< 输出过压保护 */ PROTECT_OUTPUT_OVERCURRENT, /**< 输出过流保护 */ PROTECT_INPUT_UNDERVOLTAGE, /**< 输入欠压保护 */ PROTECT_INPUT_OVERVOLTAGE, /**< 输入过压保护 */ PROTECT_BATTERY_UNDERVOLTAGE,/**< 电池欠压保护 */ PROTECT_MOS_OVERCURRENT, /**< MOS管过流保护 */ PROTECT_OVERTEMP, /**< 过温保护 */ PROTECT_OUTPUT_SHORT_CIRCUIT /**< 短路保护 */ } ProtectState_t; /* describe: combine all the structure of the fsbb and battery and protect status to one * @brief FSBB电路控制状态 * @details 存储FSBB电源转换器的模式、充电状态和保护状态 */ typedef struct { PowerConverterMode_t convert_mode; /**< FSBB工作模式 */ ChargeState_t charge_state; /**< 充电状态机状态 */ ProtectState_t protect_state; /**< 保护状态 */ //BatteryChargeCmd_t chargeOnOff; uint32_t error_code; /**< 错误代码 */ } FsbbStatus_t; /** @brief 输入源类型 */ typedef enum { INPUT_SOURCE_NONE = 0, /**< 无有效输入 */ INPUT_SOURCE_PV, /**< 光伏输入 */ INPUT_SOURCE_DC, /**< DC电源输入 */ } InputSource_t; /** * @brief 电源状态结构体 * @details 存储实时采样的电源参数(经过滤波处理) */ typedef struct { volatile float vin; /**< 输入电压 (V) */ volatile float vout; /**< 输出电压 (V) */ volatile float iout; /**< 输出电流 (A) */ volatile float bat; /**< 电池电压 (V) */ volatile float imos; /**< MOSFET电流 (A) */ volatile int check_imos; /**< MOSFET电流ADC原始值(用于保护比较) */ volatile float vpv; /**< 光伏电压 (V) */ volatile float vdc; /**< DC母线电压 (V) */ volatile InputSource_t input_source; /**< 当前输入源类型 */ volatile float bat_temp; /**< 电池NTC温度 (°C) */ volatile signed short pcb_temp; /**< PCB温度 TMP75 (°C) */ volatile bool battery_connected; /**< 电池连接状态(bat >= 5V 认为已连接) */ volatile int32_t charge_current_ref; /**< 充电电流参考值 (mA),电压外环输出 → 电流内环输入 */ } PowerStatus_t; void BspCharge_Init(void); void BspCharge_EnablePwmOutput(void); void BspCharge_DisablePwmOutput(void); void BspCharge_TurnOffMosfet(void); void BspCharge_TurnOnMosfet(void); int BspCharge_GetVdc(void); int BspCharge_GetVbat(void); int BspCharge_GetVpv(void); int BspCharge_GetVout(void); void DMA0_Channel0_IRQHandler(void); int BspCharge_GetIout(void); int BspCharge_GetImos(void); void BspBat_EnableSupply(void); void BspBat_DisableSupply(void); void mcu_led_toggle(void); void bat_led_toggle(void); void gpio_config(void); void fsbb_pwm_disable(void);// disable the FSBB(BUCKBOOST) output void fsbb_pwm_enable(void); void set_fsbb_boost_mode(float boost_duty); void set_fsbb_buck_mode(float buck_duty); void set_fsbb_buckboost_mode(float buck_duty,float boost_duty); void set_fsbb_idle_mode(void); void fsbb_select_mode(float vin, float vbat); void softstart_trigger_check(void);//软启动触发检测 void fsbb_charge_protection_check(void); void Charge_Voltage_Control(void); void Current_Control_Update(void); void charge_step_machine(void); /* =============== 保护检测子功能 =============== */ uint8_t protect_check_outputovervoltage(void); uint8_t protect_check_output_overcurrent(void); uint8_t protect_check_input_undervoltage(void); uint8_t protect_check_input_overvoltage(void); uint8_t protect_check_battery_undervoltage(void); uint8_t protect_check_mos_overcurrent(void); uint8_t protect_check_shortcircuit(void); uint8_t protect_check_fault_recovery(void); void BatLed_Init(void); void current_control_loop(void); void BatLed_UpdateChargeIndicator(void); void Vaux_SetSource(VauxSource_t source); #endif