大家好,我是【广州工控传感★科技】MS5837-30BA传感器事业部,张工。
MS5837-30BA水深压力传感器模块包括一个高线性压力芯片和一个低功耗24位ADC,内部校准系数。提供精确的数字24位压力和温度值以及不同的操作模式,允许优化转换速度和电流消耗。高分辨率的温度输出允许在没有任何附加传感器的情况下实现高度计和温度计功能。MS5837-30BA可以通过IC总线接口连接到任何微控制器。通信协议简单,无需对设备内部寄存器进行编程。
MS5837-30BA
一. MS5837-30BA水深传感器解读
1.简介:无人机实现定高飞行要依靠高度数据,那么水下航行器想要实现定深航行同样需要垂直方向的位置数据,也就是深度,我们使用MS5837-30BA这款压力传感器来测量水深。关于MS5837的使用网上有很多教程,其实都不用看,看数据手册就行了,写得非常非常全面。什么?看不懂英文?好的我已经把它翻译了一遍,可以说是非常非常详细了,相信我,看了数据手册,就会写驱动程序了。
MS5837-30BA
MS5837-30BA
2. 性能参数
MS5837-30BA可以配置成不同的ADC转换精度,用OSR表示,精度越高转换越慢,下表显示了不同精度对应的转换时间。每次读ADC转换数据前要先发送转换命令,必须要按照最大的转换时间去写一个延时,延时时间够了才能继续发送读转换完成的数据,不然数据是错的。比如OSR=4096时转换时间是7.40-9.04,那么延时时间可以设置成10ms.
3. 典型电路
MS5837使用IIC通讯,典型应用电路如下图。经典的IIC通讯电路。
4. 深度数据解算算法
(1) 一阶算法
数据解算算法说明书里给了流程图
翻译成算法语言:
1) 开始。限定了工作条件,压力测量值0~ 30Bar,温度值范围-20~85℃,参考温度20℃。这个参考温度会用到。
2) 从PROM中读校准参数。一共六个值C1-C6,这组值出厂已经校准过了。其物理含义嘛请看英文表述,不懂也没关系,我们会计算就行了。后面给了推荐的数据类型都为unsigned int16,数据位数16位,数值范围0~65536,最后一列是示例值。这组校准参数是每次上电后必须从传感器内部的PROM中读取一次的,这6个数据C1-C6后面解算要用。
3)读数字压力D1与数字温度和D2,这是MS5837输出的24位模数转换值。推荐数据类型为unsigned int32。这两个数据是原始数据,还不准,需要经过C1-C6这组校准参数去校准。
4) 计算温度。
好地,到这里读到校准后的温度值了。
5) 计算温度补偿后的压力。
提到了一堆物理命名,不用管,应用公式去计算就行了。好的,到这里我们得到温度补偿后的压力值了。
(2) 二阶算法
上面使用的是一阶温度补偿算法,说明书里给了二阶温度补偿后的算法流程图:
相应算法在框图中表示得很清楚哈,命名都为你命好了。最后得到的结果就是TEMP2和P2,也就是二阶算法计算的温度和压力。
5. IIC读数据的寄存器与时序
仔细看看,算法其实很明了,数据的类型,命名都按说明书里推荐的来就行了。那么现在我们只关注怎么去读数据,IIC读数据的关键,一是寄存器地址,二是通信时序。 说明书里写得很详细。
(1)MS5837命令
MS5837只有5个基本命令:
1、复位
2、读取出厂校准值C1-C6
3、数据D1转换(压力值数据)
4、数据D2转换(温度值数据)
5、读取ADC的转换结果(24位温度值与压力值)
每条I2C通信消息已启动条件开始,以停止条件结束。MS5837-30BA地址是1110110x(写:x=0,读:x=1)。即写0xEC,读0xED.
(2)寄存器地址
寄存器地址在下表给出
五个命令对应的寄存器地址显示的很详细了。
1、复位命令寄存器是0x1E ;
2、读取出厂校准值C1-C6,看最后一栏,bit4-bit6为000-111,C1-C6对应的地址为0xA2-0xAC;
3、数据D1转换(压力值数据),注意这是个写命令。这里不同的精度对应地址不一样,对应选择就行,比如OSR=4096,地址为0x48;
4、数据D2转换(温度值数据),注意这是个写命令。这里不同的精度对应地址不一样,对应选择就行,比如OSR=4096,地址为0x58;
5、读转换结果,地址0x00.
(3)通信时序
进一步,继续看通信时序,这里一步都不能错,包括有没有应答信号。
复位命令
写代码的时候按照其时序进行就可以了,示例如下:
读PROM指令(读校准系数C1-C6)
PROM的读取命令由用户在复位后执行一次。校准参数存储在7个地址中,占据112bits的内存空间(每个数据16位)。读PROM命令是8bits,返回数据16bit(MSB模式,也就是高位在低地址)。PROM读指令包含两步,第一步设置系统进入PROM读模式,第二步读返回结果。
以读C3为例:寄存器地址0xA0+3*2
MS5837返回数据位16位:
这一段同样的,写代码的时候按照其时序进行就可以了,注意前面提到了校准系数有6个,依次读六次就行了。示例如下:
好的,现在我们会读PROM中的校准系数了。
数据D1/D2转换
转换命令用于启动未补偿的压力(D1)或未补偿的温度(D2)转换。经过转换之后,使用ADC读命令,结果以MSB模式输出。注意了,每次必须先发送转换命令,而且需要等转换完成,再发送读ADC命令,这样就能读到正确的D1或D2数据。
比如 分辨率=4096,数据类型=D1,
IIC指令启动压力转换(地址0x48)
读ADC数据
等待10ms等转换完成(转换时间查表),转换完成之后发送ADC读命令(0x00)
MS5837的返回数据为24位:
好的,用代码表示上面三步的时序
好的,现在我们会读D1和D2了,结合前面读到的C1-C6,就可以开心的使用算法流程用一阶算法或二阶算法计算温度与压力了,知道了压力就可以计算深度了。
二. STM32读取水深传感器驱动程序
经过上面的解读,相信你已经啥都会了,现在一起来写一下驱动代码。
建立一个MS5837.h和MS5837.c的文件(IIC的驱动就略去不贴了,这里我用的IIC0用以与IIC区分)
MS5837.h文件内容:
MS5837.h文件先按照说明书定义一些变量:
然后添加初始换、复位、读数据等函数:
通过调用 void MS5837_Getdata(float * outTemp, float * outPress)就可以读到经过二阶算法解算的温度与压力值,当然了这个值是绝对压力值,与大气压结合经过计算就能算出深度了。
三. 传感任务增加读水深的应用程序
现在我们继续封装,回到我们之前创建的sensor.h和sensor.c文件,在sensor.c文件中添加以下代码
这个地方我人为的给大气压赋了一个比正常偏小的值,这样算出来的深度永远为正的,对于定深控制是没有影响的。当然了你可以初始化时用MS5837将大气压读出来,再作为测量的大气压值。
当然了,可以滤一下波,还是滑动平均滤波
现在,封装完毕,来到我们的main函数,在之前创建的 sensor_task中添加读深度的代码,更新后如下(建议与上一章对照看)
到这里读水深的任务就完成啦。
-
传感器
+关注
关注
2548文章
50678浏览量
752008 -
芯片
+关注
关注
453文章
50406浏览量
421829
发布评论请先 登录
相关推荐
评论