ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

基于STM32和LabVIEW的海水盐度检测系统设计与实现

基于STM32和LabVIEW的海水盐度检测系统设计与实现 简介一套基于STM32的海水盐度检测系统完整工程配套LabVIEW上位机软件适合单片机开发者及海洋监测相关课程设计、毕业设计参考。系统下位机采用STM32F1与uC/OS-II实现浑浊度传感器AD采集、DS18B20防水温度测量、OLEDSPI七线实时显示并通过ESP8266组建WiFi服务端按问答式通信协议向上位机发送温度、盐度及温补后盐度、补偿百分比包内附带盐度算法公式与系数补偿资料函数接口清晰便于移植或二次开发。资源共1071个文件约24.3MB以嵌入式c/h源码、Keil/UV工程、PDF说明文档及LabVIEW工程文件为主同时包含hex、map、调试记录等辅助文件目录结构完整可对照学习。已有1426人学习下载适合希望快速搭建海水盐度监测原型并掌握STM32ESP8266LabVIEW整套通信链路的开发者。 使用STM32和LabVIEW做了一套海水盐度检测系统今天把整个从硬件选型、下位机程序、上位机界面到联调的过程完整拆解一遍。文中会涉及很多实操细节和踩坑记录希望能给正在做同类项目或者准备用STM32配合LabVIEW做数据采集系统的同学一些参考。1. 系统整体方案与设计思路这套海水盐度检测系统的核心任务是通过电导率传感器采集海水样本的电导率数据结合温度补偿算法换算成盐度值在本地LCD屏上实时显示同时通过串口将数据发送给PC端的LabVIEW上位机实现远程监控、波形显示和数据记录。听到“海水盐度检测”很多人第一反应是去买现成的盐度计模块比如工业用的电导率变送器。这类模块确实省事输出标准的4-20mA或RS485信号但价格偏高而且作为学习或DIY项目来说少了底层信号处理的乐趣。更关键的是如果未来你想拓展测量范围、改进算法或降低成本固化模块基本没有二次开发空间。所以我没有用一体化变送器而是采用传感器探头 信号调理电路 STM32处理的方案。整套系统构成为电导率探头两个石墨电极的电极式探头电极常数K约为1.0信号调理电路交流激励源、I/V变换、精密整流、滤波放大主控STM32F103C8T6完成ADC采样、温度读取、盐度算法、LCD显示、串口发送温度传感器DS18B20用于温度补偿人机交互0.96寸OLED屏调试阶段用或1602LCD成品阶段上位机LabVIEW VISA串口通信 UI界面 数据存储下位机负责采集和计算上位机负责显示和记录中间通过USB转TTL串口连接通信协议是自己定义的Modbus-RTU简化版。这里补充一下为什么用STM32F103C8T6。这块芯片虽然是几年前的“老将”了但胜在性价比极高、资料极多、库函数成熟做这种信号采集和协议转换的活儿绰绰有余。更重要的是绝大多数人电脑里已经备好了它的开发环境不用额外折腾。如果你想直接用STM32F407或H743也完全可以程序逻辑基本一致就是ADC和时钟配置略有差别后面我会提到。2. 盐度检测原理与信号调理电路设计2.1 为什么用电导率法测盐度海水盐度的检测方法主要有重量法烘干称重、银量滴定法化学分析、折射率法光学、电导率法物理电学。前两种精度高但只能离线检测无法实时在线折射率法设备昂贵电导率法因为海水中盐分主要以离子形式存在离子浓度越高导电能力越强电导率和盐度之间存在稳定的对应关系所以成为目前在线盐度检测最主流的手段。用电导率换算盐度本质上是在测量溶液电阻。两片电极插入溶液中溶液相当于一个电阻阻值范围根据盐度不同可能从几十欧到几千欧变化。只要测出这个电阻值再结合温度修正和经验公式就能换算出盐度。但这里有个关键问题直流电通过溶液会发生电解电极表面产生极化导致测量极不稳定。所以绝对不能直接用直流去测溶液电阻必须用交流激励信号。2.2 信号调理电路具体方案借鉴常见工业电导率仪的设计思路我设计了一版简化的信号调理电路整体分为五级激励源用STM32的TIM定时器输出一个频率1kHz、占空比50%的方波经RC低通滤波整形成正弦波再通过电压跟随器驱动电极。方波本身含直流分量必须隔直后再送入电极。I/V变换电极回路串联一个精密采样电阻10Ω通过运放将流过电极的电流信号转换为电压信号。这个环节的核心是运放输入偏置电流要小推荐使用OP07或OPA2277这类低失调运放。隔直与精密整流因为激励是交流信号采样电压也是交流需要先隔直再整流成直流方便ADC采样。用两个二极管加运放组成的半波精密整流电路能把毫伏级的交流信号线性整流为直流。滤波放大整流后的信号含有大量纹波用二阶低通滤波器平滑处理截止频率设为100Hz左右。ADC采样STM32的ADC1通道0采集滤波输出通过DMA方式连续读取32次取平均减小干扰。这套电路的优点是元器件很普通成本十来块钱搞定调试时可以用示波器逐级观察信号波形方便定位问题。缺点是电路板布局和噪声抑制容易踩坑后面第5部分会重点讲。2.3 盐度换算公式与温度补偿电导率受温度影响很大实测数据表明温度每升高1℃电导率大约增加2%左右。如果不对温度做补偿夏天和冬天测同一杯海水读数会差一大截。盐度换算采用国际上常用的经验公式简化处理后如下S a0 a1 * (Gt / G25) a2 * (Gt / G25)^2 a3 * (Gt / G25)^3其中Gt为当前温度下测得的电导率G25为25℃时的标准电导率系数a0、a1、a2、a3是通过标准海水标定得到的常数。实际代码里为了简化计算我采用了更直观的方法先在实验室配制多组已知盐度的标准溶液用系统实测电导率再用最小二乘法拟合成一条“电导率-盐度”曲线标定系数存入Flash。温度补偿使用线性补偿模型G25 Gt / (1 0.02 * (T - 25))这个模型虽然比不过国际标准实用盐度公式PSS-78的精度但用在教学演示和一般水产养殖监测场景完全够用。如果追求更高精度可以引入PSS-78公式的查表法实现不过对MCU的存储和算力要求会高一些。3. STM32下位机程序设计要点3.1 工程创建与资源分配我使用的是STM32标准外设库V3.5版本开发环境为Keil MDK5。工程结构划分为系统时钟、GPIO初始化、TIM定时器、ADC采集、DS18B20驱动、串口通信、盐度算法、主循环。因为F103C8T6只有一个ADC模块但采样通道多我用的是ADC1的通道0配置为连续转换模式配合DMA1通道1自动搬运数据避免CPU反复进出中断。DMA缓冲数组设为64位每满64次触发一次传输完成中断取平均后作为一次有效电导率值。需要注意的一个细节是ADC的采样时间必须和激励信号频率搭配。激励源是1kHz整流滤波后输出基本是一路平滑直流但仍有残余纹波。如果采样时间太短采到的点可能落在纹波的不同相位上导致读数抖动。实测下来ADC采样周期对最终读数平滑度影响很大我最终将ADC采样时间设为239.5个周期配合DMA平均后效果已很理想。3.2 串口通信协议设计下位机每隔500ms主动向上位机发送一帧数据。帧格式定义如下帧头(0xAA) | 功能码(0x01) | 数据长度(0x06) | 盐度高字节 | 盐度低字节 | 温度高字节 | 温度低字节 | 校验和盐度和温度都放大10倍后以整数形式传输比如盐度25.3‰传输为253接收端再除以10。这样做的好处是避免浮点数在串口传输中的字节序问题也方便上位机解析。校验和采用最简单的8位累加和校验从帧头到最后一个数据字节累加取低8位。虽然简单但对于这个数据量很小的场景误码率可以忽略。如果未来要传输更复杂的数据建议换成CRC16。3.3 上位机协议响应的处理我在下位机里多加了一个功能收到上位机的0x02命令时回传当前系统状态包括固件版本、最近一次校准时间、ADC原始值等。这种设计在调试联调阶段非常实用可以直接通过上位机按钮查询下位机状态不必重新插拔USB线看串口助手。4. LabVIEW上位机开发与实现4.1 串口通信模块搭建LabVIEW与STM32通信最常用的方式就是VISA它屏蔽了底层驱动的复杂性拿串口数据就像读文件一样方便。基本流程是VISA Configure Serial Port配置串口号、波特率115200、数据位8、停止位1、无校验VISA Read按预设字节数读取数据解析帧数据查找帧头、校验数据、拆分盐度和温度字节VISA Close程序退出前释放串口资源这里有个容易忽略的地方VISA Read的字节数要设置成“请求读取的字节数”还是“实际存在的字节数”如果请求字节数大于实际到达的字节数VISA会一直等待直到超时时间Timeout到程序界面就卡住了。我最初就踩了这个坑界面每隔几秒假死一次后来改成“VISA Bytes at Serial Port”属性节点先查询缓冲区实际字节数再按实际字节去读问题就消失了。4.2 数据可视化与存储上位机界面分为三个区域仪表盘区域一个圆形仪表显示实时盐度值一个温度计显示实时温度波形图区域盐度和温度的历史趋势图横轴为时间纵轴为盐度值/温度值状态栏区域串口连接状态、数据帧计数、当前时间盐度变化是缓慢过程波形图的显示缓冲区设为2000个点超过后自动滚动覆盖。做这一块时不要在主循环里使用“等待ms”函数而是要使用“等待下一个整数倍毫秒”保证波形图的时间轴均匀推进。数据存储用了“写入测量文件”Express VI它会自动生成带表头的Excel或TDMS文件每一行对应一次采样时间、盐度值、温度值。TDMS文件是NI的专有格式写入速度快但别人没有LabVIEW环境就打不开Excel通用性好但写入频繁时文件会变大变慢。我给这个项目做成了可配置的默认存TDMS勾选“同时导出Excel”时额外写一份Excel。4.3 扩展Modbus RTU与多设备管理做这套系统的时候我还顺便把Modbus RTU模式也加进去了。下位机作为Modbus从站地址为1上位机用LabVIEW的Modbus库做主站。这个功能的价值在于如果以后要多点监测比如不同水深的盐度变化只需给每台设备分配不同地址上位机就能轮询采集多台数据不用重新改通信协议。LabVIEW的Modbus库是NI官方免费提供的安装后直接从函数面板拖出来就能用不需要额外花钱。5. 常见问题与排查技巧实录5.1 ADC采样值跳动特别大现象屏幕上盐度读数乱跳波动范围超过5‰远超正常水平。排查过程首先用万用表测量信号调理电路各级输出电压发现整流滤波输出端电压波动不大问题应该出在ADC采集环节。接着用示波器看STM32的参考电压引脚VREF发现上面叠加了100mV左右的周期波动——这是板载3.3V稳压芯片输出纹波过大导致的。解决方法在VREF引脚和地之间并联一个10uF钽电容和0.1uF瓷片电容ADC采样时间调大增加数字滤波软件上采用滑动平均滤波窗口设为16经过这三步处理后ADC原始值的峰峰值从约45个LSB降到了4个LSB以内换算成盐度误差只有0.1‰左右。5.2 串口连接不上或数据传输乱码这个问题一半以上的同学都会遇到。常见原因有三个串口号不对。USB转TTL模块在老系统上可能分配的不是COM1~COM4而是COM10以后LabVIEW老版本的VISA可能识别不到建议在设备管理器里手动改一个靠前的COM号。波特率不一致。下位机和上位机任何一个地方设错就无法通信。接了CH340的USB转TTL模块但TTL电平的TXD/RXD没有交叉连接。下位机的TXD接USB模块的RXD下位机的RXD接USB模块的TXD很多新手习惯性地“直通”结果数据全乱。另外一个很隐蔽的问题STM32如果用的是5V供电串口电平可能不是标准3.3V个别USB转TTL模块可能识别异常。保险起见STM32板子用3.3V供电USB模块的VCC只用来供它自己。5.3 调试时常见“Error: No STM32 Target Found”这是用ST-Link下载程序时最经典的报错。多数情况是ST-Link和目标板之间的接线问题排查顺序确认SWDIO和SWCLK两根信号线没有接反GND必须共地确认目标板供电正常且电压在规定范围在Keil的Options for Target里重新选择ST-Link Debugger并点击Settings查看是否能扫描到目标芯片IDCODE如果之前程序把SWD引脚复用为普通GPIO需要先按住目标板复位键再点击下载并在下载瞬间释放复位最后一种情况的原理是程序启动后马上把SWD引脚改成了普通GPIO调试器就失去控制能力了。按住复位键时内核暂停在复位状态调试器趁这个间隙尝试连接所以能成功。5.4 LabVIEW安装与运行常见坑LabVIEW 2018之后的安装包都比较大4GB以上安装路径不要带中文或空格否则某些NI驱动可能找不到文件。装好后先在NI MAX里测试能否识别USB转串口设备如果NI MAX里看不到对应设备LabVIEW的VISA自然也无法使用。如果遇到“VISA驱动未安装”的错误去NI官网单独下载NI-VISA最新版安装包重装即可不需要重装LabVIEW。5.5 盐度读数和实际差距大这种情况十有八九是没做标定或者标定系数不对。电导率测量是相对测量必须用标准溶液标定才能准。我用的是购买的25.0‰标准海水盐度校准液在25℃恒温条件下进行一点标定标定好的偏置系数存Flash。需要注意不同批次电极的极板面积、距离有差异电极常数会不同换新探头后必须重新标定。如果条件有限可以用海盐人工配制近似浓度的盐水再用比重计或折射式盐度计做参考配出接近25‰的溶液后再标定。精度虽然没有标准液高但用于日常监测和教学演示足够了。我还做过多点标定用5‰、15‰、25‰、35‰四组标准液分别测电导率然后做二次多项式拟合。实测下来在5‰~35‰范围内单点标定的均方根误差是1.05‰多点标定可以把误差压到0.3‰以内。如果项目对精度要求较高建议做多点标定。6. 扩展思考这套系统目前的通信方式是有线串口还可以做两个方向的升级加一个ESP8266或ESP32将串口数据转为WiFi信号上位机端改用TCP/IP通信实现无线监测。LabVIEW的TCP/IP节点用法和VISA类似学习成本不高。加一个4G模块DTU数据上云小程序或网页端远程查看适合水产养殖基地这种多点多地部署场景。硬件端也可以考虑把电导率探头换成四电极结构能大幅度降低电极极化和海生物附着的影响是工业级产品的标准方案精度和稳定性比两电极高不少。我个人实际做完这套系统最大的体会是测盐度这个任务本身难度不算特别高难点全在信号链路的稳定性和标定的精细程度上。很多同学做完下位机就觉得万事大吉等到联调时才发现一堆模拟电路和通信匹配的问题。建议在做的时候先把信号调理电路单独搭出来用示波器确认每一级输出都在预期范围内再写软件。模数混合系统里硬件不稳软件写得再好也是白搭。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进