0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MS4525DO-DS5AI001DP压力传感器驱动例程

广州工控传感科技有限公司 2023-06-13 15:03 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

大家好,我是【广州工控传感★科技】MS4525DO-DS5AI001DP压力传感器事业部,张工。

很多时候我们需要检测流量和压力这些参数,比如我们要检测大气压,或者通过测量差压来获得输送流体的流量等,都需要用到压力传感器。这一篇我们就来讨论MS4525DO-DS5AI001DP压力传感器的数据获取。

?url=http%3A%2F%2Fdingyue.ws.126.net%2F2023%2F0518%2Fdb791774j00ruu2q000i2d000kl00knp.jpg&thumbnail=660x2147483647&quality=80&type=jpg


MS4525DO-DS5AI001DP

1、功能概述
MS4525DO-DS5AI001DP压力传感器TE可提供指定满量程压力范围和温度范围读取压力的数字输出。MS4525DO-DS5AI001DP压力传感器TE通过使用板载专用集成电路(ASIC)针对传感器偏移、灵敏度、温度效应和非线性进行了充分校准和温度补偿。经校准的压力输出值会在1kHz左右更新。传感器在0℃到60℃的温度范围内进行校准。该传感器可在3.3Vdc或5.0Vdc的单电源条件下工作。可以测量绝压、差压和表压。绝压型号的传感器具备内部真空参照以及与绝压成比例的输出值。差压型号的传感器允许向感应模片的任意一侧加压。表压型号的传感器以大气压力为参考,提供与大气压力变化成比例的输出值.4525DO压力传感器适用于无腐蚀性、非离子气体(例如空气和其他干燥气体)。提供的选件可延伸这些传感器的性能,使其适用于无腐蚀性、非离子的液体。

对外接口采用I2C总线或三线SPI的模式。其结构图如下:

?url=http%3A%2F%2Fdingyue.ws.126.net%2F2023%2F0518%2F6173b72fj00ruu1qx0016d000r700dlp.jpg&thumbnail=660x2147483647&quality=80&type=jpg



1.1、MS4525DO-DS5AI001DP的I2C地址

作为I2C接口的设备都会有一个设备地址,MS4525DO压力传感器也不例外。而MS4525DO-DS5AI001DP传感器的I2C地址在出厂时已特定写入,并根据型号中的字母来指示其地址设定。具体如下:

?url=http%3A%2F%2Fdingyue.ws.126.net%2F2023%2F0518%2F9f38a80dj00ruu1st0038d000i700gyp.jpg&thumbnail=660x2147483647&quality=80&type=jpg



预设的设备地址是7位的,不包含读写位的指示。我们使用时需要将其左移一位并根据读写操作来定义读写位,0为写,1为读。

1.2、数据输出格式

在I2C通讯模式下,MS4525DO-DS5AI001DP压力传感器有四个I2C读取命令,分别为:Read_MR、Read_DF2、Read_DF3和Read_DF4。这四个命令可以获取不同的数据,这些命令的具体报文格式定义如下图:

?url=http%3A%2F%2Fdingyue.ws.126.net%2F2023%2F0518%2F957bb9e6j00ruu23k00cfd000q400m1p.jpg&thumbnail=660x2147483647&quality=80&type=jpg



所以想要获取MS4525DO-DS5AI001DP传感器的数据就需要通过上述命令来实现。从上述的命令报文格式可以看出,这些命令在本质上是没有差别的,都多少数据完全由主机来控制,也就是我们开发的驱动程序来控制。事实上,我们只需要考虑Read_DF4这个命令就可以涵盖所有想要的数据。
我们需要注意的是,上述的报文中有两位存储的是状态信息,该状态信息表示获取的数据是最新的数据还是旧数据或者错误报警。通过判断这个数据可以决定我们在数据解析时如何处理相应的报文。

2、驱动设计与实现
我们已经了解了MS4525DO传感器的结构、接口方式、设备地址以及数据输出格式。接下来我们就可以考虑如何实现MS4525DO-DS5AI001DP传感器的驱动程序了。
2.1、对象定义
我们依然还是先来考虑MS4525DO-DS5AI001DP传感器的对象定义。我们定义一个对象无非考虑属性和操作两个部分。
首先我们来考虑MS4525DO传感器对象的属性。MS4525DO-DS5AI001DP传感器采用I2C接口通讯,所以每台都有一个设备地址。这个地址标识了I2C总线上该设备的唯一性,所以我们将设备地址作为MS4525DO-DS5AI001DP传感器对象的一个属性。对于MS4525DO传感器来说存在多种类型,而不同的类型对应不同的数据计算方式,所以针对某一具体实例,我们需要记录它的类型,所以我们为其定义一个类型属性。我们在计算压力值时,不同的量程最后得到的压力值与测量量程有关,所以我们还需要记录实例的量程上下限,所以将这两个数据也定义为对象的属性。为了操作方便我们将最终得到的温度和压力数据也都作为对象的属性。
从前面的描述中,我们知道MS4525DO-DS5AI001DP传感器的数据输出格式是固定的,这为我们解析这一数据提供了思路。我们将读出的4个字节与我们想要得到的数据组成联合体,利用结构体和联合体在内存中的关系可以方便的解析数据对象,如下图所示:

?url=http%3A%2F%2Fdingyue.ws.126.net%2F2023%2F0518%2F43e9527bj00ruu2fc001zd000fm0088p.jpg&thumbnail=660x2147483647&quality=80&type=jpg



这些个数据即是我们想要的先要得到的,同时他们也记录了MS4525DO传感器对象当前的状态,所以我们将其也作为对象的属性。
其次我们来考虑MS4525DO-DS5AI001DP传感器对象的操作。我们需要将对象的哪些行为定义为操作呢?一般的我们考虑那些不能直接实现,而是要依赖特定的软硬件平台才能实现的对象行为。我们需要向MS4525DO传感器发送命令,也需要从传感器获取对象,而无论读还是写都是依赖于具体的软硬件平台才能去定的,所以我们将向传感器写信息和从传感器读信息作为对象的2个操作。为了控制时序,我们一般需要演示处理函数,而演示处理函数的实现也是依赖于具体的软硬件平台的,所以我们将延时函数定义为对象的一个操作。
我们分析了MS4525DO传感器对象可能的属性和操作。根据前述的分析,我们可以定义MS4525DO传感器对象的类型如下:

/* 定义MS45x5DO对象类型 */
typedef struct MS45x5DOObject {
uint8_t devAddress; //设备地址
union {
struct {
uint16_t pressure:14;
uint16_t status:2;
uint16_t insignificance:5;
uint16_t temperature:11;
}pData;
uint8_t rData[4];
}msData; //读出的数值
MS45x5DOType type; //MS4515DO的类型
float pUpperRange; //压力量程上限
float pLowerRange; //压力量程下限
float fTemperature; //计算的温度值
float fPressure; //计算的压力值
void (*Write)(struct MS45x5DOObject *ms,uint8_t *wData,uint16_t wSize); //向MS45x5DO写数据
void (*Read)(struct MS45x5DOObject *ms,uint8_t *rData,uint16_t rSize); //从MS45x5DO读数据
void (*Delayms)(volatile uint32_t nTime); //毫秒秒延时函数
}MS45x5DOObjectType;

我们定义了MS4525DO-DS5AI001DP传感器对象的类型,使用该类型我们可以定义我们想要的对象变量,但对象变量需要进行必要的配置才能真正地实例化,这个过程我们将其称之为对象的初始化。

/* 初始化MS45x5DO对象 */
void MS45x5DOInitialization(MS45x5DOObjectType *ms, //MS5837对象
uint8_t devAddress, //设备地址
MS45x5DOType type, //MS4515DO的类型
float pMax, //压力量程上限
float pMin, //压力量程下限
MS45x5DOWrite write, //向MS45x5DO写数据函数指针
MS45x5DORead read, //从MS45x5DO读数据函数指针
MS45x5DODelayms delayms //毫秒延时函数指针
)
{
if((ms==NULL)||(write==NULL)||(read==NULL)||(delayms==NULL))
{
return;
}
ms->Write=write;
ms->Read=read;
ms->Delayms=delayms;
if((devAddress==0x28)||(devAddress==0x36)||(devAddress==0x46)||((0x48<=devAddress)&&(devAddress<=0x51)))
{
ms->devAddress=(devAddress<<1);
}
else if((devAddress==0x50)||(devAddress==0x6C)||(devAddress==0x8C)||((0x48<=(devAddress/2))&&((devAddress/2)<=0x51)))
{
ms->devAddress=devAddress;
}
else
{
ms->devAddress=0x00;
}
ms->type=type;
ms->fPressure=0.0;
ms->fTemperature=0.0;
ms->msData.rData[0]=0;
ms->msData.rData[1]=0;
ms->msData.rData[2]=0;
ms->msData.rData[3]=0;
if((fabs(pMax)<=0.0000001)&&(fabs(pMin)<=0.0000001))
{
ms->pUpperRange=100.0;
ms->pLowerRange=0.0;
}
else
{
ms->pUpperRange=pMax;
ms->pLowerRange=pMin;
}
}
2.2、对象操作
我们已经可以得到一个对象变量并将它实例化,我们还需要考虑它的操作问题。对于MS4525DO传感器来说其操作比较简单,最主要的操作包括数据获取和地址设定。
2.2.1、获取数据
对于我们来说获取MS4525DO传感器的测量数据是我们的主要目的。我们可以从MS4525DO传感器获取压力和温度数据,其测量范围与输出数据的对应关系如下图所示:

?url=http%3A%2F%2Fdingyue.ws.126.net%2F2023%2F0518%2Fe39409f7j00ruu2i2004jd000qf009xp.jpg&thumbnail=660x2147483647&quality=80&type=jpg



根据上表中的数据对应关系,我们可以编写获取MS4525DO-DS5AI001DP传感器的数据并解析的函数。

/*获取转换值,包括温度和压力*/
void GetMS45x5DOConversionValue(MS45x5DOObjectType *ms)
{
uint8_t rData[4]={0,0,0,0};
float maxCount=16383;
float minCount=0;
if(ms->type==MS45x5DO_TypeA)
{
maxCount=13106;
minCount=1638;
}
else
{
maxCount=14746;
minCount=819;
}
ms->Read(ms,rData,4);
ms->msData.rData[0]=rData[1];
ms->msData.rData[1]=rData[0];
ms->msData.rData[2]=rData[3];
ms->msData.rData[3]=rData[2];
if(ms->msData.pData.status!=MS45x5DO_Fault)
{
ms->fPressure=(((float)ms->msData.pData.pressure-minCount)/maxCount)*(ms->pUpperRange-ms->pLowerRange)+ms->pLowerRange;
ms->fTemperature=((float)ms->msData.pData.temperature/2047.0)*200.0-50.0;
}
}
2.2.2、地址设置

关于MS4525DO传感器,在出厂时已经设定了设备地址并在型号编码中给予指示。但在一些特殊情形下我们可能需要修改它的设备地址,这就需要用到和MS4525DO传感器的地址修改操作。

/*修改MS45x5DO的设备地址*/
void ModifyMS45x5DODecAddress(MS45x5DOObjectType *ms,uint8_t newAddress)
{
uint8_t eepromByte[3];
uint16_t eepromTemp=0x00;
//第1步、进入命令模式
eepromByte[0]=0xA0;
eepromByte[1]=0x00;
eepromByte[2]=0x00;
ms->Write(ms,eepromByte,3);
//第2步、发送读EEPROM命令
eepromByte[0]=0x02;
eepromByte[1]=0x00;
eepromByte[2]=0x00;
ms->Write(ms,eepromByte,3);
//第3步、获取EEPROM的值
ms->Read(ms,eepromByte,3);
//第4步、修改为新地址
if(eepromByte[0]==0x5A)
{
eepromTemp=(eepromByte[1]<<8)+eepromByte[2];
eepromTemp=(eepromTemp&0xE007)+0xC00+(newAddress<<3);
eepromByte[1]=(uint8_t)((eepromTemp&0xFF00)>>8);
eepromByte[1]=(uint8_t)(eepromTemp&0x00FF);
}
else
{
return;
}
//第5步、将新地址写入EEPROM
eepromByte[0]=0x02;
ms->Write(ms,eepromByte,3);
//第6步、退出命令模式
eepromByte[0]=0x80;
eepromByte[1]=0x00;
eepromByte[2]=0x00;
ms->Write(ms,eepromByte,3);
}
3、驱动的使用
我们已经设计并实现了MS4525DO压力传感器的驱动程序。接下来我们将简单的说明如何使用这一驱动,并设计一个简单的示例验证这一驱动程序的正确性。
3.1、声明并初始化对象
我们是基于对象设计的MS4525DO压力传感器的驱动程序,所以在使用驱动时,我们需要先声明一个对象变量,然后基于该对象变量来实现具体的对象操作。我们先声明对象如下:

MS45x5DOObjectType msDP;
声明了这个对象变量之后,我们还需要使用初始化函数对其进行初始化方可使用。这一初始化函数拥有8个参数:

MS45x5DOObjectType *ms, //MS5837对象
uint8_t devAddress, //设备地址
MS45x5DOType type, //MS4515DO的类型
float pMax, //压力量程上限
float pMin, //压力量程下限
MS45x5DOWrite write, //向MS45x5DO写数据函数指针
MS45x5DORead read, //从MS45x5DO读数据函数指针
MS45x5DODelayms delayms //毫秒延时函数指针

第一个参数正是我们要初始化的对象变量。第二个参数为我们所要操作的MS4525DO-DS5AI001DP对象的设备地址。第三个参数是MS4525DO对象的具体类型,根据实际设备选择枚举即可。第四和第五个参数是该对象的物理量量程,根据具体对象而定。后面三个参数是实现对象操作的函数指针。这三个函数指针需要我们根据具体的软硬件平台来实现。它们的原型如下:

/*向MS45x5DO下发指令,指令格式均为1个字节*/
typedef void (*MS45x5DOWrite)(struct MS45x5DOObject *ms,uint8_t *wData,uint16_t wSize);
/*从MS45x5DO读取多个字节数据的值*/
typedef void (*MS45x5DORead)(struct MS45x5DOObject *ms,uint8_t *rData,uint16_t rSize);
/*毫秒秒延时函数*/
typedef void (*MS45x5DODelayms)(volatile uint32_t nTime);
我们根据函数原型定义,在具体的实现平台上实现它们,如我们在STM32平台上可以实现如下:

/*向MS45x5DO下发指令,指令格式均为1个字节*/
static void WriteToDP(MS45x5DOObjectType *ms,uint8_t *wData,uint16_t wSize)
{
HAL_I2C_Master_Transmit(&hi2c2,ms->devAddress,wData,wSize,1000);
}
/*从MS45x5DO读取多个字节数据的值*/
static void ReadFromDP(MS45x5DOObjectType *ms,uint8_t *rData,uint16_t rSize)
{
HAL_I2C_Master_Receive(&hi2c2,ms->devAddress,rData, rSize, 1000);
}
延时函数我们可以直接使用HAL库中的HAL_Delay也可以自己编写,在HAL库中HAL_Delay是一个弱化定义的函数,我们可以重写这一函数来实现不同的应用需求。到这里我们就可以使用对象初始化函数来初始化前面声明的对象变量了。具体如下:

MS45x5DOInitialization(&msDP, //MS5837对象
0x28, //设备地址
MS45x5DO_TypeA, //MS4515DO的类型
DPUpperRange, //压力量程上限
DPLowerRange, //压力量程下限
WriteToDP, //向MS45x5DO写数据函数指针
ReadFromDP, //从MS45x5DO读数据函数指针
HAL_Delay //毫秒延时函数指针
);
3.2、基于对象进行操作

完成了对象的初始化后,我们就可以基于对象来实现相应的操作了。如我们使用驱动获取msDP对象的差压数据如下:

/*差压数据获取*/
void GetFlowDPDatas(void)
{
GetMS45x5DOConversionValue(&msDP);
aPara.phyPara.dPressure =msDP.fPressure;
aPara.phyPara.dTemperature=msDP.fTemperature;
}
4、应用总结

我们设计并实现了MS4525DO-DS5AI001DP压力传感器对象的驱动程序,并基于驱动程序实现了一个简单的测试实例,获得的结果如下:

?url=http%3A%2F%2Fdingyue.ws.126.net%2F2023%2F0518%2Fc123c984j00ruu2n1000qd000ae00k5p.jpg&thumbnail=660x2147483647&quality=80&type=jpg



从上述两图中我们可以知道我们的驱动程序是正确的。事实上这一驱动已应用于我们的流量测量设备中,实现的效果良好。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2578

    文章

    55895

    浏览量

    795874
  • 力传感器
    +关注

    关注

    0

    文章

    171

    浏览量

    15977
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    恒流驱动和恒压驱动压力传感器到底有什么区别?

    恒流驱动和恒压驱动压力传感器(尤其是基于压阻式原理的传感器)最常见的两种供电与信号读取方式。它们的主要区别在于测量原理、精度、线性度以及对环境变化的适应性。简单来说:恒压
    的头像 发表于 04-01 12:07 354次阅读
    恒流<b class='flag-5'>驱动</b>和恒压<b class='flag-5'>驱动</b>的<b class='flag-5'>压力传感器</b>到底有什么区别?

    TE 85-500A-4C压力传感器:精准可靠之选

    82CV-005G-R 82CV-015G-R 82CV-300G-R 1230-030D-3S 4515DO-DS5AI002DP 4515DO-DS5AI020DP 4525DO-SS5AI
    发表于 03-04 14:33

    无人机为啥都用 MS4525DO 空速计?

    的明星产品——MS4525DO-DS5AI001DP差压传感器,看看它为何能成为无人机空速测量的理想选择。空速测量的挑战:为什么需要专用传感器?首先,我们要理解无
    的头像 发表于 03-04 12:02 650次阅读
    无人机为啥都用 <b class='flag-5'>MS4525DO</b> 空速计?

    探秘XKP压力传感器:汽车与赛车运动的理想之选

    探秘XKP压力传感器:汽车与赛车运动的理想之选 在汽车和赛车运动领域,压力传感器的性能至关重要。今天,我们就来深入了解一款备受瞩目的压力传感器——XKP压力传感器。 文件下载: Amp
    的头像 发表于 12-11 14:10 623次阅读

    压力传感器压力换能器还是压力变送器?

    压力传感器压力换能器和压力变送器这几个术语在工业领域的某些情况下是可互换的。压力传感器使用毫伏级的信号描述,而压力变送器可以用4-20mA
    的头像 发表于 11-10 12:13 2072次阅读
    <b class='flag-5'>压力传感器</b>、<b class='flag-5'>压力</b>换能器还是<b class='flag-5'>压力</b>变送器?

    ‌ILPS22QS压力传感器评估套件技术解析与应用指南

    STMicroelectronics STEVAL-MKI228KA压力传感器套件包括STEVAL-MKI228A和STREVAL-MKE001A。STEVAL-MKI228A将ILPS22QS
    的头像 发表于 10-30 11:27 784次阅读
    ‌ILPS22QS<b class='flag-5'>压力传感器</b>评估套件技术解析与应用指南

    STEVAL-MKI223V1K压力传感器套件技术解析与应用指南

    STMicroelectronics STEVAL-MKI223V1K压力传感器套件具有一块由安装了ILPS28QSW压力传感器(具有Qvar静电传感器)和滑动电极的特定PCB组成的电路板。该套件
    的头像 发表于 10-24 15:06 1209次阅读
    STEVAL-MKI223V1K<b class='flag-5'>压力传感器</b>套件技术解析与应用指南

    如何优化气体压力传感器性能,提高传感器测量精度?

    气体压力传感器是一种用于测量气体压力的装置,其精度直接影响到工业自动化控制的效果。在生产过程中,气体压力传感器的精度越高,控制效果越好,生产效率也越高。因此,提高气体压力传感器的精度至
    的头像 发表于 10-18 17:21 2890次阅读

    如何判断压力传感器的线性度?

    判断压力传感器的线性度是一个非常重要且常见的任务,它直接关系到传感器的测量精度。一、什么是线性度?线性度,也称为非线性误差,是指压力传感器的实际输出特性曲线(输出信号与输入压力之间的关
    的头像 发表于 09-26 12:03 2497次阅读
    如何判断<b class='flag-5'>压力传感器</b>的线性度?

    【经验】SRT3000压力传感器技术详解之参数如何匹配设计需求

    在《恒流源驱动的低压力传感器SRT3000》一文中介绍了SRT3000压力传感器的基本参数,本期我继续就SRT3000压力传感器上常见的几个参数做简单的介绍,因为理解这些参数有助于我们
    的头像 发表于 09-22 12:14 1128次阅读
    【经验】SRT3000<b class='flag-5'>压力传感器</b>技术详解之参数如何匹配设计需求

    瑞之辰压力传感器,小尺寸的国产替代新风潮

    近年来,国内压力传感器市场呈现出蓬勃发展的态势。随着工业4.0、智能制造等概念的深入推进,电动汽车、智慧医疗、消费电子等行业对高精度压力传感器的需求持续攀升,促使市场规模不断扩大。瑞之辰旗下MEMS
    的头像 发表于 09-01 16:26 1952次阅读
    瑞之辰<b class='flag-5'>压力传感器</b>,小尺寸的国产替代新风潮

    【选型】如何正确区分压力传感器压力变送器

    在使用压力传感器的时候,很多人也听说过压力变送器,这两者之间容易搞混,常常让人比较困惑它们有什么区别和联系。压力传感器压力传感器通常指非标准mV级信号输出的元件,由于信号的非标准性,用
    的头像 发表于 06-30 14:00 1100次阅读
    【选型】如何正确区分<b class='flag-5'>压力传感器</b>和<b class='flag-5'>压力</b>变送器

    压电式压力传感器测试介绍# 传感器# 压力传感器

    压力传感器
    萝卜坑C
    发布于 :2025年06月25日 11:09:09

    Melexis压力传感器技术的应用领域

    在科技飞速发展的今天,压力传感器技术正悄然改变着我们的生活与工作方式。今天,就带大家深入了解压力传感器技术及其在多领域的精彩应用。
    的头像 发表于 06-25 10:04 1136次阅读

    MS4525DO-TP3AJ030APF压力传感器测量气压高度

    MS4525DO-TP3AJ030APF传感器10kHz的高频采样能力可捕捉到气压的瞬时波动,配合I²C数字输出接口,能实时传输数据至飞控系统。在气压高度的的实测中发现,其海拔高度分辨率可达0.1米。传感器经过-40℃至125℃
    的头像 发表于 06-03 10:19 1286次阅读
    <b class='flag-5'>MS4525DO</b>-TP3AJ030APF<b class='flag-5'>压力传感器</b>测量气压高度