本文作者:豆面

如何正确使用MS5837?

豆面 2024-12-18 05:13:20 13
如何正确使用MS5837?摘要: MS5837是一种高灵敏度、适用于检测10-1200mbar压力范围的传感器,广泛应用于电路板上,其采用I2C总线通讯,与STM32等微控制器兼容,具备极高的灵敏度和稳定性,理论上...

MS5837是一种高灵敏度、适用于检测101200mbar压力范围的传感器,广泛应用于电路板上,其采用I2C总线通讯,与STM32等微控制器兼容,具备极高的灵敏度和稳定性,理论上能够检测到0.01mbar的压力变化,以下是关于如何使用MS5837的具体说明:

一、硬件连接及基本命令

如何正确使用MS5837?

1. 硬件连接方式

MS5837通过I2C总线进行通信,因此需要连接相应的引脚,具体连接方式如下:

SDA(数据线):连接到STM32的PB8引脚。

SCL(时钟线):连接到STM32的PB9引脚。

VCC(电源):连接到3.3V或5V电源。

GND(地线):接地。

DRDY(数据就绪信号):连接到STM32的PA1引脚。

2. MS5837的基本命令

如何正确使用MS5837?

MS5837共有5个基本命令,每个命令对应一个特定的功能:

复位命令:用于初始化传感器。

读取出厂校准值:读取传感器内部的校准系数。

数据D1转换(压力值数据):将压力值转换为数字信号。

数据D2转换(温度值数据):将温度值转换为数字信号。

读取ADC的转换结果:读取转换后的数字信号。

二、软件实现及代码示例

1. 复位操作

复位操作是使用MS5837的第一步,只需发送一条复位命令即可完成。

如何正确使用MS5837?
void ResetForMs5837(uint8_t deviceAddress, WriteCommandToMs5837Type WriteCommandToMs5837) {
    uint8_t command = COMMAND_RESET;
    WriteCommandToMs5837(deviceAddress, command);
}

2. 读取校准值

校准值是出厂时厂家校准的各种系数,每台设备都有差异,是固定不变的,读取校准值需要分6次读取,每次读取1个系数。

void GetCalibrationData(uint8_t deviceAddress, uint16_t *caliPara, WriteCommandToMs5837Type WriteCommandToMs5837, ReadBytesFromMs5837Type ReadBytesFromMs5837) {
    /* C1压力灵敏度 */
    caliPara[0] = ReadPromFromMs5837(deviceAddress, COMMAND_PROM_READ_C1, WriteCommandToMs5837, ReadBytesFromMs5837);
    /* C2压力补偿值 */
    caliPara[1] = ReadPromFromMs5837(deviceAddress, COMMAND_PROM_READ_C2, WriteCommandToMs5837, ReadBytesFromMs5837);
    /* C3压力灵敏度温度系数 */
    caliPara[2] = ReadPromFromMs5837(deviceAddress, COMMAND_PROM_READ_C3, WriteCommandToMs5837, ReadBytesFromMs5837);
    /* C4压力补偿温度系数 */
    caliPara[3] = ReadPromFromMs5837(deviceAddress, COMMAND_PROM_READ_C4, WriteCommandToMs5837, ReadBytesFromMs5837);
    /* C5参考温度 */
    caliPara[4] = ReadPromFromMs5837(deviceAddress, COMMAND_PROM_READ_C5, WriteCommandToMs5837, ReadBytesFromMs5837);
    /* C6温度传感器温度系数 */
    caliPara[5] = 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 > 0) {
        GetCalibrationData(deviceAddress, caliPara, WriteCommandToMs5837, ReadBytesFromMs5837);
        *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 = ReadConversionFromMs5837(deviceAddress, COMMAND_CONVERTD1OSR4096, WriteCommandToMs5837, ReadBytesFromMs5837);
    Delayms(20);
    /* 计算实际温度 */
    int32_t dT = (digitalTemperatureValue  (int32_t)tref);
    float temperature = 20 + (dT * (float)tempsens / pow(2, 23));
    /* 计算实际压力 */
    float sensitivity = (float)(((digitalPressureValue << 15) / (float)senst1) / pow(2, 21))  (float)offt1 / pow(2, 13);
    float pressure = sensitivity * (float)101325; // 根据标准大气压进行调整
}

三、典型电路设计

在使用MS5837时,通常需要设计一个典型的电路来保证其正常工作,典型电路包括滤波电容、电阻和连接线等元件,以下是一个两层PCB设计的建议:

顶层:放置传感器和外围元件。

底层:焊盘接线用。

元件:需要两个电阻和一个滤波电容。

四、深度数据解算算法

MS5837可以配置成不同的ADC转换精度,用OSR表示,精度越高,转换越慢,OSR=4096时,转换时间为7.409.04毫秒,每次读ADC转换数据前要先发送转换命令,并等待转换完成再读取数据。

五、IIC读数据的寄存器与时序

在I2C通信中,MS5837的寄存器地址和通信时序非常重要,每条I2C通信消息以启动条件开始,以停止条件结束,具体寄存器地址如下:

复位命令寄存器:0x1E。

读取出厂校准值C1C6:0xA20xAC。

数据D1转换(压力值数据):不同精度对应不同地址,如OSR=4096时为0x48。

数据D2转换(温度值数据):不同精度对应不同地址,如OSR=4096时为0x58。

读转换结果:0x00。

六、常见问题解答

Q1: MS5837如何复位?

MS5837复位操作非常简单,只需发送一条复位命令即可完成,具体代码如下:

void ResetForMs5837(uint8_t deviceAddress, WriteCommandToMs5837Type WriteCommandToMs5837) {
    uint8_t command = COMMAND_RESET;
    WriteCommandToMs5837(deviceAddress, command);
}

Q2: 如何读取MS5837的校准值?

读取校准值需要分6次读取,每次读取1个系数,具体代码如下:

void GetCalibrationData(uint8_t deviceAddress, uint16_t *caliPara, WriteCommandToMs5837Type WriteCommandToMs5837, ReadBytesFromMs5837Type ReadBytesFromMs5837) {
    /* C1压力灵敏度 */
    caliPara[0] = ReadPromFromMs5837(deviceAddress, COMMAND_PROM_READ_C1, WriteCommandToMs5837, ReadBytesFromMs5837);
    /* C2压力补偿值 */
    caliPara[1] = ReadPromFromMs5837(deviceAddress, COMMAND_PROM_READ_C2, WriteCommandToMs5837, ReadBytesFromMs5837);
    /* C3压力灵敏度温度系数 */
    caliPara[2] = ReadPromFromMs5837(deviceAddress, COMMAND_PROM_READ_C3, WriteCommandToMs5837, ReadBytesFromMs5837);
    /* C4压力补偿温度系数 */
    caliPara[3] = ReadPromFromMs5837(deviceAddress, COMMAND_PROM_READ_C4, WriteCommandToMs5837, ReadBytesFromMs5837);
    /* C5参考温度 */
    caliPara[4] = ReadPromFromMs5837(deviceAddress, COMMAND_PROM_READ_C5, WriteCommandToMs5837, ReadBytesFromMs5837);
    /* C6温度传感器温度系数 */
    caliPara[5] = ReadPromFromMs5837(deviceAddress, COMMAND_PROM_READ_C6, WriteCommandToMs5837, ReadBytesFromMs5837);
}

通过上述步骤和代码示例,用户可以详细了解如何使用MS5837压力传感器,从硬件连接、基本命令、软件实现到典型电路设计和深度数据解算算法,每一步都进行了详细的解释和演示,确保用户能够顺利实现对MS5837的操作和应用。

文章版权及转载声明

作者:豆面本文地址:https://www.jerry.net.cn/articals/2675.html发布于 2024-12-18 05:13:20
文章转载或复制请以超链接形式并注明出处杰瑞科技发展有限公司

阅读
分享