如何正确使用MS5837?
MS5837是一种高灵敏度、适用于检测101200mbar压力范围的传感器,广泛应用于电路板上,其采用I2C总线通讯,与STM32等微控制器兼容,具备极高的灵敏度和稳定性,理论上能够检测到0.01mbar的压力变化,以下是关于如何使用MS5837的具体说明:
一、硬件连接及基本命令
1. 硬件连接方式
MS5837通过I2C总线进行通信,因此需要连接相应的引脚,具体连接方式如下:
SDA(数据线):连接到STM32的PB8引脚。
SCL(时钟线):连接到STM32的PB9引脚。
VCC(电源):连接到3.3V或5V电源。
GND(地线):接地。
DRDY(数据就绪信号):连接到STM32的PA1引脚。
2. MS5837的基本命令
MS5837共有5个基本命令,每个命令对应一个特定的功能:
复位命令:用于初始化传感器。
读取出厂校准值:读取传感器内部的校准系数。
数据D1转换(压力值数据):将压力值转换为数字信号。
数据D2转换(温度值数据):将温度值转换为数字信号。
读取ADC的转换结果:读取转换后的数字信号。
二、软件实现及代码示例
1. 复位操作
复位操作是使用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
文章转载或复制请以超链接形式并注明出处杰瑞科技发展有限公司