3. 环境仓基础

传感器把物理量变成电信号,但怎么把这个信号“拿”到微处理器里,就是接口电路的事了。我做了十几年嵌入式,见过太多因为接口选型失误导致项目返工的案例。说白了,选接口就是选传输方式——你要考虑距离、噪声、功耗、成本,还有你MCU上还剩几个引脚。

这一章,我把常见的传感器接口分成四类来讲:电压、电流、频率,还有数字接口。每种都有它的脾气,摸透了就好用。

3.1 电压输出型接口

电压输出是最直接的。传感器内部把物理量转换成电压,你直接用ADC去读就行。常见的输出范围有0-5V、0-10V、0-3.3V,也有±5V、±10V的差分输出。

核心要点:电压输出型传感器最怕两件事——压降和噪声。信号线一长,线阻分压,到ADC那边电压就不准了。我有个项目,传感器离MCU两米远,0-5V输出,到板子上只剩4.7V,满量程直接少了6%。

解决办法其实不复杂:

  • 用高输入阻抗的ADC或运放跟随——输入阻抗要大于传感器输出阻抗的100倍以上
  • 信号线用屏蔽双绞线,单端接地,别跟电源线走一起
  • 距离超过3米就别用电压输出了,换电流或者数字接口

我的习惯:只要传感器和MCU在同一块板子上,我优先用电压输出。简单、直接、调试方便。但一旦要拉线出去,我就开始警惕了。

3.2 电流输出型接口(4-20mA)

4-20mA是工业现场的老大哥。为什么是4mA不是0mA?因为4mA可以用来给传感器供电,同时还能检测断线——如果读到0mA,说明线断了。

它的原理很简单:传感器把物理量转换成4-20mA的电流,在接收端用一个精密电阻(通常是250Ω)把电流转成1-5V电压,再进ADC。

电流值 对应物理量(%) 250Ω电阻上电压 说明
4 mA 0% 1.0 V 量程起点,同时给传感器供电
12 mA 50% 3.0 V 中间值
20 mA 100% 5.0 V 满量程
< 3.6 mA 故障 < 0.9 V 断线或传感器故障

4-20mA最大的优势是抗干扰。电流信号不像电压那样容易受线阻和电磁干扰影响。我在一个变频器旁边测温度,电压输出型的数据跳得像心电图,换成4-20mA就稳了。

避坑指南:我曾经在一个项目里直接用MCU的ADC去读4-20mA,忘了加250Ω取样电阻,结果ADC引脚直接对地短路,烧了一个端口。记住,电流信号必须经过电阻转成电压才能进ADC。

4-20mA的典型接法:

传感器(4-20mA) → 250Ω电阻(并接在信号与GND之间) → ADC输入
                    ↑
                精密电阻,1%或更高精度

3.3 频率输出型接口

频率输出型传感器把物理量转换成频率信号。比如风速传感器,风速越大,输出方波的频率越高。MCU用定时器捕获上升沿,算频率,再查表或公式得到物理量。

这种接口的好处是:

  • 抗干扰能力强——频率是数字信号,只要噪声没把脉冲吃掉,频率信息就还在
  • 传输距离远——几十米没问题
  • 不需要ADC——用MCU的定时器输入捕获就行

但要注意频率范围。有些传感器输出0-10kHz,有些是0-100kHz。MCU的定时器能不能捕获那么高的频率?我遇到过用8位单片机去读100kHz信号,定时器分辨率不够,算出来的频率误差很大。

我的做法:频率信号进来先过一级施密特触发器整形,把边沿整干净了再进MCU。不然信号边沿抖动,定时器捕获到的脉宽忽大忽小。

3.4 数字接口(I2C、SPI、UART、1-Wire)

现在越来越多的传感器直接输出数字信号。好处是接口简单、精度高、抗干扰。坏处是——你得会调协议。

3.4.1 I2C

I2C用两根线:SCL(时钟)和SDA(数据)。一根线上可以挂多个设备,每个设备有唯一地址。速度标准模式100kHz,快速模式400kHz,高速模式能到3.4MHz。

我常用的I2C传感器:温度(LM75、TMP102)、湿度(SHT30)、气压(BMP280)。

I2C的坑:

  • 上拉电阻不能省——SCL和SDA都要上拉到VCC,阻值通常4.7kΩ
  • 总线电容有限——线太长或设备太多,信号会变形
  • 地址冲突——两个传感器用了同一个地址,你就得换芯片或者用多路复用器

经验之谈:我有个项目挂了8个I2C传感器在一条总线上,结果最后一个设备老是通信失败。查了半天,是总线电容太大,信号上升沿变缓了。最后把上拉电阻换成2.2kΩ,问题解决。

3.4.2 SPI

SPI用四根线:SCLK(时钟)、MOSI(主出从入)、MISO(主入从出)、CS(片选)。速度比I2C快得多,能到几十MHz。每个从设备需要一根独立的CS线。

SPI适合高速传感器,比如加速度计(ADXL345)、陀螺仪(MPU6050)、ADC芯片。

SPI的注意事项:

  • CS线要拉低再拉高——每个通信周期都要做完整的片选操作
  • 时钟极性和相位要匹配——CPOL和CPHA必须跟传感器数据手册一致
  • 走线不要太长——高速SPI超过10cm就可能出问题

3.4.3 UART

UART用两根线:TX和RX。异步通信,不需要时钟线。波特率常见9600、115200、460800。UART是一对一的,不能像I2C那样挂多个设备。

很多传感器用UART输出,比如GPS模块、激光测距、PM2.5传感器。数据格式通常是NMEA协议或者自定义的二进制协议。

注意:UART的电平标准要搞清楚。3.3V的传感器不能直接接5V的MCU,中间要加电平转换。我曾经烧过一个GPS模块,就是因为忘了看数据手册里的供电电压。

3.4.4 1-Wire

1-Wire是Dallas公司(现Maxim)的专利协议。一根线既传数据又传供电。最典型的器件是DS18B20温度传感器。

1-Wire的优点:省引脚,一根线挂多个设备。缺点:速度慢(典型16kbps),时序要求严格,软件模拟比较麻烦。

用1-Wire要注意:

  • 上拉电阻要4.7kΩ,不能太大也不能太小
  • 时序要精确——复位脉冲、存在脉冲、读写时隙,时间窗口很窄
  • 线长有限——超过10米可能不稳定

3.5 接口选型对比

我把四种接口放在一起对比,方便你选型时参考:

接口类型 线数 传输距离 抗干扰 速度 多设备 典型应用
电压输出 2-3 < 3 m 差 快(受ADC限制) 否 板内传感器
4-20mA 2 几百米 好 慢(受ADC限制) 否 工业现场
频率输出 2-3 几十米 好 中等 否 转速、风速
I2C 2 < 1 m 中等 100kHz-3.4MHz 是(地址区分) 板内多传感器
SPI 4 < 0.5 m 中等 10-80MHz 是(CS区分) 高速传感器
UART 2 几米 中等 9600-1Mbps 否 GPS、激光测距
1-Wire 1 < 10 m 中等 16kbps 是(ID区分) 温度传感器

3.6 接口选型决策流程

下面这张图是我自己总结的接口选型流程,每次做新项目我都会过一遍:

传感器接口选型决策流程 传感器接口选型决策流程 传感器信号输出 传输距离 > 3米? 是 → 选 4-20mA 或 频率输出 否 → 选 电压输出 需要挂多个传感器? 是 → 选 I2C 或 1-Wire 否 → 选 SPI 或 UART 需要高速传输? 是 → 选 SPI(高速) 否 → 选 UART(简单) 提示 距离远优先考虑抗干扰能力 多设备优先考虑总线型接口 高速场景优先考虑SPI 简单场景优先考虑UART

这个流程我用了很多年。你按这个顺序走一遍,基本不会选错。当然,实际项目里还要考虑成本、功耗、引脚数量这些因素,但大方向不会偏。

最后说一句:接口选型没有绝对的对错,只有合不合适。我见过有人用I2C传几十米的数据,也见过有人用4-20mA传板内信号。能稳定工作就是好方案。但如果你问我,我会说——选接口之前,先想清楚你的应用场景,再翻数据手册,最后动手画原理图。顺序别搞反了。