LTC6813菊花链采样:18S×32从控的工程级实现

发布时间:2026/7/8 2:19:38
LTC6813菊花链采样:18S×32从控的工程级实现 一、引言在动力电池管理系统BMS中单体电压采集是整个系统的核心基础功能。精确、可靠的电压采集不仅关系到SOC估算的准确性更直 接影响到电池的安全保护和使用寿命。本文将深入剖析基于LTC6813的菊花链Daisy-chain采样方案该方案支持最多32个从控芯片 串联实现最多576节32×18S单体电池的同步采集。本文分析的工程代码来自某动力储能BMS项目S32K146OFBMU_B主要文件包括LTC6813驱动层采样状态机常量定义二、LTC6813芯片架构2.1 核心特性LTC6813是ADI原Linear Technology第三代多节电池监控芯片从代码中可以提取其关键参数// LTC6813-1.h#defineLTC6813_NUM_CELLV_ADC18// 18路差分电压测量通道#defineLTC6813_NUM_GPIO9// 9个GPIO用于温度采集#defineLTC6813_VOLTAGE_RESOLUTION100// 电压分辨率100μV/bit (0.1mV)#defineLTC6813_ADC_CLEAR0xFFFF// 未转换时的清零值关键技术指标一览测量范围0V ~ 5V覆盖主流锂电化学体系测量精度总误差 ±1.2mV18路同步采样时间7kHz模式2.335ms2.2 ADC采样模式对比// LTC6813-1.h采样模式枚举typedefenum{LTC6813_CONVERSION_27KHZ_MODE0,// 11.13ms18路LTC6813_CONVERSION_14KHZ_MODE1,// 1.288msLTC6813_CONVERSION_7KHZ_MODE2,// 2.335ms ← 本项目采用LTC6813_CONVERSION_3KHZ_MODE3,// 3.033msLTC6813_CONVERSION_2KHZ_MODE4,// 4.430msLTC6813_CONVERSION_26HZ_MODE5// 202ms低噪声}LTC6813_CONVERSION_MODE_T;本项目选用7kHz模式在速度2.3ms内完成18路和精度噪声低于27kHz模式之间取得良好平衡。2.3 寄存器组织18路电压分6组存储LTC6813将18路测量结果分存于6个寄存器组每组含3路数据6字节数据 2字节PEC RDCVA → Cell 1, 2, 3 RDCVB → Cell 4, 5, 6 RDCVC → Cell 7, 8, 9 RDCVD → Cell 10, 11, 12 RDCVE → Cell 13, 14, 15 RDCVF → Cell 16, 17, 18这一分组结构直接决定了状态机中分批读取State3/4/5的设计。三、双链路冗余设计3.1 硬件拓扑本工程采用双LTC6820隔离器方案两条独立的isoSPI链路互为备份SPI2-------- | | LTC6820-1 LTC6820-2(CS1low) (CS2low) | |链路1 链路2 从控组A从控组B初始化代码直接体现了这一设计CellAFESamp.c: CellLTC6813Init()voidCellLTC6813Init(void){// 模块前端使能DEVGPIOSetPortState(ePOut_LTC6820EN1,ePSTATE_OFF);// LTC6820-1 上电DEVGPIOSetPortState(ePOut_LTC6820EN2,ePSTATE_ON);// LTC6820-2 上电// 片选初始状态链路1有效链路2关闭DEVGPIOSetPortState(ePOut_LTC6820_CS1,ePSTATE_OFF);// CS1有效低电平DEVGPIOSetPortState(ePOut_LTC6820_CS2,ePSTATE_ON);// CS2无效高电平// ...}3.2 菊花链通信机制驱动层通过CS控制实现链路选通LTC6813-1.cstaticvoidLTC6813CSLOW(void){DEVGPIOSetPortState(ePOut_LTC6820_CS1,ePSTATE_OFF);// 拉低CS1选通链路1DEVGPIOSetPortState(ePOut_LTC6820_CS2,ePSTATE_ON);// 关闭链路2}菊花链数据传输方式主控广播命令后数据沿链路逐级中继读取时从末端芯片反向传回因此从控数量越多传输延时越大见第五节详述。四、采样状态机详解12状态4.1 状态转移全图CellInfoSampleTask()是一个无限循环的RTOS 任务通过 sState 变量驱动如下状态机 └──(无需停均衡)──→ State 2: 直接清零ADC ↓ State 2: 启动ADC7kHz, 全18路, 广播 ↓ 等待20ms State 3: ReadABCell 1~6 ↓ 等待 N×5ms State 4: ReadCDCell 7~12 ↓ 等待 N×5ms State 5: ReadEFCell 13~18 ↓ 等待 N×5ms State 6: 校验 补偿 写入电压 ↓ State 7: 清零 GPIO ADC ↓ State 8: 启动 GPIO ADC温度 ↓ State 9: 读取 GPIO ADC ↓ 等待 N×5ms State 10: 处理温度值 ↓ State 12: 更新均衡控制 ↓ State 0循环4.2 各状态源码解析State 0均衡判断入口// CellAFESamp.c:498case0:UpdateCellBalanReqInfo();// 从均衡模块拉取最新需求if(TRUECheckNeedStopBalanSamp()){ClrCellPasBalanCtrlCmd();LTC6813PasEqual(sLTC6813PasBalanCmd,bsuNum);// 强制关闭全部均衡sLTC6813PasBalanCtrlState0;sState1;}else{LTC6813_Cell_ADC_Clear(LTC6813_BROADCAST);// 直接清零sState2;}OSIF_TimeDelay(10);break;State 2启动ADC转换// CellAFESamp.c:527case2:LTC6813_Cell_ADC_Start(LTC6813_BROADCAST,// 广播到所有从控同步触发LTC6813_CONVERSION_7KHZ_MODE,// 7kHzLTC6813_CH_ALL,// 全部18路FALSE// 采样期间禁止均衡放电);OSIF_TimeDelay(20);// 需等待3.9ms取20ms留余量sState3;break;底层构建ADCV命令LTC6813-1.c:594command_codeLTC6813_COMMAND_CODE_ADCV(address,md,LTC6813_DCP_DISCHARGE_NOT_PERMITTED,cell_select);ltc6813_command_code_send(command_code,FALSE);State 3/4/5三段式读取// CellAFESamp.c:534-560case3:// 读寄存器A/BCell 1~6results_errorLTC6813_Cell_ADC_ReadAB(LTC6813_CH_ALL,sLTC6813CellVoltAD,bsuNum);OSIF_TimeDelay(bsuNum*LTC_RD_AD_T);// N × 5mssState4;break;case4:// 读寄存器C/DCell 7~12results_error|LTC6813_Cell_ADC_ReadCD(LTC6813_CH_ALL,sLTC6813CellVoltAD,bsuNum);OSIF_TimeDelay(bsuNum*LTC_RD_AD_T);sState5;break;case5:// 读寄存器E/FCell 13~18results_error|LTC6813_Cell_ADC_ReadEF(LTC6813_CH_ALL,sLTC6813CellVoltAD,bsuNum);OSIF_TimeDelay(bsuNum*LTC_RD_AD_T);sState6;break;五、ADC读取批次策略深度分析5.1 为何要分批而非一次性读完菊花链延时累积是根本原因。以LTC6813_Cell_ADC_ReadAB()实现为例// LTC6813-1.c:718BOOLEANLTC6813_Cell_ADC_ReadAB(...,u8 IC_num){for(reg_count0;reg_count2;reg_count)// 读A、B两组{ltc6813_wakeup();command_codeLTC6813_COMMAND_CODE_RDCVA(address)(reg_count*0x0002);ltc6813_command_code_send(command_code,TRUE);successLTC6813REGGROUPREAD(cv_r,IC_num);// 收取所有从控的数据for(current_ic0;current_icIC_num;current_ic){for(i0;i3;i){// 每路电压数据 2字节小端合并parsed_cell(u16)cv_r[data_counter]((u16)cv_r[data_counter1]8);adc_value_ptr[current_ic][i(reg_count*3)]parsed_cell;data_counter2;}data_counter2;// 跳过本从控的PEC}}}当IC_num 32 时一次读取返回的原始字节数为32个从控 × (6字节数据 2字节PEC) 256字节通过LTC6813REGGROUPREAD()的实现可看到// LTC6813-1.c:2100staticBOOLEANLTC6813REGGROUPREAD(u8*adcdata,u8 Ic_num){for(i0;iIc_num*8;i)// 每个从控8字节6数据2PEC{BSPSPISendData(eSPI2,0xff);// 发送哑字节触发时钟while(BSPSPIGetWorkState(eSPI2));adcdata[i]BSPSPIGetRcvData(eSPI2);delay(10);// 每字节后延时保证数据稳定}// PEC校验仅校验第一个从控// ...}延时参数设计#defineLTC_RD_AD_T5// 每个从控所需读取延时5ms// 32片从控情景下32 × 5ms 160ms 总延时// 分3批次每批约 32×5ms 160ms总读取时间约 3×160ms 480ms含启动等待5.2 错误累积策略results_errorLTC6813_Cell_ADC_ReadAB(...);// 初始赋值results_error|LTC6813_Cell_ADC_ReadCD(...);// 或操作累积results_error|LTC6813_Cell_ADC_ReadEF(...);// 任一失败则全失败使用 | 的好处任意一批次读取失败results_error 就变为 FALSEState 6 统一处理重试避免部分有效数据与部分无效数据混用。六、电池位置补偿硬件寄生电阻补偿6.1 误差根源PCB走线、均衡电阻、连接器在采集回路中形成寄生阻抗电池 ()─ [均衡电阻] ─ [走线R1] ─ LTC6813 CxP┐ ├ ADC电池 (-) ──────────── [走线R2] ─ LTC6813 CxN ┘通过测量标定各位置的系统误差呈现规律性差异首节电池串联最高电位误差最大末节电池靠近参考地次之中间节误差最小6.2 补偿常量CellAFESamp.h:36-38#defineCELF_COMP_VOLT38// 首节补偿量38 × 0.1mV 3.8mV#defineCELM_COMP_VOLT23// 中间节补偿量23 × 0.1mV 2.3mV#defineCELE_COMP_VOLT25// 末节补偿量25 × 0.1mV 2.5mV6.3 补偿逻辑CellAFESamp.c:641-662// 仅在以下条件下补偿// 1. 非调试模式且 2. 该节电池无均衡 OR 均衡功能未激活if((eMODE_DEBUGGetGWorkModeAPI())||(0sLTC6813PasBalanCtrlState)||(0(sLTC6813PasBalanCmd[cell_Ic](0X00001cell_Id)))){if(sLTC6813CellVoltAD[cell_Ic][cell_Id]10000)// 仅1V时补偿{if(0cell_num)// 首节sLTC6813CellVoltAD[cell_Ic][cell_Id]CELF_COMP_VOLT;elseif((bsuVNum-1)cell_num)// 末节sLTC6813CellVoltAD[cell_Ic][cell_Id]CELE_COMP_VOLT;else// 中间节sLTC6813CellVoltAD[cell_Ic][cell_Id]CELM_COMP_VOLT;}WriteSampCellVoltHook(cell_Ic,cell_num,sLTC6813CellVoltAD[cell_Ic][cell_Id]/10);}几处工程细节 10000 门限低于1V说明断线或短路补偿量无意义不处理均衡期间跳过补偿均衡导通后分压网络发生变化固定补偿量不再适用写入前除以10ADC单位 0.1mV → 最终单位 1mV七、14S特殊处理CATL/标准PACK7.1 为何第8通道需要跳过在CATL 240AH和标准PACK14S配置中LTC6813的第8路通道cell_Id 7被连接到内部二次参考电压2nd Ref不对应实际电池。直接读取会得到一个固定的参考电压值而非电池电压必须在软件层过滤。7.2 条件编译实现CellAFESamp.c:572-619// 产品类型选择#if((2PRJ_PARA_NUM_INFO)||(3PRJ_PARA_NUM_INFO))anaVNum15;// 遍历15个通道0~14其中7跳过实际14个电池#elseanaVNumbsuVNum;// 使用参数配置的通道数#endif// 通道到电池编号的映射#if((2PRJ_PARA_NUM_INFO)||(3PRJ_PARA_NUM_INFO)){if(cell_Id7)cell_numcell_Id;// 通道 0~6 → 电池 0~6elseif(cell_Id7)cell_numcell_Id-1;// 通道 8~14 → 电池 7~13elsecontinue;// cell_Id 7跳过参考电压通道}7.3 通道映射可视化物理通道 C1 C2 C3 C4 C5 C6 C7 [C8] C9 C10 C11 C12 C13 C14 C15 电池编号 B1 B2 B3 B4 B5 B6 B7 [Ref] B8 B9 B10 B11 B12 B13 B14 软件索引 0 1 2 3 4 5 6 (skip) 7 8 9 10 11 12 13八、采样异常处理机制8.1 多层次防护设计层次1 │ PEC-15校验 → 通信层单bit错误检测每寄存器组层次2 │ ADC值范围校验 → 数据层有效性检测 60000 6V层次3 │ noVSampCounter≥20 → 持续故障确认~2秒层次4 │ DiagRecordAFESamp → 上报诊断触发保护策略8.2 noVSampCounter连续失效计数器// CellAFESamp.c:602-686if(sLTC6813CellVoltAD[cell_Ic][cell_Id]60000)// 正常值{DiagRecordAFESampErrFlagAPI(cell_Ic,0);// 清除错误标志noVSampCounter[cell_Ic]0;// 清零计数器// ...正常处理...}else// ADC值异常6V为明显异常{noVSampCounter[cell_Ic];if(noVSampCounter[cell_Ic]20)// 连续20次才认定故障{DiagRecordAFESampErrFlagAPI(cell_Ic,1);// 上报故障noVSampCounter[cell_Ic]20;// 上限钳位防溢出ClrAfeSampCellVolt(cell_Ic);// 电压置零}else{CellLTC6813Init();// 未达阈值重新初始化尝试恢复}break;}20次阈值的工程意义采样周期约100ms20次约2秒覆盖 EMC瞬态干扰通常 100ms覆盖均衡状态切换引起的瞬态通常 500ms避免偶发的 SPI 通信扰动误触发故障报警8.3 全为0时置Clr触发上层诊断staticvoidClrAfeSampCellVolt(u8 ic_Num){u8 i;for(i0;iMAXVOLTNUM;i)WriteSampCellVoltHook(ic_Num,i,0);// 写0通知上层无数据WriteVSampFinFlag(0);// 清除采样完成标志}置零的含义是主动通知上层本从控采样无效而不是保留旧值旧值可能触发误保护上层看到某节电压 0触发 采样异常诊断上层清除 SOC 更新标志避免使用无效数据计算保护算法在 采样异常 状态下采用容错策略如使用其他链路数据8.4 PEC校验失败后的处理// CellAFESamp.c:713-732else// results_error FALSE → PEC失败{// 通过诊断滤波确认是持续故障if(eErr_BDiagGetErrFilStateAPI(eERR_ID_INT_COFF)){for(cell_Ic0;cell_IcbsuNum;cell_Ic)ClrAfeSampVoltTemp(cell_Ic);// 清零全部电压和温度}CellLTC6813Init();// 重新初始化芯片和链路sState0;OSIF_TimeDelay(1);// 1ms后立即重试}CellLTC6813Init() 并非软件复位而是对LTC6813 寄存器组的完整重写覆盖了 OV/UV阈值、GPIO配置、均衡通道等关键参数用于恢复芯片因EMC 或供电扰动丢失的配置。九、State 12均衡控制更新// CellAFESamp.c:899case12:UpdateCellBalanReqInfo();// 获取均衡需求if(sLTC6813PasBalanReqState0)// 有需求{LTC6813PasEqual(sLTC6813PasBalanCmd,bsuNum);sLTC6813PasBalanCtrlState1;OSIF_TimeDelay(50);// 均衡开启保持时间}else// 无需求{if(sLTC6813PasBalanCtrlState0)LTC6813PasEqual(sLTC6813PasBalanCmd,bsuNum);// 关闭均衡sLTC6813PasBalanCtrlState0;OSIF_TimeDelay(2);}sState0;break;均衡命令通过32位位图编码sLTC6813PasBalanCmd[]写入配置寄存器A/B实现逐节控制// LTC6813PasEqualCellAFESamp.c:949data[cell_ic][4](u8)(commande[cell_ic]0x00ff);// Cell1~8data[cell_ic][5](u8)((commande[cell_ic]0x0f00)8);// Cell 9~12data[cell_ic][0](u8)((commande[cell_ic]0xf000)8)|LTC_GPIO_CT_AD_BIT;// Cell 13~16data[cell_ic][1](u8)(commande[cell_ic]16)0x03;// Cell 17~18十、工程实践总结关键设计决策回顾┌───────────┬──────────────────────┬─────────────────────────┐ │ 设计点 │ 选择 │ 理由 │ ├───────────┼──────────────────────┼─────────────────────────┤ │ ADC模式 │ 7kHz │ 速度与精度平衡 │ ├───────────┼──────────────────────┼─────────────────────────┤ │ 读取策略 │ 三批次分批 │ 规避菊花链延迟累积 │ ├───────────┼──────────────────────┼─────────────────────────┤ │ 故障阈值 │ 20次连续异常 │ 滤除瞬态约2秒确认窗口 │ ├───────────┼──────────────────────┼─────────────────────────┤ │ 位置补偿 │ 固定偏置 │ 出厂标定后固化 │ ├───────────┼──────────────────────┼─────────────────────────┤ │ 均衡-采样 │ 采样时停均衡 │ 避免分压扰动 │ ├───────────┼──────────────────────┼─────────────────────────┤ │ 双链路 │ 硬件预留软件待完善 │ 为冗余设计留空间 │ └───────────┴──────────────────────┴─────────────────────────┘代码分层架构CellAFESamp.c ← 业务层状态机、补偿、异常处理 ↓↑ LTC6813-1.c ← 驱动层ADC启停、寄存器读写、PEC ↓↑ BSPSPI.c ← HAL层SPI字节收发 ↓↑ S32K146SPI2← 硬件层清晰的分层设计使得更换主控芯片时只需修改HAL层更换AFE芯片时只需清晰的分层设计使得更换主控芯片时只需修改HAL层更换AFE芯片时只需修改驱动层业务逻辑零改动。十一、结语LTC6813菊花链采样方案以其高精度、高可靠性和可扩展性成为大型锂电储能和电动汽车动力电池管理的主流AFE方案之一。本文所分析的工程代码展示了将芯片手册规格转化为可靠量产代码所需关注的多个层面时序精准性菊花链每增加一个从控读取延时增加5msbsuNum × LTC_RD_AD_T状态机的等待时间必须随从控数量动态伸缩而非使用固定延时。状态机健壮性12个状态覆盖了正常采样、均衡协调、ADC清零与故障恢复的全部场景results_error 的|累积策略确保任一环节失败均触发整体重试。物理误差补偿PCB寄生阻抗导致的系统偏差因电池所处串联位置不同而呈现差异首节3.8mV、中间节2.3mV和末节2.5mV的差异化补偿是工厂标定的工程成果直接固化在宏定义中CellAFESamp.h:36-38。异常处理的克制设计noVSampCounter 20 的2秒确认窗口既能过滤EMC瞬态又不会因过长的响应时间导致故障数据被上层长期使用置零而非保留旧值的清零策略确保上层SOC和保护算法始终以无数据而非错误数据作为故障输入。产品族兼容通过 PRJ_PARA_NUM_INFO编译开关同一套代码支持14SCATL标准PACK和18S通用两种电池配置第8通道的跳过逻辑是软件层对硬件约束的明确映射。这些细节在LTC6813的数据手册中没有现成答案正是一次次调试、标定和问题排查的工程积累。希望本文的代码级剖析能为从事BMS嵌入式开发的工程师提供可借鉴的实践参考。