3. 海洋传感器接口与数据采集

海洋遥测终端的数据质量,首先取决于“传感器—接口—采集”这条链路是否匹配。海洋观测中常见的传感器大致分为两类:一类输出连续电压或电流,如压力式水位计、溶解氧电极、浊度计;另一类以数字报文输出,如温盐深探头、气象多参数仪、声学多普勒流速剖面仪。前者需要经过ADC转换,后者则通过I2C、SPI、UART或SDI-12等数字总线读取。理解每种接口的电气特性、时序约束和适用场景,是设计采集程序的前提。

模拟量接口与ADC的关键参数

模拟量传感器接入终端时,首先要确认输出形式:0~5V、0~10V、4~20mA还是电阻分压。4~20mA电流环抗干扰能力强,适合长电缆传输,但需要精密采样电阻(常见250Ω,将4~20mA转换为1~5V)。ADC选型关注三个指标:分辨率、参考电压和采样速率。以12位ADC、参考电压3.3V为例,最小可分辨电压为3.3V/4096≈0.806mV;若传感器量程为0~5m、输出0~5V,则理论分辨率约为1.22mm。实际有效分辨率还受噪声影响,通常需要过采样或均值滤波。

配置时要注意输入阻抗与信号源阻抗的匹配。高阻抗传感器(如pH电极)直接接入ADC会因分压产生误差,应使用运放做电压跟随。另外,ADC的采样保持时间必须大于信号源建立时间,否则相邻通道之间会串扰。多通道采集时,建议在通道切换后丢弃前1~2次采样,再取稳定值。

数字接口的差异与选择

I2C使用两根线(SCL、SDA),支持多设备挂载,适合板级短距离连接,如温湿度、气压传感器。标准模式100kHz、快速模式400kHz,海洋终端中常因电缆较长而降速使用。SPI为四线全双工,速率可达数MHz,适合高速ADC或Flash存储,但每增加一个从设备就多一根片选线。UART异步串行,配置简单,常用于GPS、气象站等输出ASCII报文的设备,需约定波特率、数据位、停止位和校验位。SDI-12是专为环境监测设计的单总线协议,使用一根数据线,以1200bps传输ASCII命令,支持多传感器并联和地址寻址,在海洋浮标、岸基观测站中非常普遍。

SDI-12的典型交互是:终端发送“0M!”启动测量,传感器返回“00014”表示14秒后数据就绪;终端等待后发送“0D0!”读取数据,传感器返回“0+23.45+1.02+7.89”形式的值。地址0~9可区分同一总线上的多个传感器。

采样频率与分辨率的设置原则

采样频率不是越高越好。根据奈奎斯特采样定理,采样率至少为信号最高频率的2倍,工程上常取5~10倍。海洋环境参数变化缓慢,水温、盐度通常1分钟一次足够;波浪和湍流需要1~10Hz;振动监测可能到100Hz以上。频率过高会浪费功耗和存储,过低则会丢失事件。分辨率设置要与传感器精度匹配:若传感器本身精度为±0.1℃,ADC却用16位去分辨0.001℃,多出的位数只会放大噪声。

实际配置中还要考虑平均策略。例如每10秒采样一次,连续取8个样本做算术平均,可降低随机噪声约√8≈2.8倍,但会牺牲对突变事件的响应。对于需要捕捉峰值的场景,应改用最大值保持或滑动窗口。

多传感器轮询采集链路 模拟量传感器 4~20mA / 0~5V I2C 传感器 温湿度 / 气压 SPI 传感器 高速ADC / 存储 UART / SDI-12 CTD / 气象站 ADC 采集通道 12/16位 · 参考电压3.3V I2C 总线驱动 100/400kHz · 地址寻址 SPI 主机接口 全双工 · 片选管理 串口 / SDI-12 收发 1200bps · ASCII命令 轮询调度器 按优先级与周期排队 ADC → I2C → SPI → SDI-12 超时重试 · 异常标记 时间戳对齐 数据帧输出 传感器ID · 数值 · 单位 · 时间戳 · 质量码 采样周期与分辨率按传感器类型分别设定,轮询顺序影响总采集时延

多传感器轮询采集实战

假设一个近岸浮标终端需要采集四类数据:压力式水位计(4~20mA,量程0~10m)、I2C气压温度传感器、SPI接口的16位ADC采集溶解氧电极、以及一台SDI-12接口的CTD。主控采用STM32F4系列,系统时钟168MHz。下面给出一个可参考的轮询调度思路。

第一步,为每个传感器定义采集周期和超时时间。水位计每60秒一次,ADC转换加滤波约50ms;气压温度每30秒一次,I2C读取约5ms;溶解氧每60秒一次,SPI读取约2ms;CTD每120秒一次,SDI-12测量命令后需等待约15秒。第二步,建立时间片轮询表,以1秒为基准节拍,每个节拍检查各传感器是否到期。到期任务按“短耗时优先”执行,避免SDI-12的长等待阻塞其他采集。第三步,对SDI-12这类需要等待的传感器采用状态机:发送测量命令后置为“等待中”,在后续节拍中检查是否到达数据就绪时间,就绪后再发读取命令。

// 轮询调度伪代码(示例参数,非实测)
typedef struct {
    uint8_t  id;
    uint32_t period_ms;   // 采集周期
    uint32_t last_ms;     // 上次采集时刻
    uint8_t  state;       // 0=空闲 1=等待就绪
} sensor_task_t;

sensor_task_t tasks[4] = {
    {SENSOR_WATER_LEVEL, 60000, 0, 0},
    {SENSOR_PRESS_TEMP,  30000, 0, 0},
    {SENSOR_DO,          60000, 0, 0},
    {SENSOR_CTD,        120000, 0, 0}
};

void poll_loop(uint32_t now_ms) {
    for (int i = 0; i < 4; i++) {
        if (tasks[i].state == 0 &&
            now_ms - tasks[i].last_ms >= tasks[i].period_ms) {
            start_measurement(tasks[i].id);  // 启动本次采集
            tasks[i].last_ms = now_ms;
        }
    }
    // SDI-12 就绪检查在中断或独立状态机中处理
}

结果判断方面,每个数据帧应附带质量码:0表示正常,1表示超时重试后成功,2表示多次失败,3表示数值超量程。例如水位计读数经换算后为7.82m,在0~10m范围内且质量码为0,可认为有效;若连续三个周期质量码为2,则应检查4~20mA回路是否断线或采样电阻是否虚焊。对于I2C设备,若返回NACK,先检查上拉电阻和地址冲突;对于SDI-12,若命令无响应,优先确认传感器地址和总线空闲电平。

轮询周期之和不能超过最小采集周期的约束。上例中若四个传感器都在同一秒到期,总耗时约50ms+5ms+2ms+15s,SDI-12的15秒等待会显著拉长响应。实际部署时应将SDI-12的测量启动安排在周期起点,利用等待时间执行其他短任务,而不是阻塞等待。

最后,采样频率与分辨率应在系统联调阶段用已知信号源验证。例如向ADC通道输入1.000V基准,读取100次并计算均值与标准差,若均值偏离超过±2LSB,需检查参考电压或增益误差;若标准差过大,则增加均值次数或检查接地与屏蔽。只有接口时序、采样参数和异常处理三者对齐,海洋遥测终端才能在长期无人值守条件下稳定输出可信数据。