前言
在车身控制模块(BCM)开发中,如何精确检测负载电流、如何设置过载保护阈值,是每个汽车电子工程师都会遇到的问题。本文将从硬件原理到软件实现,完整拆解PROFET智能高边开关的电流检测与标定技术。
一、PROFET是什么?
PROFET = PROTected FET,即"带保护的场效应晶体管"。它是一个集成了驱动、保护、诊断功能的智能高边开关。
与普通继电器的核心区别
| 特性 | 普通继电器 | PROFET |
|---|---|---|
| 本质 | 机械触点 | 电子开关 |
| 保护方式 | 依赖外部保险丝 | 内置保护(过流/过温/短路) |
| 故障反馈 | 无 | 实时诊断,可上报状态 |
| 寿命 | 机械磨损有限 | 电子开关,几乎无限次 |
一句话:继电器是"哑巴开关",PROFET是"会说话的智能开关"。
二、电流检测的硬件原理
2.1 核心难题
MCU的ADC只能测量电压,如何检测电流?
答案:通过欧姆定律,将电流转换为电压。
2.2 电流镜工作原理
PROFET内部集成了一个**电流镜(Current Mirror)**电路,按固定比例复制负载电流:
text
负载电流 I_L → 镜像电流 I_IS = I_L / k_ILIS
其中 k_ILIS 是电流镜比例系数,典型值为15000~20000(取决于芯片型号)。
2.3 完整转换链路
text
负载电流 I_L
↓ (电流镜,比例 k_ILIS)
镜像电流 I_IS = I_L / k_ILIS
↓ (流过外部采样电阻 R_IS)
采样电压 V_IS = I_IS × R_IS
↓ (ADC采样)
ADC值 = (V_IS / V_REF) × 2^N
2.4 实际参数示例
| 参数 | 典型值 | 说明 |
|---|---|---|
| k_ILIS | 18000 | 电流镜比例 |
| R_IS | 1.5kΩ | 外部采样电阻 |
| V_REF | 5V | ADC参考电压 |
| N | 12 | ADC分辨率 |
计算5A电流对应的ADC值:
text
I_IS = 5A / 18000 ≈ 0.278mA
V_IS = 0.278mA × 1.5kΩ ≈ 0.417V
ADC值 = (0.417V / 5V) × 4096 ≈ 342
2.5 电压检测 vs 电流检测
| 电压检测 | 电流检测 | |
|---|---|---|
| 检测对象 | 电池电压 | 负载电流 |
| 信号来源 | 分压电阻直接采样 | 电流镜+采样电阻 |
| ADC读取的是 | 电压的直接反映 | 电流的间接反映 |
| 保护功能 | 过压、欠压 | 过载、开路、短路 |
三、保护阈值的标定流程
理论计算只是起点,标定才是工程落地的关键。
3.1 标定全流程
text
理论计算 → 台架标定 → 温度补偿 → 实车验证 → 量产刷写
3.2 第一步:理论计算初值
根据目标保护电流,计算理论ADC阈值:
c
// 目标:过载保护电流 5A
理论ADC阈值 = 342
3.3 第二步:台架单点标定
目的:消除芯片差异、电阻精度等个体误差。
| 步骤 | 操作 | 预期 |
|---|---|---|
| 1 | 用精密电流源输入5A | - |
| 2 | 读取BCM实际ADC值 | 读到365,不是342 |
| 3 | 记录修正量 | Δ = +23 |
原因:外部电阻精度、芯片个体差异、ADC参考电压偏差都会导致理论值与实际值的差异。
3.4 第三步:两点标定(提高精度)
单点标定只能修正偏移,两点标定还能修正斜率。
| 步骤 | 操作 |
|---|---|
| 1 | 输入2.5A,记录ADC值(如175) |
| 2 | 输入7.5A,记录ADC值(如530) |
| 3 | 建立线性关系:电流 = f(ADC值) |
text
电流 = a × ADC值 + b
a = (7.5A - 2.5A) / (530 - 175) = 5A / 355 ≈ 0.01408
b = 2.5A - a × 175 ≈ 0.036A
3.5 第四步:温度补偿
问题:电流镜比例和采样电阻都会随温度变化。
方法:将BCM放入温箱,在三个温度点重复标定:
| 温度 | 操作 |
|---|---|
| -40℃ | 输入标准电流,记录ADC值 |
| 25℃ | 输入标准电流,记录ADC值 |
| 105℃ | 输入标准电流,记录ADC值 |
3.6 第五步:电压补偿
问题:电池电压变化(9V~16V)会影响芯片内部工作点。
这就是工程中电压等级表的来源:
c
// 不同电压等级对应不同阈值(示例数据,已脱敏)
{
VOLT_LEVEL_7, // ≥16V
.overload = 1750, // 过载阈值
.openload = 35 // 开路阈值
},
{
VOLT_LEVEL_6, // ≥15V
.overload = 1680,
.openload = 34
},
{
VOLT_LEVEL_5, // ≥14V
.overload = 1620,
.openload = 32
},
{
VOLT_LEVEL_4, // ≥13V
.overload = 1550,
.openload = 31
},
{
VOLT_LEVEL_3, // ≥12V
.overload = 1480,
.openload = 29
},
{
VOLT_LEVEL_2, // ≥11V
.overload = 1420,
.openload = 28
},
{
VOLT_LEVEL_1, // ≥10V
.overload = 1350,
.openload = 26
},
{
VOLT_LEVEL_0, // ≥9V
.overload = 1270,
.openload = 24
}
规律:电压越高,过载阈值越大(因为相同功率下电流更小)。
3.7 第六步:实车验证
将标定好的BCM装车,模拟真实故障场景:
| 场景 | 验证内容 |
|---|---|
| 电机堵转 | 触发过载的时机是否合适 |
| 负载断开 | 能否正确报出开路 |
| 温度变化 | 全天候环境下的稳定性 |
根据实车体验微调阈值(如5A太灵敏→调到5.5A)。
四、代码实现要点
4.1 保护阈值结构体
c
/**
* @brief 保护阈值配置结构体
*/
typedef struct
{
uint16_t voltageLevel; // 电压等级枚举值
uint16_t overloadThr; // 过载保护阈值(ADC值)
uint16_t openloadThr; // 开路检测阈值(ADC值)
} ProtectionThreshold_t;
4.2 过载/开路判断逻辑
c
/**
* @brief 电流检测与故障判断
* @param adcValue 当前采样的ADC值
* @param pConfig 当前电压等级对应的阈值配置
* @return 故障类型
*/
FaultType_e CheckCurrentProtection(uint16_t adcValue, const ProtectionThreshold_t* pConfig)
{
// 过载判断:电流过大
if (adcValue >= pConfig->overloadThr)
{
return FAULT_OVERLOAD;
}
// 开路判断:电流过小(接近0)
else if (adcValue <= pConfig->openloadThr)
{
return FAULT_OPENLOAD;
}
// 正常工作范围
else
{
return FAULT_NONE;
}
}
4.3 为什么代码里直接用ADC值?
c
// 方式一:直接比较ADC值(推荐)
if (adcValue >= 1750) // 1个时钟周期,整数运算
// 方式二:转成物理量再比较(不推荐)
if (current >= 5.2) // 需要浮点运算,慢
汽车软件追求实时性,直接比较ADC值是标准做法。
4.4 开路阈值为什么不是0?
| 原因 | 说明 |
|---|---|
| 芯片漏电流 | 即使负载断开,仍有微弱电流(典型值5~10mA) |
| 噪声干扰 | ADC采样有噪声,阈值需留滞回区间 |
| 工程冗余 | 35对应的电流约0.05A,低于此值判为开路 |
五、常见问题
Q1:理论计算342,实际标定为什么是365?
A: 多个因素叠加:
-
外部采样电阻精度(±1%)
-
芯片k_ILIS个体差异(±10%)
-
ADC参考电压偏差(±2%)
-
板级走线阻抗
标定的作用就是消除这些累积误差。
Q2:为什么电压不同,阈值也不同?
A: 芯片内部电路的工作点会随供电电压变化。为了保证相同的保护电流在不同电压下都能准确触发,需要对阈值进行电压补偿。这就是电压等级表的存在意义。
Q3:单点标定和两点标定有什么区别?
| 单点标定 | 两点标定 | |
|---|---|---|
| 修正能力 | 只能修正偏移误差 | 同时修正偏移和斜率误差 |
| 操作复杂度 | 低 | 中等 |
| 精度 | 满足大多数应用 | 更高精度要求 |
| 适用场景 | 小量程、线性度好的系统 | 大量程、需要高线性度的系统 |
六、总结
| 概念 | 一句话总结 |
|---|---|
| 电流检测原理 | 电流镜 → 镜像电流 → 采样电阻 → 电压 → ADC |
| 理论ADC值 | 根据数据手册参数计算,是标定的起点 |
| 标定目的 | 消除个体差异和环境因素的影响 |
| 单点标定 | 修正偏移误差 |
| 两点标定 | 同时修正偏移和斜率 |
| 温度/电压补偿 | 应对环境和供电变化 |
| 代码中的阈值 | 标定工程师经过完整流程得出的最终数值 |
一句话回顾:PROFET通过电流镜将负载电流转换为电压供ADC采样,保护阈值需要经过理论计算、台架标定、温度补偿、实车验证等一系列流程才能最终确定,标定工程师的工作就是建立"物理电流 → ADC值"的精确映射关系。