4、温度检测:NTC/PTC选型与布局、热敏电阻分压网络设计、温度采样滤波
温度检测,在BMS里看着不起眼,但坑是真不少。我见过太多项目,电芯电压采样稳如老狗,结果温度一测就飘,保护板乱动作。说白了,温度不准,SOC估算就是空中楼阁。
今天咱们就聊聊温度检测这条路上的几个硬骨头。我会从选型、布局、分压网络到滤波,把我在项目中踩过的坑,一个一个说清楚。
4.1 NTC与PTC:选型背后的门道
先说说选型。市面上最常见的就是NTC(负温度系数)和PTC(正温度系数)。BMS里99%的场景用的是NTC,为什么?
NTC的优势很明显:
- 温度升高,电阻下降。这个特性非常适合做分压采样。
- 灵敏度高,尤其是在-20°C到60°C这个区间,变化非常明显。
- 成本低,供货稳定。
但PTC也不是一无是处。我曾在某个项目中用过PTC做过温保护。当温度超过阈值,PTC电阻会急剧上升,直接切断回路。这种“自恢复保险”的特性,在某些场景下比NTC更可靠。
选型核心指标:
- B值(材料常数): 决定了NTC的灵敏度。B值越大,温度变化时电阻变化越剧烈。我个人习惯选B=3435或B=3950的,通用性好。
- R25(25°C时的电阻值): 常见的有10kΩ、100kΩ。10kΩ的NTC在常温下功耗小,适合电池包内部。
- 精度: 1%还是5%?别省这个钱。温度不准,后面的算法全白搭。
我的经验: 选NTC时,一定要看它的耗散系数。如果NTC自身发热严重,测出来的温度会比实际高。我在一个高密度电池包项目里就吃过这个亏,后来换了更大封装的NTC才解决。
4.2 布局:别让温度传感器“说谎”
布局这件事,说起来简单,做起来全是细节。你想想看,传感器放错了位置,测出来的温度能准吗?
布局的几个铁律:
- 紧贴电芯表面: 最好用导热硅胶固定。别留空气间隙,空气是热的不良导体。
- 远离大功率器件: MOS管、电感这些发热大户,离它们远点。否则你测的是电芯温度还是MOS温度?
- 对称放置: 如果电池包是串联结构,尽量在每串电芯的相同位置放置传感器。这样数据才有可比性。
我曾经在一个项目中,把NTC放在了电芯的极耳附近。结果发现,充电时温度飙升得特别快。后来一查,是极耳本身发热导致的。嗯,这里要注意,极耳的温度不能代表电芯内部温度。
避坑指南: 我曾经把NTC的走线拉得太长,而且和功率线平行走了10cm。结果采样值一直跳,怎么滤波都滤不掉。后来发现是功率线上的高频噪声耦合进来了。记住,NTC走线要短,要远离干扰源。
4.3 分压网络设计:电阻选型与计算
NTC本身是个可变电阻,我们需要一个固定电阻和它组成分压网络,才能把电阻变化转换成电压变化。这个固定电阻的选型,直接决定了你的测温范围。
分压网络有两种常见接法:
- 上拉电阻接VREF,NTC接地: 温度升高,NTC电阻下降,分压点电压下降。这是最常用的接法。
- NTC接VREF,下拉电阻接地: 温度升高,分压点电压上升。适合某些ADC输入范围受限的场景。
我个人习惯用第一种,因为大多数MCU的ADC在0V附近精度更好。
固定电阻怎么选?
假设你用的是10kΩ的NTC(R25=10kΩ),固定电阻也选10kΩ。这样在25°C时,分压点电压正好是VREF的一半。这个点ADC的线性度最好。
但如果你要测高温(比如80°C以上),NTC电阻会降到1kΩ以下。这时候分压点电压会非常低,ADC分辨率不够。怎么办?
我的做法: 根据目标测温范围,计算固定电阻的最佳值。公式很简单:
R_fixed = sqrt(R_min * R_max)
其中R_min和R_max分别是目标温度范围内NTC的最小和最大电阻值。这样能保证在整个测温范围内,分压点电压变化最均匀。
| 目标温度范围 | NTC电阻范围(10kΩ NTC) | 推荐固定电阻 |
|---|---|---|
| -20°C ~ 60°C | 100kΩ ~ 3kΩ | 10kΩ |
| 0°C ~ 80°C | 30kΩ ~ 1kΩ | 5.6kΩ |
| 10°C ~ 100°C | 18kΩ ~ 0.5kΩ | 3.3kΩ |
4.4 温度采样滤波:别让噪声毁了你的数据
采样滤波,这是最后一道防线。ADC采到的电压,如果不做处理,直接查表算温度,结果会让你怀疑人生。
噪声来源有哪些?
- 电源噪声: VREF不稳,分压点电压跟着跳。
- 开关噪声: 电池包里的MOS管开关动作,会通过寄生电容耦合到NTC走线上。
- 量化噪声: ADC本身的量化误差。
硬件滤波:
在分压点和ADC输入之间,加一个RC低通滤波器。R取1kΩ~10kΩ,C取0.1μF~1μF。截止频率算一下:
f_c = 1 / (2 * π * R * C)
比如R=10kΩ,C=0.1μF,截止频率大约是160Hz。这个频率能滤掉大部分开关噪声,又不会影响温度变化的响应速度。
我的习惯: 硬件滤波只是第一步。软件上我还会做滑动平均滤波。取最近5~10次采样值,去掉最大值和最小值,然后取平均。这样既能滤掉尖峰噪声,又能保留温度变化的趋势。
软件滤波代码示例(伪代码):
// 滑动平均滤波,窗口大小10
#define FILTER_WINDOW 10
uint16_t adc_buffer[FILTER_WINDOW];
uint8_t index = 0;
uint16_t temperature_filter(uint16_t new_adc_value) {
uint32_t sum = 0;
uint16_t min_val = 0xFFFF;
uint16_t max_val = 0;
// 存入新值
adc_buffer[index] = new_adc_value;
index = (index + 1) % FILTER_WINDOW;
// 计算去极值后的平均值
for (int i = 0; i < FILTER_WINDOW; i++) {
sum += adc_buffer[i];
if (adc_buffer[i] < min_val) min_val = adc_buffer[i];
if (adc_buffer[i] > max_val) max_val = adc_buffer[i];
}
sum -= min_val;
sum -= max_val;
return (uint16_t)(sum / (FILTER_WINDOW - 2));
}
避坑指南: 我曾经在软件滤波上栽过跟头。当时用了无限冲激响应(IIR)滤波器,参数没调好,导致温度响应滞后了十几秒。电池都过热了,保护板还没反应过来。后来换成滑动平均滤波,问题才解决。记住,温度检测要的是“快”和“准”的平衡,不是单纯的“平滑”。
好了,温度检测这块,从选型到布局,从分压网络到滤波,基本就这些了。你想想看,每个环节都做到位了,温度数据才能真实反映电芯的状态。下一章咱们聊聊电流检测,那又是另一番天地了。