)
文件:HW/src/llc_control.c当前 370 行HW/include/llc_control.h 依赖宏见App/include/main.h354 行修订记录2026-08-12 v1 初版评审2026-08-24 v2 更新A1~C6 处置状态、N1~N4 新发现、第七节验证分级2026-09-03 v3本版①B2 结论再次修正——FAULT 恢复分支含恒真条件纯自动恢复仍是死代码实际恢复语义是CLEAR 后自动回 STANDBY承接 09-02 状态机 v2 复审② C1 结论修正——iout_a0不是恒真无害iout 未标定时完成判据可能提前误触发 FINISHED③ 新增llc_enable()/llc_disable()封装与LLC_EN 低有效极性反转的核对④ CV_REFERENCE_MAX_V 80→85⑤ 行号全部按 370 行当前版重对⑥ 过时注释清单更新。范围: 仅llc_control模块充电功率时序状态机〇、模块定位v3本文件是充电状态机核心STANDBY → PRECHARGE → CC → CV → FINISHEDFAULT 在tick顶部统一收敛。MCU 仅通过CV_PWM/CC_PWM给模拟 LLC IC 设定开环电压/电流基准模拟 IC 内部完成双环闭环MCU 不做 PI。v2 之后代码的三个实质变化llc_enable()/llc_disable()封装新增:55-65LLC_EN 极性反转为低有效llc_enable()拉低使能注释 “LLC_EN is active low”、llc_disable()拉高关断。旧版裸 GPIO 的set开/reset关已全部替换。与main.c:203hw_gpio_init里的llc_disable()初始关断核对一致 ✅。这是好重构极性收口到两个函数消除散布的裸 GPIO 极性。CV_REFERENCE_MAX_V80→85:35。main.c侧 standalone PFC 测试门控被注释serial_console_pfc_test_active已随 PFC ON/OFF 命令移除power_supervisor_tick_1khz()无条件执行。一、问题处置状态总表v3 刷新编号原严重级描述v3 状态A1PRECHARGE 无超时永久卡死✅已修—:311-3133s 超时 →FAULT_PRECHARGE_TIMEOUT且pfc_control.c:62-66RELAY_ON 态也有同款 3s 超时双层pfc 层先触发见 N5A2CV 不切基准、头注释矛盾✅已修注释侧— 头注释:9已注明矛盾MCU 仅下发固定 setpoint符合设计意图B1安全断电无时序继电器带载分断❌仍开放—outputs_force_off()(:121-128) 仍同 tick 齐断见 N-B1最高剩余风险B2FAULT 后无法恢复结论再次修正见第二节 B2 专节恢复链路实际为STOP→CLEAR→下一 tick 自动回 STANDBY分支里的!protect_fault_active_hw()因 protect.c#if 1恒真纯无人干预的自动恢复仍是死代码B3CC/CV 超时误用调试值✅已修—main.h:104-105已为 8h/3h。但:324/:345代码注释仍写8s(调试值)/3s(调试值)过时未更新C1完成判据iout_a0冗余结论修正冗余本身无害负值已被钳 0恒真真正风险在iout_a1A这半句——iout 未标定时可能恒 0 → 充电中提前误判 FINISHED 断输出见第二节 C1 专节C2启动超时名实不符✅已修—OUTPUT_START_TIMEOUT_MS(:30)、FAULT_OUTPUT_START_TIMEOUT(:333)、vout 判定(:331)。:333行内注释名实不符(报母线欠压实则查输出)已过时可删C3STANDBY 同 tick PFC off→on✅已修—pfc_enable()在enter_state(PRECHARGE)(:167)C4CV 进入判据用 vbat 非 vout 维持 —:327/:349仍用vbat_v初版可接受长线损场景后续优化C5outputs_off 不复位 PWM✅已修—:124-125置PWM_DUTY_SAFE。函数头注释:119C5未复位…已过时应删C6TRICKLE/INVALID 兜底 维持 —:366default→STANDBY可接受N1CC 进入即闭合输出继电器❌仍开放P1-A—:174CC 进入瞬间llc_enable()outputs_on()先建输出再接电池的软起保护缺失修法见第二节N2CAN 整体禁用设计意图 维持 —:21can_comm.h注释、main.ccan_comm_init/poll注释进 CAN 集成阶段需恢复并喂命令给 supervisor APIN3死注释#define PFC_READY_TIMEOUT_MS❌ 仍在:32建议删除N4g_fault与锁存自洽 正确 —:289清g_fault与 protect.c 一致active_hw 恒真后此语义更简单N5PRECHARGE 双层 3s 超时并存 pfc 层RELAY_ON 等 bus≥350V与 llc 层PRECHARGE 等 pfc_is_ready同为 3s、计时起点相同pfc_tick 先于 supervisor_tick 执行 → pfc 层先报llc 层超时实际不可达。功能上无冲突都报FAULT_PRECHARGE_TIMEOUT但双层冗余建议择一保留且 pfc 层触发后故障码超时可能掩盖真实原因见 N6N6预充故障码无诊断性pfc_is_ready()三重门RUN ∧ AC∈[180,264] ∧ bus∈[360,420]任一不满足 3s 超时都报FAULT_PRECHARGE_TIMEOUTAC 越限、母线建不起、母线过压420V 反而使 vbus_okfalse三种不同故障共用一个码。建议超时分支内按ac_vol_v/bus_vol_v实际值分流故障码方案见第四节补丁 B二、v3 三个结论修正详细B2 专节 — FAULT 恢复的真实语义承接 09-02 状态机 v2 复审当前代码:284-293if(g_charger_stateMAIN_STEP_FAULT){outputs_force_off();if(!s_enable_requested!protect_fault_latched()!protect_fault_active_hw()){g_faultFAULT_NONE;enter_state(MAIN_STEP_STANDBY);}return;}protect_fault_active_hw()当前#if 1 return falseprotect.c:55-56恒假→!...恒真此条件形同虚设protect_fault_latched()进 FAULT 必为 trueprotect_set_fault置位只有串口CLEAR→protect_clear_fault()能清它因此该分支的实际语义“用户 STOP清s_enable_requested→ CLEAR清锁存→ 下一 tick 自动回 STANDBY”。恢复链路是通的v1永久锁死的旧结论不成立但它不是无人干预的自动恢复只要没人 CLEARlatched恒 true分支永远走不到。若设计意图含过流/过压类软故障延时自恢复当前实现是死代码。修法二选一A. 明确人工确认语义——保持现状把注释写清楚FAULT 需 STOPCLEAR 才能恢复删除恒真的!protect_fault_active_hw()或在 protect.c 恢复引脚读取后它才有意义B. 增加protect_clear_latch()接口并区分故障类别——对 OVP/OCP/LCC_CHECK 等硬故障保持人工确认对 PRECHARGE_TIMEOUT 等时序类故障允许 tick 内延时自恢复。⚠ 关联风险protect_clear_fault()内if (!protect_fault_active_hw())守卫因 active_hw 恒真而无条件清锁存——将来 protect.c 恢复读引脚后CLEAR 才重新具备硬件故障未解除则拒绝清的语义见保护模块评审 v3。C1 专节 — 完成判据的真实风险v2恒真冗余无害结论修正:349-350if(condition_held(s_qualification,s_voltage_reference_vBATTERY_PRESENT_Vg_adc_multi.vbat_v(s_voltage_reference_v-CHARGE_FINISH_VOLTAGE_MARGIN_V)g_adc_multi.iout_a0g_adc_multi.iout_aCHARGE_FINISH_CURRENT_A,...))iout_a 0adc_raw_to_current()对负值钳 0此条件恒真冗余删不删均可真风险iout_a CHARGE_FINISH_CURRENT_A(1A)。电流通道未标定时NSI1312 V_offset1.65V 是假设值iout_a可能恒 0 或严重偏低 → CV 态进入后 30s 去抖一过就误判充满→FINISHED断输出充电提前终止且无报错。要求接真电池前必须完成电流点校ADC 评审 P1-②联调阶段若标定未完成建议临时把CHARGE_FINISH_CURRENT_A判据旁路或打印 iout 原始值人工确认。N1/P1-A 专节 — CC 进入即闭合输出继电器延后合闸方案:170-175CC 进入同时apply_references llc_enable outputs_on。LLC 刚使能、输出尚未建立就把电池接上靠模拟 IC 的 CC 限流兜底浪涌。建议修法最小改动enter 里只apply_references() llc_enable()把outputs_on()挪到 tick 内输出建起守卫之后caseMAIN_STEP_CC:if(!outputs_closedg_adc_multi.vout_vOUTPUT_RELAY_MIN_V){/* 输出已建立 */outputs_on();outputs_closedtrue;}...outputs_closed随状态 resetenter_state离开 CC 时复位。接真电池前 bench 验证一次浪涌波形二选一接受现状CC 限流兜底或落地延后合闸。三、逐行中文注释当前 370 行v3 重对标记✅亮点 /⚠问题 /确认正确 /v3 新发现。18#includellc_control.h// 本模块接口/枚举/宏19#includeadc_dma.h// g_adc_multi20#includecondition_held.h// 去抖重构condition_qualification_t21//#include can_comm.h // N2CAN 命令改由外部 supervisor API 注入22#includepfc_control.h// pfc_enable/disable/is_ready23#includeprotect.h// protect_set_fault/latched/active_hw24#includepwm_llc.h// cv/cc_pwm_set_duty28#defineBATTERY_PRESENT_V(10.0f)// 电池已接入最低电压29#defineOUTPUT_RELAY_MIN_V(10.0f)// 输出建起门限兼输出启动超时判据30#defineOUTPUT_START_TIMEOUT_MS(1500U)// ✅ C2 已改名32//#define PFC_READY_TIMEOUT_MS (3000U) // ⚠ N3 死注释真实定义 main.h:89建议删35#defineCV_REFERENCE_MAX_V(85.0f)// 80→85注释344/80V与 85 不一致建议重写37#defineCC_REFERENCE_MAX_A(20.0f)// ⚠ 行尾注释OCP30A 超量程过时现 OCP24A 且在量程内55voidllc_enable(void){gpio_bit_reset(...);}// 低有效拉低使能61voidllc_disable(void){gpio_bit_set(...);}// 拉高关断fail-safe 极性// ✅ 极性收口到封装与 main.c:203 初始 llc_disable() 一致75voltage_to_duty()// 电压→占空比钳 [CV_MIN, CV_MAX]90current_to_duty()// 电流→占空比钳 [CC_MIN, CC_MAX]104apply_references()// 开环设定点cv/cc_pwm_set_duty 各一次 ✅121staticvoidoutputs_force_off(void)123llc_disable();// 封装调用拉高关 LLC124cv_pwm_set_duty(PWM_DUTY_SAFE);// ✅ C5 已修125cc_pwm_set_duty(PWM_DUTY_SAFE);126gpio_bit_reset(OUT_RELAY...);// 断输出继电器127pfc_disable();// 断 PFC// ⚠ B1/N-B1同 tick 齐断无先关 LLC→泄放→再断继电器缓冲// ⚠ 函数头注释 :119 C5未复位占空比过时应删130outputs_on()// 闭继电器绿亮红灭146staticvoidenter_state(charger_state_tstate)148同态幂等守卫 ✅152-154切状态/重置计时/condition_qualification_reset ✅ 防跨状态去抖残留158STANDBY:outputs_force_off红亮绿灭165PRECHARGE:pfc_enable()// ✅ C3 已修170CC:apply_referencesllc_enableoutputs_on// ⚠ N1/P1-A 立即合继电器177CV:outputs_on()182FINISHED:outputs_force_off绿亮189FAULT:outputs_force_off红亮// ✅ fail-safe 收敛点216power_supervisor_init()// 清基准/PWM 置初值/enter(STANDBY)236power_supervisor_request(bool)// 外部置使能262power_supervisor_set_references(v,a)264f_clampf(0,CV_REFERENCE_MAX_V)/f_clampf(0,CC_REFERENCE_MAX_A)// 限幅 ✅266apply_references()// 立即下发CC 中在线改 setpoint✅281voidpower_supervisor_tick_1khz(void)284FAULT 顶部收敛 ✅B2 专节见上294switch(g_charger_state):296STANDBY:envbat≥10V → PRECHARGE304PRECHARGE:!en→STANDBY|pfc_is_ready→CC|3s 超时→FAULT_PRECHARGE_TIMEOUT ✅A1// N5pfc 层同款 3s 超时先触发N6故障码无诊断性316CC:!en→STANDBY|8h 超时→FAULT_CHARGE_TIMEOUT ✅B3注释8s过时|vbat≥vref−0.5V 去抖1s→CVC4 用 vbat|vout≤10V 持续到1.5s→FAULT_OUTPUT_START_TIMEOUT ✅C2行尾注释过时337CV:!en→STANDBY|3h 超时→FAULT_CHARGE_TIMEOUT ✅B3注释3s过时|vbat≥vref−0.5Viout∈[0,1A]去抖30s→FINISHED// ⚠ C1 专节iout 未标定时风险357FINISHED:!en→STANDBY365default:→STANDBY// C6 兜底四、补丁建议v3 收敛为两条补丁 AN-B1安全断电时序——最高剩余风险outputs_force_off()改为子状态机立即llc_disable() PWM 置安全 → 延时 20–50ms 或iout_a降阈值 → 断OUT_RELAY→pfc_disable()。模拟架构下 MCU 是停功率的唯一软件路径1.5kW 感性负载下继电器带载分断会拉弧/粘连。补丁 BN6预充故障细分——提高联调诊断效率PRECHARGE 超时分支内按实测值分流elseif(elapsed_reached(s_state_started_ms,PFC_READY_TIMEOUT_MS)){if(g_adc_multi.ac_vol_vPFC_AC_INPUT_MIN_V||g_adc_multi.ac_vol_vPFC_AC_INPUT_MAX_V)protect_set_fault(FAULT_AC_RANGE);/* 建议新增故障码 */elseif(g_adc_multi.bus_vol_vVBUS_OVP_V)protect_set_fault(FAULT_BUS_OVP);elseprotect_set_fault(FAULT_PRECHARGE_TIMEOUT);/* 真超时 */}pfc 层同款超时建议删除保留 llc 层一处即可消除 N5 双层冗余。旧 v2 的补丁 1B1 撤回后不再有 main.c 侧改动已不适用其余 C4/C1/N3 均为小改随版本节奏清理。五、v3 过时注释清单一次清理行现状应改为:32死注释#define PFC_READY_TIMEOUT_MS删除:35注释344/80V与 85.0 不一致写明当前标定依据:37“OCP30A 超量程”OCP 现 24A 且在量程内删除或更新:119函数头C5未复位 CV/CC PWM删除:124-125 已复位:324“8s(调试值)”8hmain.h:104:333“C2名实不符…”已修复删除:345“3s(调试值)”3hmain.h:105六、亮点v3 保留llc_enable/llc_disable极性封装低有效语义收口到两个函数main.c 初始关断、CAL 固件强制关断、状态机全部走封装消除裸 GPIO 极性散布。enter_state同态幂等守卫 一次性动作集中enter 范式落地condition_qualification_reset 防跨状态残留。FAULT 顶部优先收敛fail-safe 到位配合 STOPCLEAR 可恢复待机。PWM 安全复位进 outputs_force_offC5。去抖重构为 condition_qualification_tCC→CV 与完成判据共用、按状态 reset。CAN 与 supervisor 解耦transport-independent API为 CAN 集成阶段留好接口。七、CC/CV 验证分级v2 内容v3 更新数值结论不变状态机结构上必须保留 CC/CV初版联调先跑通 CC 验证 CV 进入钳位FINISHED 可暂缓。数值按 0824 更新OVP94V、OCP24A、CV_REFERENCE_MAX85V。阶段验证目标配置通过标准① 先 CC功率链路/PFC 建压/保护/采样标定输出接 ≥10V 稳压源电子负载吸流母线 ≥360V且 AC∈[180,264]见 ADC 评审 165V 备注、CC 进入、输出建起、串口读数与万用表对上② 再 CV电压钳位 CV 进入判据负载减流让 vout 顶到 v_ref自动切 CV 且钳住无 OVP 误触发③ FINISHED可暂缓充满判定负载电流 ≤1A30s 去抖后 FINISHED 断输出。前置电流点校必须完成C1 专节两条红线不变CC 硬限流进入 CC 时给的是电流参考而非电压参考、CV 进入判据能通否则电压冲到 94V OVP → 假故障循环。v3 总结模块已解决 A1/A2/B3/C2/C3/C5 共 6 项极性封装与状态机骨架健壮。剩余最高风险是 N-B1 断电无缓冲时序接真电池前两个必须项是电流点校C1/ADC P1-②③与 N1 浪涌确认。FAULT 恢复按STOP→CLEAR→自动回 STANDBY语义使用不要期待无人干预自恢复B2 专节。