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

传感器内部结构图如下:

通讯协议的选择通过PS引脚来设置:

PS引脚电位

通讯模式

使用的引脚

高电平

I2C

SDA, SCL, CSB

低电平

SPI

SDI, SDO, SCLK, CSB

在SPI模式下,SCLK作为外部输入时钟,SDI作为串行数据输入,支持Mode0和Mode3的时钟极性和相位。传感器的响应数据输出为SDO引脚,片选信号为CSB引脚。接线示意图如下:

在I2C模式下,SCLK为外部串行时钟输入,SDA位串行数据通讯。CSB引脚作为地只选择,可以链接到VDD或者GND,这也意味着MS5803可以在一条I2C总线接两个设备。在CSP接高电平时,地址为0x76(1110110 b),而CSB接低电平时,地址为0x77 (1110111 b)这个地址是高七位,最后以为有读写命令来决定。实现写命令时,最后一位为0,实现读命令时,最后一位为1。

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

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

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

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

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

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

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

(1)复位操作

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

/*复位MS5803操作*/

void ResetForMS5803(uint8_t deviceAddress,WriteCommandToMS5803Type WriteCommandToMS5803)

{

uint8_t command=COMMAND_RESET;

/*下发复位命令*/

WriteCommandToMS5803(deviceAddress,command);

}

(2)读取校准值

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

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

void GetCalibrationData(uint8_t deviceAddress,uint16_t *caliPara,WriteCommandToMS5803Type WriteCommandToMS5803,ReadBytesFromMS5803Type ReadBytesFromMS5803)

{

/*C1压力灵敏度*/

caliPara[0]=ReadPromFromMS5803(deviceAddress,COMMAND_PROM_READ_C1,WriteCommandToMS5803,ReadBytesFromMS5803);

/*C2压力补偿值*/

caliPara[1]=ReadPromFromMS5803(deviceAddress,COMMAND_PROM_READ_C2,WriteCommandToMS5803,ReadBytesFromMS5803);

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

caliPara[2]=ReadPromFromMS5803(deviceAddress,COMMAND_PROM_READ_C3,WriteCommandToMS5803,ReadBytesFromMS5803);

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

caliPara[3]=ReadPromFromMS5803(deviceAddress,COMMAND_PROM_READ_C4,WriteCommandToMS5803,ReadBytesFromMS5803);

/*C5参考温度*/

caliPara[4]=ReadPromFromMS5803(deviceAddress,COMMAND_PROM_READ_C5,WriteCommandToMS5803,ReadBytesFromMS5803);

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

caliPara[5]=ReadPromFromMS5803(deviceAddress,COMMAND_PROM_READ_C6,WriteCommandToMS5803,ReadBytesFromMS5803);

}

(3)读取转换值

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

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

void GetConversionValue(uint8_t deviceAddress,float *pPres,float *pTemp,uint16_t *caliPara,uint16_t *semaphore,WriteCommandToMS5803Type WriteCommandToMS5803,ReadBytesFromMS5803Type ReadBytesFromMS5803)

{

uint16_t senst1;        //C1压力灵敏度

uint16_t offt1;         //C2压力补偿值

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

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

uint16_t tref;          //C5参考温度

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

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

if(*semaphore>0)

{

GetCalibrationData(deviceAddress,caliPara,WriteCommandToMS5803,ReadBytesFromMS5803);

*semaphore=*semaphore-1;

}

senst1=caliPara[0];

offt1=caliPara[1];

tcs=caliPara[2];

tco=caliPara[3];

tref=caliPara[4];

tempsens=caliPara[5];

uint32_t digitalPressureValue;

uint32_t digitalTemperatureValue;

/*读取压力数据*/

digitalPressureValue=ReadConversionFromMS5803(deviceAddress,COMMAND_CONVERTD1OSR4096,WriteCommandToMS5803,ReadBytesFromMS5803);

Delayms(20);

/*读取温度数据*/

digitalTemperatureValue=ReadConversionFromMS5803(deviceAddress,COMMAND_CONVERTD2OSR4096,WriteCommandToMS5803,ReadBytesFromMS5803);

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

int32_t dT;

int32_t temp;

dT=digitalTemperatureValue-tref*256;

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

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

int64_t off;

int64_t sens;

int32_t pres;

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

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

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

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

int64_t ti=0;

int64_t offi=0;

int64_t sensi=0;

int64_t off2=0;

int64_t sens2=0;

if(temp<2000)

{

ti=(int64_t)(11*dT*dT/pow(2,35));

offi=(int64_t)(31*(temp-2000)*(temp-2000)/pow(2,3));

sensi=(int64_t)(63*(temp-2000)*(temp-2000)/pow(2,5));

off2=off-offi;

sens2=sens-sensi;

temp=temp-(int32_t)ti;

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

}

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

{

*pTemp=(float)temp/100.0;

}

if((1000<=pres)&&(pres<=190000))

{

*pPres=(float)pres/100.0;

}

}

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

欢迎关注:

STM32与多台MS5803压力传感器I2C通讯相关推荐

  1. STM32应用实例六:与MS5837压力传感器的I2C通讯

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

  2. STM32与MS5837压力传感器的I2C通讯

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

  3. stm32学习开发记录:OLED——I2C

    [缓慢施工中] 一.STM32 HAL库的I2C API 在Keil--help中可以直接找到对应开发板所需的编程资料. 找到HAL库关于I2C函数的说明: I2C使用流程: (1)I2C参数初始化, ...

  4. STM32F0+模拟I2C通讯

    所谓的硬件I2C就是STM32芯片上有其相应的外设和驱动电路,通过配置相应的寄存器,就可以完成I2C的通信.本节实验我们介绍软件模拟I2C,软件I2C一般是通过GPIO引脚,按照I2C的时序要求来控制 ...

  5. 使用TEA5767和stm32制作一台数字FM收音机

    本节我们来使用stm32控制一款集成收音机芯片TEA5767,来制作一台FM收音机. TEA5767是一款低功耗立体声收音IC,接收频率76MHz-108MHz(适应日本/美国/欧洲各FM频段选择)并 ...

  6. 西门子1200与台达MS300变频器通讯程序

    西门子1200与台达MS300变频器通讯程序 器件:西门子1200 PLC,台达ms300变频器,西门子KTP700 Basic Pn触摸屏,昆仑通态触摸屏(带以太网),中途可以加路由器 控制方式:触 ...

  7. 西门子s7-1200博图v16灌装机PLC程序+西门子KTP1200触摸屏程序 1200plc和3台v90伺服pn通讯

    西门子s7-1200博图v16灌装机PLC程序+西门子KTP1200触摸屏程序,设备上已使用的程序. 功能齐全 1200plc和3台v90伺服pn通讯, 3台施耐德ATV310H变频器485通讯, 2 ...

  8. 威纶tk6070ik与台达变频器vdf-s485通讯程序 自己编写的威纶触摸屏与台达变频器的通讯

    威纶tk6070ik与台达变频器vdf-s485通讯程序 自己编写的威纶触摸屏与台达变频器的通讯程序,可以直接控制变频器正反转,启动停止,监视变频器的电流电压等及错误代码等. ID:981558944 ...

  9. 多台S7-200Smart之间无线通讯例程

    2019独角兽企业重金招聘Python工程师标准>>> 本方案为原创方案,版权归本公司所有. 如需转载,请注明文章出处. 一.方案基本情况 该方案可适用于3台以上西门子PLC,S7- ...

最新文章

  1. 兵棋推演有助于我们了解哪些战争知识?
  2. java 手势识别_java – 如何在Android中实现手势识别
  3. 【转】jQuery最佳实践
  4. c语言case无参,如何使用可变参数模板构建switch-case
  5. owa_util.get_cgi_env 函数参数说明.
  6. android触摸屏idc,Android触摸屏IDC
  7. 计算机连接拒绝访问,Win10系统下Windows无法连接到打印机,拒绝访问的解决办法...
  8. [react] 怎样动态导入组件?
  9. 电脑热点的连接问题(基于现有IPhone12)
  10. Python源文件改写。编写一个程序,读取一个Python源程序文件source.py,将文件中所有除保留字外的小写字母换成大写字母。生成后的文件要能够被Python解释器正确执行。
  11. osm 搭建离线地图_搭建开源地图服务 - 利用OSMGIS和iD
  12. 数字转换为中文大写(钱数)
  13. php电商订单模块设计,电商后台订单管理模块
  14. kill命令详解kill -9、kill -15区别
  15. Vue 使用 yarn 报错
  16. 西门子SCL---S7通信
  17. 计算机桌面内存,电脑内存怎么清理
  18. 【matlab】matlab中的大小写转换
  19. 2007 世界顶级杀毒软件排名
  20. mongodb的NUMA问题

热门文章

  1. 【Brain】脑智前沿科普|用数学解释大脑学习的过程
  2. [转帖]Oracle 11G RAC For Windows 2008 R2部署手册
  3. python:更改pip源
  4. linux 下环境变量设置
  5. .Net Core 学习资料
  6. HDU 3896 Greatest TC 双连通分量
  7. 背景透明文字不透明的最佳方法兼容IE(以背景黑色透明度0.5为例)
  8. Effective C++ 第二版 1)const和inline 2)iostream
  9. 装修相片(第50天拍,全部,25号更新)
  10. C++学习——构造函数,析构函数与虚函数关系