使用气压传感器MS5611获取温度数据和气压数据

ms5611是一款由瑞士公司meas推出的高分辨率气压传感器。它具有以下特点:
接口:支持spi和i²c总线接口。(通过ps脚来选择)
内部结构:包括高线性度的压力传感器和超低功耗的24位累加模数转换器(工厂校准系数)。
功能:提供精确的24位数字压力值和温度值,适用于高度计、温度计等功能。
尺寸:仅有5.0毫米×3.0毫米×1.0毫米的小尺寸,适合集成在移动设备中。
这款传感器采用领先的mems技术,具有高稳定性和非常低的压力信号滞后。它在移动高度计、气压计系统、自行车电脑、智能手机等领域有广泛的应用
准备工作
由于芯片上支持iic通讯,因此我们打算使用stm32的硬件iic,我的stm32为stm32f407。
我们打开cubemx,选择好我们的时钟还有其他设置之后,我们打开我们的硬件iic
并且我们打开串口来进行调试,我们选择iic1,可以发现是pb6/pb7。
并且我们在usart.c文件中加入我们的串口重定向代码,方便我们使用printf函数
struct __file { int handle; }; struct __file __stdout; //定义_sys_exit()以避免使用半主机模式 void _sys_exit(int x) { x = x; } //重定义fputc函数 int fputc(int ch, struct __file *f){ while((usart1- >sr&0x40)==0);//循环发送,直到发送完毕 usart1- >dr = (unsigned char) ch; return ch;}利用这串代码,我们就可以把我们的串口发送函数重定向到我们的printf函数上。
之后我们测试一下,我们的串口发送。
可以看到串口重定向成功。
数据解释
我们在ms5611的官方手册中可以看到,ms5611的数据主要由c1~c6这六个校准系数以及d1,d2两个数据组成。
通过这些数据配合芯片手册计算方式我们可以计算出我们的传感器数值。
我们在向ms5611发送数据转换命令的时候,模块会把对应的信号转换好之后存入prom寄存器中,我们需要读取prom的数据来读取这些数据,prom的地址从0xa0~0xae
代码编写
#define ms5611_i2c_addr 0xee //ps拉高的地址#define cmd_adc_read 0x00 //adc转换开始#define cmd_adc_conv_d1 0x40 //d1读取命令#define cmd_adc_conv_d2 0x50 //d2读取命令#define cmd_prom_rd 0xa0 //prom基地址typedef struct { double temperature;//温度 double pressure;//气压 uint32_t d1; uint32_t d2; uint16_t c1; uint16_t c2; uint16_t c3; uint16_t c4; uint16_t c5; uint16_t c6;} ms5611data;首先我们定义模块的命令宏定义以及我们的结构体用来存放我们的数据。
extern i2c_handletypedef hi2c1;void readms5611data(ms5611data *ms5611data);其次定义我们的hi2c1句柄,由于这个句柄的实际定义是在i2c.h文件中,因此我们需要加上extern来修饰我们的变量
接着我们来定义我们的readms5611data函数,我们分步讲解。
hal_i2c_mem_write(&hi2c1, ms5611_i2c_addr, cmd_adc_conv_d1, i2c_memadd_size_8bit, null, 0, 100); hal_delay(10); uint8_t buffer[3]; hal_i2c_mem_read(&hi2c1, ms5611_i2c_addr, cmd_adc_read, i2c_memadd_size_8bit, buffer, 3, 100); ms5611data- >d1 = ((uint32_t)buffer[0] < < 16) | ((uint32_t)buffer[1] < d2 = ((uint32_t)buffer[0] < < 16) | ((uint32_t)buffer[1] < < 8) | (uint32_t)buffer[2];这部分也是同理,我们用这个方式获取d2的值。
uint8_t coef_data[2]; for (int i = 1; i c1 = (coef_data[0] < c2 = (coef_data[0] < c3 = (coef_data[0] < c4 = (coef_data[0] < c5 = (coef_data[0] < c6 = (coef_data[0] < d2 - ((int32_t)ms5611data- >c5 *256);double temp = 2000+((double)dt/ 8388608)*ms5611data- >c6;接着我们按照手册中的方法计算我们的数据,需要注意的是,temp的类型最好选择是double型,否则dt/8388608(1c4 * dt) / 128;int64_t sens = ((int64_t)ms5611data- >c1 < c3 * dt) / (1 < d1 * sens/2097152 - off) / (1 < < 15);效果展示
可以看到我们的气压数据打印出来是符合常理的。
我们的温度数据也是正常显示的

笔记本的CPU能承受多高的温度
2012年上半年中国LED室内照明出口竞争力企业十强
再次反转?TikTok核心算法又要卖?
重构供应链中坚力量,LED照明灯具产业实现精益生产
紫光展锐5G和4G平台同步向Android 13升级
使用气压传感器MS5611获取温度数据和气压数据
哈工大人工智能研究院揭牌_四大AI企业领军人物担任委员
未拆封初代iPhone拍出6.3万美元 历史最高拍卖价
如何实现自定义的应用层协议呢?
高速电路的定义
二极管仿真模式在同步BUCK里面的应用
华为P10深陷内存门和闪存门事件,用户体验满满的差评?不存在的!
BOE京东方发布全新品牌定位 “用心改变生活”开启美好未来
利用HIOKI的PW6001功率分析仪测量电机损耗和效率
Firefly-RK3128主板串口调试
曝特斯拉第一批Model Y预计在本周五交付
从CES来看计算世界重大创新是否能成为未来新标准
绿色能源太阳能电池简介
三星GalaxyTabActivePro即将推出 采用10英寸屏幕及三防设计
业内专家云集对话高端研讨,打破半导体测试技术壁垒