本帖最后由 xiaodaishu 于 2026-10-14 22:06 编辑
用AI让全民进入单片机工程师,太刺激了!就是不知道是不是一本正经的胡说八道。
问:利用N76E003AT20严格按照国标流程生成新能源充电桩充电控制代码,要求车辆正确连接后闭合继电器开始充电,代码中包含注释
接下来AI开始一本正经的贴心回答了。
基于 N76E003AT20 的 GB/T 18487.1 交流充电桩控制代码交流充电桩的控制导引流程严格遵循 GB/T 18487.1 定义的状态机模型。N76E003AT20 内置 12位 ADC(8通道),使其能够直接对 CP 检测点 1 的电压进行采样,通过软件判断状态迁移,无需外接比较器。这是相比 STC15F104W 的核心优势。 国标充电流程(状态 2 → 状态 3)根据 GB/T 18487.1—2023,供电设备侧的关键状态迁移如下: 状态 2(车辆已连接,PWM 输出):CP 电压为 9V(车辆未闭合 S2)。供电设备检测点 1 电压 = 9V,说明车辆已通过 CC 电阻确认连接,但尚未准备就绪。 状态 2 → 状态 3(车辆准备就绪):车辆控制装置闭合 S2 开关,R2 电阻并联接入,检测点 1 电压被拉低至 6V。供电设备检测到 6V 后,应在 3 秒内闭合交流供电回路(继电器 K1/K2)。 充电中(状态 3'):PWM 持续输出,供电设备检测点 1 保持 6V 状态,能量传输开始。 停止充电:车辆断开 S2 或供电设备切换 PWM 至 +12V 电平后,检测点 1 回到 9V 或 12V,供电设备在 100ms 内断开继电器。 硬件引脚分配
电压映射说明:CP 信号在 +12V / +9V / +6V 之间切换。分压电路建议将 +12V 映射至约 4.0V ADC 满量程附近,对应 ADC 值约 3276(12位);+9V 约 2458;+6V 约 1638。具体分压电阻值需根据实际硬件调整。 完整代码
关键设计说明ADC 采样与状态判断:代码通过 ADC 读取检测点 1 电压,依据 GB/T 18487.1 定义的状态电压进行阈值判断。9V 对应状态 2(车辆已连接但未就绪),6V 对应状态 3(车辆已闭合 S2,准备就绪)。每个状态判断都加入了持续确认计数(conn_cnt、s2_cnt),避免电压抖动导致继电器误动作。 继电器闭合时序:国标要求供电设备在检测到 6V(车辆准备就绪)后 3 秒内闭合交流回路。代码中 s2_cnt >= 100 对应约 150ms 的确认延时,远小于 3 秒限制,同时提供了足够的抗干扰能力。 断开保护的实时性:能量传输阶段若 CP 电压异常(如断路或车辆拔出),代码在主循环中以约 5ms 周期检测,确保能在 100ms 内断开继电器,满足国标对故障断开时间的要求。 PWM 占空比与电流:N76E003 的硬件 PWM 模块输出稳定,占空比公式遵循 I = Duty% × 0.6。例如默认 6A 对应约 10% 占空比。实际部署时,需根据充电桩额定功率通过 Set_Charging_Current() 设置合适值。 硬件设计要点:CP 信号为 ±12V,必须经精密分压电路后送入 ADC。建议使用高精度电阻(1% 或更好),并在 ADC 输入端加 RC 低通滤波(如 10kΩ + 100nF)抑制 PWM 纹波对采样的干扰。继电器驱动需使用三极管或光耦隔离,线圈两端必须并联续流二极管。
修改为 32A 充电电流的 N76E003AT20 充电桩代码根据 GB/T 18487.1 的电流映射公式 I = Duty% × 0.6A,32A 对应的 PWM 占空比为: - Duty% = 32 / 0.6 = 53.33%
复制代码N76E003 的 PWM 周期寄存器设为 16000(对应 1ms @ 16MHz),因此 32A 对应的占空比寄存器值约为: - Duty_REG = 16000 × 53.33% ≈ 8533
复制代码 修改点说明只需修改以下三处即可将充电电流从 6A 切换为 32A: 1. 主函数初始化处的默认电流设置 - // 原代码
- Set_Charging_Current(6); // 默认 6A
- // 修改为
- Set_Charging_Current(32); // 默认 32A
复制代码2. PWM 初始化中的默认占空比寄存器值 - // 原代码:默认约10% -> 1600
- PWM0H = (1600 >> 8) & 0xFF;
- PWM0L = 1600 & 0xFF;
- // 修改为:32A 对应 53.33% -> 8533
- PWM0H = (8533 >> 8) & 0xFF;
- PWM0L = 8533 & 0xFF;
复制代码3. pwm_duty 全局变量初值 - // 原代码
- volatile unsigned int pwm_duty = 100; // 默认约10% -> 6A
- // 修改为
- volatile unsigned int pwm_duty = 8533; // 32A 对应 53.33%
复制代码 完整修改后代码
真是太厉害了,真这样小白也能成为工程师啦,哈哈
|