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 的「手」,负责把不均衡的电芯拉回来。