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 接口选型决策流程
下面这张图是我自己总结的接口选型流程,每次做新项目我都会过一遍:
这个流程我用了很多年。你按这个顺序走一遍,基本不会选错。当然,实际项目里还要考虑成本、功耗、引脚数量这些因素,但大方向不会偏。
最后说一句:接口选型没有绝对的对错,只有合不合适。我见过有人用I2C传几十米的数据,也见过有人用4-20mA传板内信号。能稳定工作就是好方案。但如果你问我,我会说——选接口之前,先想清楚你的应用场景,再翻数据手册,最后动手画原理图。顺序别搞反了。