MS5837压力传感器是一种可用于电路板上,适用于检测10-1200mbar压力范围的传感器,灵敏度非常高,理论上能够检测到0.01mbar的压力变化,实际使用过程中测试并无明显的变化。

MS5837采用I2C总线通讯,与STM32的MCU可以实现I2C通讯。硬件连接方式如下:

MS5837只有5个基本命令:复位、读取出厂校准值、数据1转换(压力值数据)、数据2转换(温度值数据)和读取ADC的转换结果。具体分配如下:

因为MS5837的地址是固定的,所以一个I2C总线只能挂1个MS5837模块。为了让程序具有较好的可移植性,我们在便写程序时不使用对硬件的直接操作,而采用函数指针来操作,所以我们定义了:

/*向MS5837下发指令,指令格式均为1个字节*/

typedef void (*WriteCommandToMs5837Type)(uint8_t deviceAddress,uint8_t command);

/*从MS5837读取多个字节数据的值*/

typedef void (*ReadBytesFromMs5837Type)(uint8_t deviceAddress,uint8_t *pData,uint16_t bytesNum);

以上两个函数指针来实现针对硬件的读写操作。接下来我们开始编写代码。

1)复位操作

复位操作的数据流如下图所示,只需要发送一条命令就可完成:

/*复位MS5837操作*/

void ResetForMs5837(uint8_t deviceAddress,WriteCommandToMs5837Type WriteCommandToMs5837)

{

  uint8_t command=COMMAND_RESET;

  /*下发复位命令*/

  WriteCommandToMs5837(deviceAddress,command);

}

2)读取校准值

校准值是出厂时厂家校准的各种系数,每台设备都有差异,是固定不变的,只需要一次读取就可以了,共有6个系数,均为16为整数。首先发送读系数的命令,然后读取就可以了,每次读取1个,分6次读取。过程数据流如下图所示:

/*从MS5837的PROM中读取校准数据*/

void GetCalibrationData(uint8_t deviceAddress,uint16_t *caliPara,WriteCommandToMs5837Type WriteCommandToMs5837,ReadBytesFromMs5837Type ReadBytesFromMs5837)

{

  /*C1压力灵敏度*/

  caliPara[]=ReadPromFromMs5837(deviceAddress,COMMAND_PROM_READ_C1,WriteCommandToMs5837,ReadBytesFromMs5837);

  /*C2压力补偿值*/

  caliPara[]=ReadPromFromMs5837(deviceAddress,COMMAND_PROM_READ_C2,WriteCommandToMs5837,ReadBytesFromMs5837);

  /*C3压力灵敏度温度系数*/

  caliPara[]=ReadPromFromMs5837(deviceAddress,COMMAND_PROM_READ_C3,WriteCommandToMs5837,ReadBytesFromMs5837);

  /*C4压力补偿温度系数*/

  caliPara[]=ReadPromFromMs5837(deviceAddress,COMMAND_PROM_READ_C4,WriteCommandToMs5837,ReadBytesFromMs5837);

  /*C5参考温度*/

  caliPara[]=ReadPromFromMs5837(deviceAddress,COMMAND_PROM_READ_C5,WriteCommandToMs5837,ReadBytesFromMs5837);

  /*C6温度传感器温度系数*/

  caliPara[]=ReadPromFromMs5837(deviceAddress,COMMAND_PROM_READ_C6,WriteCommandToMs5837,ReadBytesFromMs5837);

}

3)读取转换值

读取转换结果值是我们的目的,可以读取温度和压力两个量,不过一次只能读一个。首先发送命令设定采集压力还是温度,并设定精度。然后发送读取的命令,最后读取对应的值。再使用校准系数计算出最终的物理值。

/*获取转换值,包括温度和压力*/

void GetConversionValue(uint8_t deviceAddress,float *pPres,float *pTemp,uint16_t *caliPara,uint16_t *semaphore,WriteCommandToMs5837Type WriteCommandToMs5837,ReadBytesFromMs5837Type ReadBytesFromMs5837)

{

  uint16_t senst1;        //C1压力灵敏度

  uint16_t offt1;         //C2压力补偿值

  uint16_t tcs;           //C3压力灵敏度温度系数

  uint16_t tco;           //C4压力补偿温度系数

  uint16_t tref;          //C5参考温度

  uint16_t tempsens;      //C6温度传感器温度系数

  /*从MS5837的PROM中读取校准数据*/

  if(*semaphore>)

  {

    GetCalibrationData(deviceAddress,caliPara,WriteCommandToMs5837,ReadBytesFromMs5837);

    *semaphore=*semaphore-;

  }

  senst1=caliPara[];

  offt1=caliPara[];

  tcs=caliPara[];

  tco=caliPara[];

  tref=caliPara[];

  tempsens=caliPara[];

  uint32_t digitalPressureValue;

  uint32_t digitalTemperatureValue;

  /*读取压力数据*/

  digitalPressureValue=ReadConversionFromMs5837(deviceAddress,COMMAND_CONVERTD1OSR4096,WriteCommandToMs5837,ReadBytesFromMs5837);

  Delayms();

  /*读取温度数据*/

  digitalTemperatureValue=ReadConversionFromMs5837(deviceAddress,COMMAND_CONVERTD2OSR4096,WriteCommandToMs5837,ReadBytesFromMs5837);

  /*对温度进行一阶修正*/

  int32_t dT;

  int32_t temp;

  dT=digitalTemperatureValue-tref*;

  temp=(int32_t)(+dT*tempsens/pow(,));

  /*对压力进行一阶修正*/

  int64_t off;

  int64_t sens;

  int32_t pres;

  off=(int64_t)(offt1*pow(,)+(tco*dT)/pow(,));

  sens=(int64_t)(senst1*pow(,)+(tcs*dT)/pow(,));

  pres=(int32_t)((digitalPressureValue*sens/pow(,)-off)/pow(,));

  /*对温度和压力进行二阶修正*/

  int64_t ti=;

  int64_t offi=;

  int64_t sensi=;

  int64_t off2=;

  int64_t sens2=; 

  if(temp<)

  {

    ti=(int64_t)(*dT*dT/pow(,));

    offi=(int64_t)(*(temp-)*(temp-)/pow(,));

    sensi=(int64_t)(*(temp-)*(temp-)/pow(,));

    off2=off-offi;

    sens2=sens-sensi;

    temp=temp-(int32_t)ti;

    pres=(int32_t)((digitalPressureValue*sens2/pow(,)-off2)/pow(,));

  }

  if((-<=temp)&&(temp<=))

  {

    *pTemp=(float)temp/100.0;

  }

  if((<=pres)&&(pres<=))

  {

    *pPres=(float)pres/100.0;

  }

}

最终在STM32的I2C接口实现通讯时,实现2个WriteCommandToMs5837Type(uint8_t deviceAddress,uint8_t command);和ReadBytesFromMs5837Type(uint8_t deviceAddress,uint8_t *pData,uint16_t bytesNum);函数并调用就可以了,换做其他的平台也只需要重写这两个函数就能实现通讯了。

STM32应用实例六:与MS5837压力传感器的I2C通讯的更多相关文章

  1. STM32应用实例五:与SHT1X温湿度传感器通讯

    在这次项目开发中应用到了SHT1X温湿度传感器,该系列有SHT10.SHT11和SHT15,属于Sersirion温湿度传感器家族中的贴片封装系列.包括一个电容性聚合体测湿敏感元件.一个用能隙材料制成 ...

  2. C语言库函数大全及应用实例六

    原文:C语言库函数大全及应用实例六                                              [编程资料]C语言库函数大全及应用实例六 函数名: getlinesett ...

  3. STM32应用实例十:简析STM32 I2C通讯死锁问题

    I2C接口是一种使用非常普遍的MCU与外部设备的接口方式,在STM32中也集成了I2C接口,我们也常常使用它来与外围的传感器等设备通讯. 最近在我们使用STM32F1VET6读取压力和温湿度传感器数据 ...

  4. STM32应用实例八:与多台MS5803压力传感器I2C通讯

    MS5803压力传感器支持SPI和I2C总线通讯,拥有24位AD转换.能够同时获得压力值和温度值,其中压力测量范围为10-1100mbar,温度的测量范围是-40-85摄氏度.各引脚功能及参数如下: ...

  5. STM32学习笔记(六) SysTick系统时钟滴答实验(stm32中断入门)

    系统时钟滴答实验很不难,我就在面简单说下,但其中涉及到了STM32最复杂也是以后用途最广的外设-NVIC,如果说RCC是实时性所必须考虑的部分,那么NVIC就是stm32功能性实现的基础,NVIC的难 ...

  6. python 实例六

    https://www.cnblogs.com/evablogs/p/6783498.html 题目:斐波那契数列. 程序分析:这个数列从第3项开始,每一项都等于前两项之和.故 n=1,2,f=1 n ...

  7. ASP.NET MVC3 实例(六) 增加、修改和删除操作(二)

    http://www.jquery001.com/asp.net-mvc3-instance-add-update-delete2.html 上篇我们在 ASP.NET MVC3 中实现了添加操作,由 ...

  8. STM32应用实例十五:STM32的ADC通道间干扰的问题

    最近我们在开发一个项目时,用到了MCU自带的ADC,在调试过程中发现通道之间村在相互干扰的问题.以前其实也用过好几次,但要求都不高所以没有太关注,此次因为物理量的量程较大,所以看到了变化. 首先来说明 ...

  9. STM32应用实例十四:利用光敏二极管实现光度测量

    最近我们在开发臭氧发生器时,需要监测生成的臭氧的浓度,于是想到使用光度计来测量.因为不同浓度的臭氧对管的吸收作用是不相同的,于是检测光照强度的变化就可以得到相应的浓度数据. 1.硬件设计 此次光照度检 ...

随机推荐

  1. word中批量修改图片大小的两个方法

    前言: 对于把ppt的内容拷贝到word中: 对ppt的一页进行复制,然后粘贴到word中 如果要的是ppt运行过程中的内容,在qq运行的情况下,按Ctrl+Alt+A截屏,按勾,然后可以直接粘贴到w ...

  2. Java使用SFTP和FTP两种连接方式实现对服务器的上传下载 【我改】

    []如何区分是需要使用SFTP还是FTP? []我觉得: 1.看是否已知私钥. SFTP 和 FTP 最主要的区别就是 SFTP 有私钥,也就是在创建连接对象时,SFTP 除了用户名和密码外还需要知道 ...

  3. 代码实战之AdaBoost

    尝试用sklearn进行adaboost实战 & SAMME.R算法流程,博客地址 初试AdaBoost SAMME.R算法流程 sklearn之AdaBoostClassifier类 完整实 ...

  4. Maven web 项目工程的建立

    打开eclipse,mars版本的已经集成了maven. 1. new 一个 maven project,勾选Create a simple project(这样就省去了建立文件夹的过程) 2. 选择 ...

  5. 投票wchat

    https://jingyan.baidu.com/article/0964eca27d3c8d8285f5363f.html 打开微信,进入“通讯录”,如下图中1对应位置. 2 在微信中“添加好友” ...

  6. 目前最全的IT技术问答、社区、科技服务网站合集

    资源网站 推荐一个资源丰富齐全的网站:风云社区(SCOEE),主要特点是提供的是纯净.优质.无广告.无附加东西的资源.资源很丰富,包括各类软件资源(mac.Windows.ios.ipad.安装等软件 ...

  7. 浅谈python函数签名

    函数签名对象,表示调用函数的方式,即定义了函数的输入和输出. 在Python中,可以使用标准库inspect的一些方法或类,来操作或创建函数签名. 获取函数签名及参数 使用标准库的signature方 ...

  8. Hive记录-Hive常用命令操作

    1.hive支持四种数据模型 • external table ---外部表:Hive中的外部表和表很类似,但是其数据不是放在自己表所属的目录中,而是存放到别处,这样的好处是如果你要删除这个外部表,该 ...

  9. 按某个属性排序(字典序,ascII) js/python

    javascrapy方法 var compare = (prop)=>{ return (a,b)=>{ : - } } javascrapy测试代码 var aaa = [ {name: ...

  10. 用ajax传递json,返回前台的中文乱码问题

    java项目中用ajax传递json,返回前台时中文出现问号(乱码问题)的解决办法 首先看一下没有解决前的状态: 我用的框架是ssm,在springMVC中我配置了编码格式为utf-8,每个jsp页面 ...