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



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

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

    关注

    2525

    文章

    48137

    浏览量

    740430
  • 力传感器
    +关注

    关注

    0

    文章

    144

    浏览量

    15086
收藏 人收藏

    评论

    相关推荐

    4525-DS5A001DP差压传感器怎么测量空速

    4525-DS5A001DP差压传感器测量空速通常涉及复杂的仪器和校准过程。一般来说,4525-DS5A001DP差压传感器用于测量两个点之间的压力
    的头像 发表于 03-14 10:48 154次阅读
    <b class='flag-5'>4525-DS5A001DP</b>差压<b class='flag-5'>传感器</b>怎么测量空速

    4525DO-DS5AI001DP压力传感器在新风机系统监测的应用

    这里需要注意4525DO-DS5AI001DP传感器的两个气管的连接方式,基板上有数字的那个气管需要接正气压,另一个接负气压(这里的正、负气压只是两者间的气压大与小),因此,在新风机系统中,我们需要把正气压接口的气管放置于滤网前端,负气压接口放置于滤网后端,这样才能正常的
    的头像 发表于 06-13 14:27 296次阅读
    <b class='flag-5'>4525DO-DS5AI001DP</b><b class='flag-5'>压力传感器</b>在新风机系统监测的应用

    4525DO-DS3AS001DP压力传感器在天然气压站的应用

    管道压缩机站安全仪表系统由4525DO-DS3AS001DP传感器、逻辑控制器和执行器组成,可执行一项或多项安全仪表功能。 安全仪表系统主要用于监控控制系统的状态,判断危险情况,防止危险的发生或减少事故的影响。
    的头像 发表于 06-06 17:20 238次阅读
    <b class='flag-5'>4525DO-DS3AS001DP</b><b class='flag-5'>压力传感器</b>在天然气压站的应用

    4525DO-DS3AI001DP压力传感器

    4525DO-DS3AI001DP压力传感器可以检测到这种变化,并将信号反馈给控制中心,启动增压风机对洁净室进行增压。 类似的应用将在净化车间中找到,无尘车间的洁净度一般在1000级以下,通过风扇恒定增压和自然泄漏来维持室内压力
    的头像 发表于 06-05 18:07 298次阅读
    <b class='flag-5'>4525DO-DS3AI001DP</b><b class='flag-5'>压力传感器</b>

    4525DO-DS3AI002DS压力传感器在洁净室差压检测

    空气体积引擎盖的测试原理通常是差压力类型和热线类型。 4525DO-DS3AI002DS差异传感器测试方法是感知通过分布在长笛管上的差压力传感器的风压的变化,然后将变化信号转换为空气体
    的头像 发表于 06-05 18:05 227次阅读
    <b class='flag-5'>4525DO-DS3AI002DS</b><b class='flag-5'>压力传感器</b>在洁净室差压检测

    4525DO-DS5AI001DP差压传感器在汽车领域应用的注意事项

    4525DO-DS5AI001DP差压传感器主要用于测量两个压力的差值,常用于测量某个设备或部件的前后两端的压力差。对于4525DO-DS5AI00
    的头像 发表于 06-05 18:00 482次阅读
    <b class='flag-5'>4525DO-DS5AI001DP</b>差压<b class='flag-5'>传感器</b>在汽车领域应用的注意事项

    MS4525DO-DS5AI001DP压力传感器的作用

    所谓负压就是利用MS4525DO-DS5AI001DP压力传感器的压差:车内气压低于外界大气压,所以当空气自由流动时, 只能从车外流到车内,车内的空气不会扩散到车外。
    的头像 发表于 06-05 17:56 271次阅读
    <b class='flag-5'>MS4525DO-DS5AI001DP</b><b class='flag-5'>压力传感器</b>的作用

    4525DO-DS3AI005DP压力传感器在环境控制相关应用

    4525DO-DS3AI005DP压力传感器检测到这种变化,并将信号反馈给控制中心,启动增压风机为洁净室增压。
    的头像 发表于 06-05 17:49 253次阅读
    <b class='flag-5'>4525DO-DS3AI005DP</b><b class='flag-5'>压力传感器</b>在环境控制相关应用

    4525DO-DS3AS002DP压力传感器在空气中怎么测量风速

    4525DO-DS3AS002DP差压传感器暴露在被测空气中,与惠斯通电桥相连,通过惠斯通电桥的电阻或电流平衡检测被测段空气的流速。热膜 4525DO-DS3AS002DP 差压传感器
    的头像 发表于 06-02 14:51 272次阅读
    <b class='flag-5'>4525DO-DS3AS002DP</b><b class='flag-5'>压力传感器</b>在空气中怎么测量风速

    MS4525DO-DS5AI001DP空速传感器测量原理

    MS4525DO-DS5AI001DP空速传感器测量原理,它最早是由英国人罗宾逊发明的。 感应部分由三个或四个锥形或半球形空杯组成。 空心杯壳固定在相互成120°的三尖星形支架或相互成90°的十字形支架上。 杯子的凹面为一个方向,整个横臂固定在一根垂直的旋转轴上。
    的头像 发表于 06-02 14:51 448次阅读
    <b class='flag-5'>MS4525DO-DS5AI001DP</b>空速<b class='flag-5'>传感器</b>测量原理

    MS4525DO-DS3AS002DP数字输出差压传感器的数据通道

    从功能上看,传感器实现了对现实世界中某些物理信号(温度、湿度、气压等)的采集。 在使用MS4525DO-DS3AS002DP传感器时,最重要的操作是从 4525DO-002DP
    的头像 发表于 06-02 10:55 355次阅读
    <b class='flag-5'>MS4525DO-DS3AS002DP</b>数字输出差压<b class='flag-5'>传感器</b>的数据通道

    4525DO-DS3AI005DP差压传感器在透析仪中的应用

    4525DO-DS3AI005DP传感器指定满量程压力范围和温度范围读取压力的数字输出。通过使用板载专用集成电路(ASIC)针对传感器偏移、
    的头像 发表于 06-01 10:21 277次阅读
    <b class='flag-5'>4525DO-DS3AI005DP</b>差压<b class='flag-5'>传感器</b>在透析仪中的应用

    4525DO-DS3AS001DP差压传感器在直升机的应用

    4525DO-DS3AS001DP差压传感器提供指定满量程压力范围和温度范围读取压力的数字输出。系列通过使用板载专用集成电路 (ASIC) 针对传感
    的头像 发表于 05-12 16:03 297次阅读
    <b class='flag-5'>4525DO-DS3AS001DP</b>差压<b class='flag-5'>传感器</b>在直升机的应用

    4525DO-DS5AI001DP空速传感器配置步骤

    4525DO-DS5AI001DP传感器上面的动压,动压接直通管下面的静压,静压接侧边有孔的. 采用DF13端子接口。配送端子线可直接与飞控I2C扩展板直接链接
    的头像 发表于 05-11 17:04 634次阅读
    <b class='flag-5'>4525DO-DS5AI001DP</b>空速<b class='flag-5'>传感器</b>配置步骤

    4525DO-DS5AI015DP差压传感器

    压力进行精确控制,泰科的差压压力传感器4525DO-DS5AI015DP满足压力测试范围,带温度补偿功能,而且提供I2C或SPI接口和主控通讯,简单易用,非常适合
    的头像 发表于 05-06 17:18 349次阅读
    <b class='flag-5'>4525DO-DS5AI015DP</b>差压<b class='flag-5'>传感器</b>