资讯动态

直流充电桩自动测试系统设计:程控负载替代真实电池的GB/T 27930方案

发布时间:2026/10/21 15:00:18 来源:尧图企业网站定制
简介这份PDF文献面向新能源汽车充电设施研发人员、电气工程专业学生及充电桩测试工程师系统讲解电动汽车直流充电桩自动测试系统的设计与应用可帮助读者理解充电桩测试系统的整体架构与实现路径。资源包共1个PDF文件约2.43MB内容为期刊技术论文适合作为课题参考与工程实践指导。文献从总体设计思路切入围绕功能完备、以人为本、安全优先与人机交互友好四项原则展开随后深入硬件设计涵盖STM32F103VE最小系统、CAN总线、输出主电源控制、充电枪CC1接口及状态量输入输出电路等底层控制板构成并给出软件设计中的充电模式设置、充电管理与交互模块思路。目前已有115人学习适合需要搭建充电桩测试方案、梳理CAN通信与BMS交互逻辑的读者参考借鉴。1. 拆开一份直流充电桩自动测试系统设计文档它到底能帮你解决什么如果你正在做充电桩产线测试、送检预测试或者要给自家桩做一套离线老化检测台那这份《电动汽车直流充电桩自动测试系统设计和应用》的 PDF 大概率能省掉你从零搭框架的时间。它不讲虚的核心就一件事用程控负载替代真实动力电池配合模拟 BMS 和 CAN 通信把充电桩的电压、电流、通信时序、控制导引逻辑全部跑一遍。适合三类人做充电桩出厂检测的测试工程师、搞充电设施现场运维的技术员、以及需要按 GB/T 27930 做协议一致性验证的嵌入式开发者。我翻完的第一感觉是它把“为什么不用真车电池测”这个坑讲透了——真电池工作点难调、测试周期长程控负载才是产线节拍下能落地的方案。2. 总体设计思路为什么用程控负载替代真实动力电池2.1 测试对象与核心矛盾直流充电桩自动测试系统要测的不是桩本身能不能输出而是它在与 BMS 交互过程中电压电流参数是否准确、通信时序是否合规、保护逻辑是否及时。GB/T 27930 规定充电桩和 BMS 之间必须先完成若干轮 CAN 信息交换才能启动功率输出。这意味着测试系统必须能模拟一个“听话的 BMS”按协议发出电池电压需求、电流需求、充电准备就绪等报文同时实时采集桩侧的电压电流反馈。矛盾点在于如果用真实动力电池当负载电池的充电特性会随 SOC 变化工作点漂移严重想测 500V/100A 这个点电池可能只给你 480V/80A调起来费时费力。而且真电池充放电循环寿命有限产线上一天几十次充放电池很快就废了。程控负载的好处是工作点任意设定电压电流独立可调响应快还能模拟短路、过载等异常工况。2.2 系统组成与信号流整个测试系统按功能拆成三块底层控制板、功率与负载回路、上位机测控软件。底层控制板是核心枢纽负责 CAN 通信、状态量采集、D/A 输出主电源控制信号、A/D 采集充电桩输出电压电流。功率回路里交流输入经过断路器、保险丝、过压保护器、交流接触器后一部分给充电桩供电另一部分给控制板和人机交互模块供电。负载侧用可编程电子负载通过继电器控制卡切换不同阻值组合模拟各种负载条件。信号流是这样的上位机下发测试用例 → 底层控制板通过 CAN 向充电桩发送模拟 BMS 报文 → 充电桩响应并输出功率 → 电子负载吸收功率 → 控制板通过 A/D 采集实际电压电流 → 数据回传上位机 → 软件判断是否合格并生成报表。这个闭环里CAN 通信的实时性和 A/D 采样的精度直接决定测试结果可不可信。2.3 关键选型理由底层控制板选 STM32F103VE看中的是外设够用3 个 SPI、2 个 I2C、5 个 USART、11 个定时器还有 D/A 和 A/D 转换器。CAN 总线用 ISO1050 隔离芯片绝缘栅是氧化硅隔离电压 2500V符合 ISO11898-2 标准寿命标称 25 年。输出主电源控制用两个独立 12 位 D/A 转换器分别控制最大输出电压和电流中间加线性光耦隔离防止主电源端的电磁干扰串到控制电路。充电枪 CC1 接口按 GB/T 18487.1-2015 附录 B 设计CC1 触点电压范围 3.2V 到 12.8V先分压再运放放大两倍送进 STM32 的 A/D 引脚判断连接状态。状态量输入电路负责采集急停开关、锁止装置等开关反馈信号状态量输出电路则驱动锁止装置和隔离电源。这些细节在文档里都有电路框图照着搭不会跑偏。提示如果你手头没有 ISO1050常见做法是用 TJA1050 加光耦做隔离但隔离电压和一致性会差一些送检项目建议还是按原文方案走。3. 硬件落地从 STM32F103VE 最小系统到 CC1 接口电路3.1 底层控制板硬件框架底层控制板是整个测试系统的执行单元硬件上分六个模块STM32F103VE 最小系统、CAN 总线收发、输出主电源控制、充电枪 CC1 接口、状态量输入电路、状态量输出电路。最小系统包括电源电路、8MHz 晶振、复位电路和 JTAG 接口。电源部分要注意STM32 是 3.3V 供电但充电桩侧的状态量可能是 12V 或 24V所以状态量输入电路里必须加光耦隔离和分压电阻不能直接怼进 GPIO。CAN 总线部分ISO1050 的 TXD 和 RXD 分别接 STM32 的 CAN_TX 和 CAN_RXCANH 和 CANL 之间并 120Ω 终端电阻。如果测试线缆较长终端电阻不能省否则波形反射会导致通信误码。输出主电源控制部分D/A 转换器输出 0-5V 或 0-10V 信号经过线性光耦隔离后去控制充电桩的功率模块。这里要注意 D/A 的参考电压稳定性建议用外部基准源不要用 MCU 的 VDDA 直接当参考否则输出漂移会让你调半天。3.2 CC1 接口与状态量电路CC1 接口电路是判断充电枪是否可靠连接的关键。按国标要求CC1 触点电压在 3.2V 到 12.8V 之间对应不同的连接状态。电路设计上先用电阻分压把 12.8V 降到 A/D 能接受的范围再通过运放放大两倍提高分辨率。运放选轨到轨的比如 LM358 在单电源下也能用但精度要求高的话建议用 OPA2340。状态量输入电路采集急停按钮、门禁开关、锁止反馈等信号。这些信号通常是干接点或 12V 电平干接点需要加去抖电路12V 电平需要光耦隔离。状态量输出电路驱动锁止装置和指示灯STM32 的 GPIO 驱动能力有限一般加 ULN2003 达林顿管或继电器模块。这里有个血泪经验锁止装置是感性负载断电瞬间会产生反向电动势必须在两端反并一个续流二极管否则用不了多久 GPIO 就被打穿。// STM32F103VE CC1 电压采集与状态判断示例 // 假设使用 ADC1_IN0 采集 CC1 分压后的电压 #define CC1_ADC_CHANNEL 0 #define VOLTAGE_DIVIDER_RATIO 2.0f // 分压比根据实际电阻计算 #define OPAMP_GAIN 2.0f // 运放放大倍数 float read_cc1_voltage(void) { uint16_t adc_raw adc_read(CC1_ADC_CHANNEL); // ADC 12位参考电压 3.3V float adc_voltage (adc_raw / 4095.0f) * 3.3f; // 反推 CC1 实际电压先除以运放增益再乘以分压比 float cc1_voltage (adc_voltage / OPAMP_GAIN) * VOLTAGE_DIVIDER_RATIO; return cc1_voltage; } // 根据 CC1 电压判断连接状态 typedef enum { CC1_DISCONNECTED, // 3.2V CC1_CONNECTED, // 3.2V ~ 12.8V CC1_FAULT // 12.8V 或异常 } cc1_state_t; cc1_state_t get_cc1_state(void) { float v read_cc1_voltage(); if (v 3.2f) return CC1_DISCONNECTED; if (v 12.8f) return CC1_FAULT; return CC1_CONNECTED; }上面代码里VOLTAGE_DIVIDER_RATIO和OPAMP_GAIN必须按实际电路参数改不能照抄。adc_read是假设的底层读取函数实际用 HAL 库的话就是HAL_ADC_GetValue。判断阈值 3.2V 和 12.8V 来自国标不要自己改。如果读出来的电压一直在跳先查分压电阻是不是用了 5% 精度的换成 1% 的会稳很多。3.3 电源与保护设计充电桩测试系统的电源部分不能省保护。交流输入进来先过断路器再经过保险丝和过压保护器然后进交流接触器。接触器由控制板通过状态量输出电路驱动急停按钮直接串在接触器线圈回路里拍下去就断电。直流输出侧要有短路保护和过载保护常见做法是用霍尔电流传感器加比较器一旦超过设定阈值就拉低 D/A 输出并断开接触器。注意调试时不要一上来就接充电桩先用电阻负载模拟确认控制板能正常采集电压电流、CAN 能正常收发再上真桩。否则参数设错可能直接炸机。4. 软件设计模拟 BMS 报文与充电流程状态机4.1 软件总体流程软件启动后先做模块初始化CAN 控制器、ADC、DAC、定时器、触摸屏。然后进入主循环等待用户选择是否接入充电桩。用户确认接入后系统开始发送模拟 BMS 握手报文充电桩收到后回应双方完成握手识别。接着用户选择充电模式并设置工作点比如恒压 500V、恒流 100A。系统发出充电指令进入充电控制和参数检测阶段。如果检测到充电结束条件满足终止充电并输出报表否则返回工作点设置步骤继续测。这个流程里状态机是核心。每个状态都有超时判断比如握手阶段 5 秒内没收到充电桩回应就报通信故障并退回。充电阶段如果电压电流超出设定范围 ±5%记录异常并继续观察连续 3 次超差就终止测试。4.2 CAN 报文模拟与解析模拟 BMS 报文要按 GB/T 27930 的格式来。常见报文包括 BMS 握手报文、BMS 充电参数报文、BMS 充电需求报文、BMS 充电状态报文。每个报文有固定的 CAN ID 和数据长度数据段里包含电压需求、电流需求、SOC、充电允许标志等。// 模拟 BMS 发送充电需求报文简化示例 // CAN ID 和数据结构参考 GB/T 27930实际使用需按标准填写 typedef struct { uint16_t voltage_demand; // 电压需求单位 0.1V uint16_t current_demand; // 电流需求单位 0.1A uint8_t charge_enable; // 充电允许标志 uint8_t soc; // 剩余电量百分比 } bms_charge_demand_t; void send_bms_charge_demand(uint16_t voltage, uint16_t current) { bms_charge_demand_t demand; demand.voltage_demand voltage * 10; // 转成 0.1V 单位 demand.current_demand current * 10; // 转成 0.1A 单位 demand.charge_enable 1; demand.soc 50; // 模拟 50% SOC uint8_t data[8]; data[0] demand.voltage_demand 0xFF; data[1] (demand.voltage_demand 8) 0xFF; data[2] demand.current_demand 0xFF; data[3] (demand.current_demand 8) 0xFF; data[4] demand.charge_enable; data[5] demand.soc; data[6] 0x00; data[7] 0x00; can_send_frame(0x1806F456, data, 8); // CAN ID 按标准填写 }这段代码里can_send_frame是假设的底层发送函数实际用 HAL 库就是HAL_CAN_AddTxMessage。CAN ID0x1806F456是示例具体按 GB/T 27930 里的定义来不同报文 ID 不同。电压电流单位是 0.1V 和 0.1A发之前要乘 10收的时候要除 10这个换算错了数据会差十倍。charge_enable置 1 表示允许充电置 0 表示禁止测试保护逻辑时就靠这个标志触发。4.3 数据采集与报表生成数据采集模块要实时记录充电桩输出的电压、电流、功率以及 CAN 报文的时间戳。采样率一般 10Hz 到 100Hz 可调产线测试 10Hz 够用研发调试建议 100Hz。采集到的数据存成 CSV 或 Excel报表里至少包含测试时间、工作点设定值、实测电压电流、误差百分比、通信超时次数、保护动作记录。# 上位机数据采集与报表生成示例Python pandas import pandas as pd import time class ChargerTestRecorder: def __init__(self, set_voltage, set_current): self.set_voltage set_voltage self.set_current set_current self.records [] def record(self, meas_voltage, meas_current, can_timeout): self.records.append({ timestamp: time.strftime(%Y-%m-%d %H:%M:%S), set_voltage: self.set_voltage, set_current: self.set_current, meas_voltage: meas_voltage, meas_current: meas_current, voltage_error_pct: abs(meas_voltage - self.set_voltage) / self.set_voltage * 100, current_error_pct: abs(meas_current - self.set_current) / self.set_current * 100, can_timeout: can_timeout }) def export_report(self, filename): df pd.DataFrame(self.records) df.to_excel(filename, indexFalse) print(f报表已生成{filename}共 {len(df)} 条记录)这个类里record方法每采集一次就追加一条记录voltage_error_pct和current_error_pct直接算误差百分比超过 5% 的后面可以筛出来重点看。export_report用 pandas 写 Excel产线环境如果没装 pandas用 csv 模块也能写就是麻烦点。can_timeout字段记录通信超时次数如果这个值一直涨说明 CAN 线接触不良或充电桩响应慢得先排查硬件。5. 避坑与排查调试台上最容易翻车的五个点5.1 CAN 通信不上先查终端电阻和波特率现象控制板发报文充电桩没反应示波器看 CANH 和 CANL 波形幅值正常但无应答。 原因CAN 总线两端没有 120Ω 终端电阻或者波特率设错。GB/T 27930 规定直流充电 CAN 波特率是 250kbps不是 500kbps。 解决在总线两端各并一个 120Ω 电阻用示波器测 CANH 对地电压应在 2.5V 左右CANH 和 CANL 差分电压在 2V 左右。波特率在初始化代码里改成 250kbps分频参数按 MCU 主频算。5.2 CC1 电压读不准分压电阻精度不够现象CC1 电压读数跳动大明明枪插好了却报未连接。 原因分压电阻用了 5% 精度的碳膜电阻温漂大A/D 参考电压不稳。 解决换 1% 精度金属膜电阻A/D 参考电压用外部基准源如 REF3033软件里加滑动平均滤波连续读 10 次取中间值。5.3 D/A 输出漂移充电桩功率不受控现象设定输出 500V实际充电桩只输出 480V 且缓慢下降。 原因D/A 参考电压用了 MCU 的 VDDAMCU 发热后 VDDA 漂移导致 D/A 输出跟着漂。 解决D/A 芯片用外部基准源或者选内置基准的 D/A 芯片。软件里加闭环校正用 A/D 采集实际输出电压和设定值比较后微调 D/A 输出。5.4 状态量输入误触发急停按钮一碰就报故障现象手碰到急停按钮外壳系统就报急停触发。 原因状态量输入电路没有去抖或者光耦输入端限流电阻太小灵敏度太高。 解决软件里加 20ms 去抖硬件上在光耦输入端并 100nF 电容限流电阻按光耦 CTR 算一般 1kΩ 到 4.7kΩ。5.5 充电流程卡在握手阶段超时后不重试现象充电桩一直不回应握手报文软件超时后直接报错退出不重发。 原因状态机里超时处理只做了报错没做重试。实际充电桩上电后可能需要几百毫秒初始化第一帧报文丢了很正常。 解决握手阶段超时后自动重发 3 次间隔 200ms3 次都失败再报错。充电阶段同理单次超时不终止连续 3 次超时才终止。提示调试时把 CAN 分析仪接上一边看控制板发的报文一边看充电桩回的报文对比时间戳和内容比盲猜快得多。6. 进阶技巧用脚本自动化跑完整测试序列6.1 测试序列脚本化手动一条条设工作点太慢产线上一天测几十台桩必须脚本化。思路是把测试用例写成 CSV每行一个工作点电压、电流、持续时间、允许误差。上位机读 CSV逐行下发设定值采集数据判断合格写报表。# 自动化测试序列执行示例 import csv import time def run_test_sequence(csv_file, recorder, can_interface): with open(csv_file, r) as f: reader csv.DictReader(f) for row in reader: voltage float(row[voltage]) current float(row[current]) duration float(row[duration_s]) tolerance float(row[tolerance_pct]) # 下发设定值 can_interface.set_work_point(voltage, current) recorder.set_voltage voltage recorder.set_current current # 持续采集 start time.time() while time.time() - start duration: meas_v, meas_i, timeout can_interface.read_measurements() recorder.record(meas_v, meas_i, timeout) time.sleep(0.1) # 10Hz 采样 # 判断合格 last recorder.records[-1] if last[voltage_error_pct] tolerance or last[current_error_pct] tolerance: print(f工作点 {voltage}V/{current}A 超差请检查) else: print(f工作点 {voltage}V/{current}A 合格) recorder.export_report(test_report.xlsx)这个脚本里csv_file格式自己定列名对应上就行。can_interface是封装好的 CAN 通信类set_work_point发报文read_measurements读采集值。time.sleep(0.1)控制采样率 10Hz要更高就改小。超差判断只看最后一条记录严格点可以看整个持续时间的最大值。6.2 验证测试系统自身精度的方法测试系统本身准不准得先验证。常见做法是拿一个高精度可编程直流源当“标准桩”输出已知电压电流用测试系统去测看误差多大。如果误差超过 0.5%先校准 A/D 和 D/A再查分压电阻和运放增益。校准可以用两点法输出 0V 和满量程记录 A/D 读数算线性和增益写进校准系数。校准点标准源输出测试系统读数误差校准系数零点0V0.02V0.02V偏移 -0.02V满点500V498.5V-0.3%增益 1.003校准系数存到 EEPROM 里每次上电加载。温度变化大的环境建议每隔 3 个月重新校准一次。6.3 一个习惯从那以后我每次搭测试台都强制先跑一遍“空载校准 标准源验证”确认采集链路没问题再接充电桩。这个习惯帮我省了至少三次炸机返修。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑