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命令,支持多传感器并联和地址寻址,在海洋浮标、岸基观测站中非常普遍。
采样频率与分辨率的设置原则
采样频率不是越高越好。根据奈奎斯特采样定理,采样率至少为信号最高频率的2倍,工程上常取5~10倍。海洋环境参数变化缓慢,水温、盐度通常1分钟一次足够;波浪和湍流需要1~10Hz;振动监测可能到100Hz以上。频率过高会浪费功耗和存储,过低则会丢失事件。分辨率设置要与传感器精度匹配:若传感器本身精度为±0.1℃,ADC却用16位去分辨0.001℃,多出的位数只会放大噪声。
实际配置中还要考虑平均策略。例如每10秒采样一次,连续取8个样本做算术平均,可降低随机噪声约√8≈2.8倍,但会牺牲对突变事件的响应。对于需要捕捉峰值的场景,应改用最大值保持或滑动窗口。
多传感器轮询采集实战
假设一个近岸浮标终端需要采集四类数据:压力式水位计(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,若命令无响应,优先确认传感器地址和总线空闲电平。
最后,采样频率与分辨率应在系统联调阶段用已知信号源验证。例如向ADC通道输入1.000V基准,读取100次并计算均值与标准差,若均值偏离超过±2LSB,需检查参考电压或增益误差;若标准差过大,则增加均值次数或检查接地与屏蔽。只有接口时序、采样参数和异常处理三者对齐,海洋遥测终端才能在长期无人值守条件下稳定输出可信数据。