1. 传感器系统概述:传感器定义、分类、性能指标、选型原则
大家好,我是老张。做嵌入式这行快十五年了,从最早的51单片机玩到现在的多核异构处理器,传感器始终是绕不开的核心。今天咱们聊聊传感器系统的基础,这些东西看着简单,但真到项目里,坑可不少。
1.1 传感器的定义
传感器是什么?说白了,就是把物理世界的信号变成电信号的装置。温度、压力、光线、声音、加速度……这些我们感知不到或者难以精确量化的东西,传感器能帮我们搞定。
我个人习惯把传感器理解成一个“翻译官”。它把物理量翻译成电压、电流、频率这些电信号,然后MCU或者DSP才能读懂。举个例子,你用手摸一下热水杯,知道烫,但不知道具体多少度。一个NTC热敏电阻或者DS18B20数字温度传感器,就能告诉你“85.3℃”。
核心定义:传感器是一种检测装置,能感受被测量的信息,并按一定规律将其转换成可用输出信号(通常是电信号)。
1.2 传感器的分类
传感器的分类方式很多,我一般按下面这几种维度来分,项目里够用了。
按被测物理量分类
- 热工量:温度、热量、热流。比如热电偶、热敏电阻、红外测温。
- 机械量:位移、力、速度、加速度、振动。比如加速度计、压力传感器、应变片。
- 光学量:光强、色度、图像。比如光电二极管、CCD/CMOS图像传感器。
- 磁学量:磁场强度、方向。比如霍尔传感器、磁阻传感器。
- 声学量:声压、声强、超声波。比如麦克风、超声波换能器。
- 化学量:气体浓度、pH值、湿度。比如MQ系列气体传感器、电化学传感器。
按输出信号类型分类
| 类型 | 特点 | 典型例子 |
|---|---|---|
| 模拟输出 | 连续电压/电流信号,需ADC采样 | LM35温度传感器、电位器 |
| 数字输出 | 直接输出数字量,抗干扰强 | DS18B20、MPU6050(I2C) |
| 频率/脉冲输出 | 频率变化代表物理量变化 | 霍尔流量计、超声波测距 |
| 开关量输出 | 只有0和1,简单粗暴 | 红外避障传感器、干簧管 |
我记得刚入行那会儿,选传感器只看精度和价格,结果在一个工业项目里选了模拟输出的温度传感器,布线长了信号衰减严重,折腾了两周才搞定。后来学乖了,长距离传输优先选数字接口或者4-20mA电流环。
1.3 传感器的性能指标
这部分是选型的硬功夫。我见过不少工程师拿着数据手册只看精度,其他参数一概不管,结果项目翻车。下面这几个指标,你选型时必须过一遍。
1. 量程(Range)
传感器能测量的最大最小值范围。比如一个压力传感器量程0-10MPa,你非要测12MPa,那结果就是烧掉或者非线性失真。我曾经在一个液压系统里吃过这个亏,传感器直接爆了,还好没伤到人。
2. 精度(Accuracy)
测量值与真实值的偏差。注意,精度和分辨率是两码事。分辨率是能分辨的最小变化,精度是准不准。一个16位ADC分辨率很高,但参考电压漂了,精度照样差。
3. 灵敏度(Sensitivity)
输出变化量与输入变化量的比值。比如加速度计,灵敏度单位是mV/g。灵敏度越高,信号越容易处理,但也越容易受噪声干扰。
4. 线性度(Linearity)
实际输出曲线与理想直线的偏离程度。非线性误差大的传感器,需要做软件校准。我习惯在批量生产前抽测10%的样品,看看线性度一致性怎么样。
5. 响应时间(Response Time)
从输入变化到输出稳定所需的时间。比如气体传感器,有些电化学传感器响应时间长达几十秒,做快速检测项目根本不能用。
6. 重复性(Repeatability)
相同条件下多次测量的一致性。这个指标很关键,尤其是在工业自动化里。重复性差的传感器,数据根本没法用。
避坑指南:我曾经在一个环境监测项目里,选了某款便宜的气体传感器,精度标称±5%,但重复性实测超过±15%。同一瓶标气,上午测和下午测能差20%。后来换了Sensirion的传感器,虽然贵了三倍,但数据稳定多了。选型时,重复性比精度更值得关注。
1.4 传感器的选型原则
选传感器不是越贵越好,也不是精度越高越好。我总结了一套选型流程,分享给大家。
第一步:明确需求
- 测什么物理量?量程范围是多少?
- 精度要求多少?响应时间要求多快?
- 工作环境:温度、湿度、振动、电磁干扰?
- 接口类型:模拟、I2C、SPI、UART、CAN?
- 成本预算:单颗传感器多少钱?
第二步:筛选候选型号
根据需求,从主流厂商(如Bosch、ST、TI、Honeywell、Sensirion)中筛选3-5款。别只看一家,不同厂商的传感器各有优劣。
第三步:对比关键参数
把候选型号的量程、精度、灵敏度、功耗、封装、价格列成表格,逐项对比。我一般会重点关注功耗和封装,尤其是做电池供电的产品。
第四步:做实物测试
数据手册是理想情况,实际表现得自己测。我习惯先买10片样品,搭个测试板,跑一下全温度范围、全量程范围,看看实际表现。这一步不能省,省了就是给自己挖坑。
重要提醒:选型时一定要考虑供应链。我曾经选了一款非常合适的传感器,结果量产时发现交期要16周,差点导致项目延期。现在我会优先选有现货、有替代料的型号。
1.5 传感器系统知识体系
下面这张图是我自己整理的传感器系统知识框架,涵盖了从基础概念到实际应用的完整链路。你把它理解了,后面章节的内容就顺了。
这张图把传感器系统的核心内容串起来了。从定义出发,理解分类,掌握性能指标,最后落到选型原则。后面的章节,我们会逐一深入每个环节。
1.6 一个简单的传感器数据读取示例
光说不练假把式。下面是一个用STM32读取DHT11温湿度传感器的代码片段,模拟接口,单总线协议。这个传感器便宜、简单,适合入门。
// DHT11 温湿度传感器读取示例(STM32 HAL库)
#include "dht11.h"
#define DHT11_PIN GPIO_PIN_0
#define DHT11_PORT GPIOA
// 读取DHT11数据
uint8_t DHT11_ReadData(float *temperature, float *humidity)
{
uint8_t data[5] = {0};
uint8_t i, j;
// 主机发送起始信号
HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_RESET);
HAL_Delay(18); // 拉低至少18ms
HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_SET);
delay_us(30); // 拉高20-40us
// 等待DHT11响应
if (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) == GPIO_PIN_RESET)
{
while (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) == GPIO_PIN_RESET); // 等待拉高
while (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) == GPIO_PIN_SET); // 等待拉低
// 读取40位数据
for (j = 0; j < 5; j++)
{
for (i = 0; i < 8; i++)
{
while (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) == GPIO_PIN_RESET);
delay_us(40);
if (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) == GPIO_PIN_SET)
{
data[j] |= (1 << (7 - i));
}
while (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) == GPIO_PIN_SET);
}
}
// 校验:前4字节之和等于第5字节
if ((data[0] + data[1] + data[2] + data[3]) == data[4])
{
*humidity = (float)data[0];
*temperature = (float)data[2];
return 1; // 成功
}
}
return 0; // 失败
}
经验之谈:DHT11的时序要求比较严格,尤其是那个40us的延时。我刚开始用HAL_Delay()做微秒级延时,结果死活读不到数据。后来改用定时器或者空循环做微秒延时,问题就解决了。记住,HAL_Delay()最小单位是1ms,做不了微秒级操作。
好了,第一章的内容就到这里。传感器系统的基础概念、分类、性能指标和选型原则,都是后面实战的基石。你把这些吃透了,后面学各种传感器接口、数据融合、系统设计,就会轻松很多。
可可精品资料库