2. 温度传感器选型与接口:从芯片内部到外部世界的温度感知
温度补偿算法能不能跑得准,第一步就看温度数据拿得对不对。我见过不少项目,算法模型建得漂漂亮亮,结果因为传感器选型不当或者接口时序没调好,整个补偿效果大打折扣。今天咱们就把这块掰开揉碎了讲清楚。
2.1 片上集成温度传感器:PN结与Bandgap原理
很多工业控制芯片内部就集成了温度传感器,说白了就是利用半导体器件的温度特性。我个人习惯优先用片上的,省成本、省PCB面积,而且信号路径短,干扰少。
2.1.1 PN结温度传感器
PN结的正向压降VBE随温度升高而线性下降,温度系数大约是-2mV/°C。这个特性很稳定,我最早做电源管理芯片时就用它做过过温保护。
核心公式:
VBE(T) = VBE(T0) + (T - T0) × dVBE/dT
其中dVBE/dT ≈ -2 mV/°C
不过要注意,PN结的工艺偏差比较大。同一批晶圆上,不同芯片的VBE绝对值可能差个几十毫伏。所以它更适合做相对温度检测,比如过温保护这种阈值判断场景。
我曾经踩过的坑:有个项目直接用PN结做-40°C到125°C的全温区测量,结果低温段非线性严重,校准起来特别头疼。后来我改用Bandgap结构,线性度好多了。
2.1.2 Bandgap温度传感器
Bandgap结构利用两个不同电流密度下的PN结压差ΔVBE来产生与绝对温度成正比的电压(PTAT)。它的优势在于——对工艺偏差不敏感,精度高。
原理其实不复杂:两个PN结的电流密度比是固定的,它们的VBE差值ΔVBE = (kT/q) × ln(N),其中N是电流密度比。这个ΔVBE与温度成正比,而且只取决于几何尺寸比,不受工艺绝对偏差影响。
我的经验:Bandgap传感器在-40°C到+125°C范围内,未经校准的精度能做到±2°C,单点校准后能到±0.5°C。这在工业控制里已经够用了。
2.2 外部温度传感器选型:NTC、RTD与数字传感器
片上传感器虽然方便,但有些场景必须用外部的。比如你要测电机外壳温度,或者环境温度离芯片很远。这时候就得选外部传感器了。
2.2.1 NTC热敏电阻
NTC(负温度系数)热敏电阻,温度升高电阻下降。它的优点是灵敏度高,价格便宜,响应快。缺点是线性度差,需要查表或多项式拟合。
| 参数 | 典型值 | 说明 |
|---|---|---|
| B值 | 3435K / 3950K | 决定温度-电阻曲线形状 |
| R25 | 10kΩ / 100kΩ | 25°C时的标称电阻 |
| 精度 | ±1% ~ ±5% | 取决于等级 |
| 测温范围 | -40°C ~ +125°C | 工业级常见范围 |
选NTC时,我建议重点关注B值的温度系数一致性。有些便宜货B值随温度变化很大,拟合出来误差能到好几度。
2.2.2 RTD铂电阻
RTD(电阻温度探测器)用铂金属制成,典型的是PT100和PT1000。它的线性度比NTC好得多,精度也高,就是贵一些。
PT100在0°C时电阻100Ω,温度系数约0.385Ω/°C。PT1000则是1000Ω,灵敏度更高,适合低功耗设计。
选型建议:
- 精度要求±0.1°C以上 → 用PT100/PT1000
- 成本敏感、精度±1°C够用 → 用NTC
- 需要数字接口、布线简单 → 用数字传感器
2.2.3 数字温度传感器
数字传感器内部集成了ADC和数字接口,直接输出温度值。像DS18B20、TMP117、MCP9808这些,用起来特别方便。
我特别喜欢TMP117,精度能做到±0.1°C,I2C接口,而且功耗极低。不过要注意,数字传感器的采样速率通常不高,一般每秒几次到几十次,不适合快速温度变化场景。
2.3 I2C/SPI/单总线接口时序与驱动实现
接口驱动这块,说白了就是让MCU和传感器说上话。时序不对,数据全是乱的。我调试接口时吃过不少苦头,下面把关键点列出来。
2.3.1 I2C接口
I2C用两根线:SCL(时钟)和SDA(数据)。标准模式100kHz,快速模式400kHz,高速模式能到3.4MHz。工业控制里常用100kHz或400kHz。
写驱动时要注意几个细节:
- 起始条件:SCL高电平时,SDA从高变低
- 停止条件:SCL高电平时,SDA从低变高
- 应答位:每个字节后从机拉低SDA表示应答
- 时钟拉伸:有些从机需要拉低SCL来延长时钟周期
// I2C写一个字节的示例(伪代码)
void i2c_write_byte(uint8_t data) {
for (int i = 7; i >= 0; i--) {
SDA = (data >> i) & 0x01;
SCL = 1;
delay_us(5); // 保持时间
SCL = 0;
delay_us(5);
}
// 等待应答
SDA = 1; // 释放SDA
SCL = 1;
while(SDA); // 等待从机拉低
SCL = 0;
}
我常用的调试方法:用逻辑分析仪抓波形,看起始条件、数据位、应答位是否对齐。很多时候问题出在时序延迟上,尤其是时钟拉伸没处理好。
2.3.2 SPI接口
SPI用四根线:SCLK(时钟)、MOSI(主出从入)、MISO(主入从出)、CS(片选)。速度比I2C快得多,能到几十MHz。
SPI有四种模式,由时钟极性(CPOL)和时钟相位(CPHA)决定。我建议先看传感器数据手册,确认它支持哪种模式,再配置MCU的SPI外设。
| 模式 | CPOL | CPHA | 数据采样边沿 |
|---|---|---|---|
| 模式0 | 0 | 0 | 上升沿 |
| 模式1 | 0 | 1 | 下降沿 |
| 模式2 | 1 | 0 | 上升沿 |
| 模式3 | 1 | 1 | 下降沿 |
我曾经犯过的错:有个项目SPI通信偶尔出错,查了半天发现是CS信号没处理好。CS拉低后要等一小段时间再发时钟,否则从机还没准备好。加个1us的延迟就解决了。
2.3.3 单总线接口
单总线(1-Wire)只用一根数据线,同时传数据和供电。DS18B20就是典型代表。它的时序比较讲究,初始化、读位、写位都有严格的时间窗口。
单总线的关键时序:
- 复位脉冲:主机拉低480μs以上,然后释放
- 存在脉冲:从机拉低60-240μs作为应答
- 写1:主机拉低1-15μs后释放
- 写0:主机拉低60-120μs后释放
- 读时序:主机拉低1-15μs后释放,15μs内采样
// 单总线读一个位的示例
uint8_t onewire_read_bit(void) {
uint8_t bit = 0;
DATA = 0; // 拉低总线
delay_us(2); // 保持2μs
DATA = 1; // 释放总线
delay_us(5); // 等待从机输出
bit = DATA; // 采样数据
delay_us(50); // 等待时序结束
return bit;
}
我的经验:单总线对时序要求很严格,尤其是延迟时间。建议用定时器或硬件PWM来产生精确延迟,别用软件循环delay,不同编译器优化出来的结果不一样。
2.4 本章知识体系总览
下面这张图把温度传感器选型与接口的核心逻辑串起来了。从片上到片外,从模拟到数字,从接口到驱动,每一步都有讲究。
嗯,这张图基本把本章的核心内容都串起来了。从上到下,从传感器类型到接口驱动,再到选型参数和避坑要点,每一步都环环相扣。你想想看,如果传感器选错了,或者接口时序没调对,后面算法再牛也白搭。
核心要点回顾:
- 片上传感器:PN结适合阈值检测,Bandgap适合精确测量
- 外部传感器:NTC便宜但非线性,RTD精度高但贵,数字传感器方便但速度慢
- 接口驱动:I2C注意时钟拉伸,SPI注意CS建立时间,单总线注意时序窗口
好了,这一章的内容就到这儿。温度传感器选型和接口驱动是温度补偿算法的基础,基础打牢了,后面做算法才能事半功倍。