在新能源充电桩系统中,绝缘检测是确保设备安全运行的核心环节。我去年参与的一个充电桩项目就曾因绝缘故障导致整个充电模块烧毁,损失惨重。这次经历让我深刻认识到,一套可靠的绝缘检测方案对高压设备而言就是生命线。
传统绝缘检测通常采用兆欧表手动测量,但在充电桩这种需要实时监控的场景下完全行不通。我们需要的是一套能够持续监测、自动报警的在线检测系统。基于STM32F103的方案正好满足了几个关键需求:实时性(ADC采样速率可达1MHz)、成本控制(芯片价格在20元以内)、可靠性(工业级温度范围-40℃~85℃)。
关键提示:在充电桩应用中,国标GB/T 18487.1-2015明确规定绝缘电阻阈值应大于100Ω/V。对于750V直流系统,这意味着至少需要检测75kΩ以上的阻值。
核心检测电路采用改进型不平衡电桥,相比平衡电桥更适合宽范围电阻测量。我们的实际电路参数如下:
code复制Vin ──┬── 10MΩ(R1) ────┬── Rx(待测绝缘电阻)
│ │
100kΩ(R2) ADC_IN
│ │
GND ──┴───────────────┴── GND
计算公式推导过程:
实测发现:当环境湿度>80%时,10MΩ标准电阻会有约5%的偏差,建议选用金属膜电阻并做防潮处理。
关键配置要点:
c复制// ADC初始化代码片段
void ADC1_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
RCC_ADCCLKConfig(RCC_PCLK2_Div6); // 12MHz
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
// 注入通道配置
ADC_InjectedSequencerLengthConfig(ADC1, 1);
ADC_InjectedChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_239Cycles5);
ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_T2_CC2);
ADC_DMACmd(ADC1, ENABLE);
ADC_Cmd(ADC1, ENABLE);
}
选用ADM2483隔离芯片(隔离电压2500Vrms)的关键考虑:
接线示意图:
code复制STM32 USART1 ──┬── TX ── ADM2483 DI
├── RX ── ADM2483 RO
└── DE/RE ── GPIOA.4
ADM2483 A/B ──┬── 120Ω终端电阻(可选)
└── 至主控板RS485网络
实际采用三段式拟合算法提高测量精度:
小电阻段(<10kΩ):使用多项式拟合
Rx = a0 + a1×Vadc + a2×Vadc²
中电阻段(10kΩ~1MΩ):线性计算
Rx = (Vin×R2/Vadc) - (R1+R2)
大电阻段(>1MΩ):对数计算
log(Rx) = b0 + b1×log(Vadc)
c复制#define SEG1_THRES 1000 // ADC值对应10kΩ
#define SEG2_THRES 300 // ADC值对应1MΩ
float CalcInsulationResistance(uint16_t adc_val)
{
float voltage = adc_val * 2.5f / 4095.0f;
if(adc_val > SEG1_THRES) {
// 小电阻段
return 5.67f + 0.021f*voltage - 0.00018f*voltage*voltage;
}
else if(adc_val > SEG2_THRES) {
// 中电阻段
return (24.0f * 100.0f / voltage) - 10100.0f;
}
else {
// 大电阻段
float log_v = log10(voltage);
return powf(10, 7.82f + 0.85f*log_v);
}
}
采用Modbus-RTU协议框架,自定义功能码:
| 功能码 | 描述 | 请求格式 | 响应格式 |
|---|---|---|---|
| 0x03 | 读取绝缘电阻 | [地址][03][起始][长度] | [长度][数据1][数据2] |
| 0x10 | 设置报警阈值 | [地址][10][地址][值] | [地址][值] |
| 0x2B | 设备自检 | [地址][2B] | [状态] |
典型通信流程示例:
code复制主机请求: 01 03 00 00 00 01 84 0A
从机响应: 01 03 02 12 34 78 56
(表示地址1设备返回绝缘电阻值0x1234Ω)
在首批样机测试中发现的典型问题:
改进措施:
c复制// 改进后的滤波算法
#define FILTER_WINDOW 8
uint16_t FilterADCValue(void)
{
static uint16_t buf[FILTER_WINDOW];
static uint8_t index = 0;
buf[index++] = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1);
if(index >= FILTER_WINDOW) index = 0;
// 排序找中值
uint16_t temp[FILTER_WINDOW];
memcpy(temp, buf, sizeof(temp));
BubbleSort(temp, FILTER_WINDOW);
return (temp[FILTER_WINDOW/2-1] + temp[FILTER_WINDOW/2]) / 2;
}
绝缘电阻值会随温度变化,实测数据:
补偿算法:
补偿效果对比:
| 温度 | 未补偿值 | 补偿后值 | 标准值 |
|---|---|---|---|
| 15℃ | 10.54MΩ | 10.01MΩ | 10.05MΩ |
| 45℃ | 9.62MΩ | 10.03MΩ | 9.98MΩ |
我们建立的完整测试方案包含:
精度测试:
耐压测试:
环境试验:
根据多个充电站部署经验总结:
这套方案目前已在300+充电桩上稳定运行超过2年,故障率<0.5%。最关键的收获是:对于绝缘检测系统,硬件电路的可靠设计比软件算法更重要,在恶劣环境下,简单的电路结构往往比复杂方案更稳定。