4、传感器与采样电路:电压采样电路设计、电流采样(霍尔/分流器)、温度传感器(NTC/DS18B20)
各位同学,大家好。这一章我们聊聊电池管理系统里最基础、也最要命的部分——采样电路。
你想想看,BMS 的所有决策,什么均衡、保护、SOC 估算,全都建立在采样数据上。数据不准,后面全是白搭。我在植保无人机项目上吃过这个亏,有一次返厂维修,拆开一看,电压采样线虚焊,导致过放保护没触发,电池直接鼓包。从那以后,我对采样电路的设计就格外较真。
4.1 电压采样电路设计
电压采样,说白了就是测量每一节电芯的端电压。植保无人机用的通常是 6S 到 14S 的锂聚合物电池组,单节满电 4.2V,放电截止 3.0V 左右。
这里有个核心问题:单片机的 ADC 输入范围通常是 0~3.3V 或 0~5V,而电芯电压是串联的,你不能直接把电池正负极接到 ADC 引脚上——高压会烧片子。
常用的方案有两种:
- 电阻分压网络:简单、便宜,但精度受电阻温漂影响大。
- 专用电池监控芯片:比如 TI 的 BQ76940、ADI 的 LTC6804,内部集成了精密分压和 ADC,还带均衡功能。
我个人习惯在低成本项目里用分压网络,但必须加一级电压跟随器。为什么呢?因为分压网络的输出阻抗高,直接进 ADC 会拉低电压,导致采样偏小。
关键设计要点:
- 分压电阻选用 0.1% 精度、25ppm 温漂的金属膜电阻
- 在 ADC 输入端并联 100nF 电容,滤除高频噪声
- 每路采样加一个 1kΩ 限流电阻,防止意外短路
下面是一个典型的 6S 电池电压采样电路示意图(伪代码描述):
// 伪代码:6S 电池电压采样
// 使用电阻分压 + 运放跟随
// 分压比:R1=10kΩ, R2=2kΩ, 分压系数 = R2/(R1+R2) = 0.1667
float read_cell_voltage(int cell_index) {
// 假设 ADC 参考电压为 3.3V,12位分辨率
uint16_t adc_value = adc_read(cell_index);
float voltage_at_adc = (adc_value / 4095.0) * 3.3;
float cell_voltage = voltage_at_adc / 0.1667;
return cell_voltage;
}
注意:分压电阻的阻值不能太大,否则会引入额外的压降。我一般控制在 10kΩ 级别,这样流过电阻的电流在微安级,对电池影响可以忽略。
4.2 电流采样:霍尔 vs 分流器
电流采样在植保无人机上尤其重要。你想,无人机悬停时电流可能只有 10A,但满油门爬升时能冲到 80A 甚至 100A。动态范围这么大,采样方案得好好选。
主流方案就两种:霍尔电流传感器和分流器(采样电阻)。
4.2.1 霍尔电流传感器
霍尔传感器的原理是利用霍尔效应,测量电流产生的磁场。优点是非接触、隔离性好、没有插入损耗。缺点是温漂大、成本高、带宽有限。
我在项目中用过 Allegro 的 ACS712 和 ACS758 系列。ACS712 适合小电流(±5A、±20A),ACS758 可以到 ±200A。对于植保无人机,我推荐 ACS758-100B,量程 ±100A,灵敏度 20mV/A。
我的经验:霍尔传感器输出的是模拟电压,需要接到 ADC 引脚。但要注意,输出信号通常有 2.5V 的偏置(零电流时输出 2.5V)。所以软件里要减去这个偏置值。
// 霍尔电流传感器读取示例
// ACS758-100B,灵敏度 20mV/A,零电流偏置 2.5V
float read_current_hall() {
uint16_t adc_value = adc_read(CURRENT_CHANNEL);
float voltage = (adc_value / 4095.0) * 3.3;
float current = (voltage - 2.5) / 0.02; // 减去偏置,除以灵敏度
return current;
}
4.2.2 分流器(采样电阻)
分流器方案更直接:在电流回路中串一个毫欧级电阻,测量其两端压降。优点是精度高、线性度好、成本低。缺点是有插入损耗、不隔离、大电流时发热严重。
我曾经在一个 100A 的项目里用 0.5mΩ 的分流器,满负荷时功耗是 I²R = 100² × 0.0005 = 5W。嗯,这 5W 热量得想办法散掉,不然 PCB 会烤糊。
分流器后面必须接差分放大器,比如 TI 的 INA240 或 ADI 的 AD8210。因为压降信号非常小(毫伏级),共模电压却很高(电池电压),普通运放根本搞不定。
两种方案对比:
| 特性 | 霍尔传感器 | 分流器 |
|---|---|---|
| 隔离性 | 天生隔离 | 需要隔离放大器 |
| 精度 | 中等(±1%~±5%) | 高(±0.1%~±1%) |
| 插入损耗 | 无 | 有(发热) |
| 成本 | 高 | 低 |
| 带宽 | 几十 kHz | DC~MHz |
我个人建议:如果项目对成本敏感、对精度要求高,选分流器。如果要求隔离、不想处理散热问题,选霍尔传感器。植保无人机我偏向分流器,因为 SOC 估算需要高精度电流积分。
4.3 温度传感器:NTC 与 DS18B20
温度采样在电池管理中不是配角。锂电池在 0°C 以下充电会析锂,60°C 以上可能热失控。植保无人机夏天在田里作业,电池温度经常飙到 50°C 以上,不监测不行。
4.3.1 NTC 热敏电阻
NTC 是最常用的温度传感器,便宜、响应快、体积小。它的阻值随温度升高而降低,典型的是 10kΩ 在 25°C 时。
电路设计很简单:NTC 和一个固定电阻串联,中间点接 ADC。但要注意,NTC 的阻值-温度曲线是非线性的,需要查表或公式计算。
// NTC 温度计算(使用 Steinhart-Hart 方程)
// 假设 NTC 型号:MF52-103,B=3950,R25=10kΩ
float read_temperature_ntc() {
uint16_t adc_value = adc_read(TEMP_CHANNEL);
float voltage = (adc_value / 4095.0) * 3.3;
// 计算 NTC 阻值(串联电阻 R_fixed = 10kΩ)
float r_ntc = (voltage * 10000.0) / (3.3 - voltage);
// Steinhart-Hart 方程
float steinhart;
steinhart = log(r_ntc / 10000.0); // 除以 R25
steinhart /= 3950.0; // 除以 B 值
steinhart += 1.0 / (25.0 + 273.15); // 加上 1/T0
steinhart = 1.0 / steinhart;
steinhart -= 273.15; // 转换为摄氏度
return steinhart;
}
避坑指南:我曾经在 NTC 的 ADC 采样线上没加滤波电容,结果温度读数跳来跳去,导致误触发高温保护。后来在 ADC 引脚对地加了一个 100nF 电容,问题解决。另外,NTC 的自热效应也要注意,流过 NTC 的电流不要超过 100μA,否则测量会偏大。
4.3.2 DS18B20 数字温度传感器
DS18B20 是 Maxim 的单总线数字温度传感器,精度 ±0.5°C,分辨率可配置到 12 位(0.0625°C)。它最大的好处是直接输出数字信号,不需要 ADC,抗干扰能力强。
但 DS18B20 也有缺点:单总线协议时序要求严格,通信速度慢(一次转换要 750ms),而且多个传感器挂在一根总线上时,需要处理 ROM 搜索。
在植保无人机上,我一般把 DS18B20 贴在电池外壳上,用来监测环境温度。电芯内部的温度还是用 NTC,因为 NTC 可以埋在电芯之间,响应更快。
// DS18B20 读取示例(伪代码)
// 使用单总线协议
float read_temperature_ds18b20() {
// 1. 发送转换命令 0x44
onewire_reset();
onewire_skip_rom();
onewire_write_byte(0x44);
// 2. 等待转换完成(最大 750ms)
delay_ms(750);
// 3. 读取暂存器
onewire_reset();
onewire_skip_rom();
onewire_write_byte(0xBE);
uint8_t temp_lsb = onewire_read_byte();
uint8_t temp_msb = onewire_read_byte();
// 4. 计算温度值
int16_t raw = (temp_msb << 8) | temp_lsb;
float temperature = raw * 0.0625;
return temperature;
}
我的建议:如果板子上有富余的 GPIO,用 DS18B20 做环境温度监测很方便。但如果是电池包内部的温度监测,我强烈推荐 NTC,因为它的响应速度更快,而且不需要复杂的通信协议。
4.4 采样电路的整体布局建议
最后,我给大家几个布局上的建议,都是血泪教训换来的:
- 模拟地和数字地要分开:采样电路属于模拟部分,MCU 属于数字部分。两者用 0Ω 电阻或磁珠单点连接,防止数字噪声串入采样信号。
- 采样线要短:电压采样线越长,越容易引入噪声。我习惯把采样电路放在电池接口旁边。
- 加 TVS 管保护:电池接口是外部接口,容易受到静电或浪涌冲击。在每个采样输入端对地加一个 TVS 管,电压选 5V 或 6V 的。
- 预留测试点:在采样电阻、运放输出、ADC 输入等关键节点预留测试点,方便调试时用示波器测量。
好了,这一章的内容就到这里。采样电路是 BMS 的「眼睛」,眼睛不好使,整个系统就是瞎子。下一章我们聊聊电池均衡电路,那是 BMS 的「手」,负责把不均衡的电芯拉回来。