SPL06-001 气压计
歌尔是全球领先的MEMS厂家,最新推出新款气压传感器SPL06-001,定位精度可达5cm
手册地址
https://download.csdn.net/download/zhangxuechao_/10548473
寄存器
计算方法
举例
//气压测量速率(sample/sec),Background 模式使用
#define PM_RATE_1 (0<<4) //1 measurements pr. sec.
#define PM_RATE_2 (1<<4) //2 measurements pr. sec.
#define PM_RATE_4 (2<<4) //4 measurements pr. sec.
#define PM_RATE_8 (3<<4) //8 measurements pr. sec.
#define PM_RATE_16 (4<<4) //16 measurements pr. sec.
#define PM_RATE_32 (5<<4) //32 measurements pr. sec.
#define PM_RATE_64 (6<<4) //64 measurements pr. sec.
#define PM_RATE_128 (7<<4) //128 measurements pr. sec.//气压重采样速率(times),Background 模式使用
#define PM_PRC_1 0 //Sigle kP=524288 ,3.6ms
#define PM_PRC_2 1 //2 times kP=1572864 ,5.2ms
#define PM_PRC_4 2 //4 times kP=3670016 ,8.4ms
#define PM_PRC_8 3 //8 times kP=7864320 ,14.8ms
#define PM_PRC_16 4 //16 times kP=253952 ,27.6ms
#define PM_PRC_32 5 //32 times kP=516096 ,53.2ms
#define PM_PRC_64 6 //64 times kP=1040384 ,104.4ms
#define PM_PRC_128 7 //128 times kP=2088960 ,206.8ms//温度测量速率(sample/sec),Background 模式使用
#define TMP_RATE_1 (0<<4) //1 measurements pr. sec.
#define TMP_RATE_2 (1<<4) //2 measurements pr. sec.
#define TMP_RATE_4 (2<<4) //4 measurements pr. sec.
#define TMP_RATE_8 (3<<4) //8 measurements pr. sec.
#define TMP_RATE_16 (4<<4) //16 measurements pr. sec.
#define TMP_RATE_32 (5<<4) //32 measurements pr. sec.
#define TMP_RATE_64 (6<<4) //64 measurements pr. sec.
#define TMP_RATE_128 (7<<4) //128 measurements pr. sec.//温度重采样速率(times),Background 模式使用
#define TMP_PRC_1 0 //Sigle
#define TMP_PRC_2 1 //2 times
#define TMP_PRC_4 2 //4 times
#define TMP_PRC_8 3 //8 times
#define TMP_PRC_16 4 //16 times
#define TMP_PRC_32 5 //32 times
#define TMP_PRC_64 6 //64 times
#define TMP_PRC_128 7 //128 times//SPL06_MEAS_CFG
#define MEAS_COEF_RDY 0x80
#define MEAS_SENSOR_RDY 0x40 //传感器初始化完成
#define MEAS_TMP_RDY 0x20 //有新的温度数据
#define MEAS_PRS_RDY 0x10 //有新的气压数据#define MEAS_CTRL_Standby 0x00 //空闲模式
#define MEAS_CTRL_PressMeasure 0x01 //单次气压测量
#define MEAS_CTRL_TempMeasure 0x02 //单次温度测量
#define MEAS_CTRL_ContinuousPress 0x05 //连续气压测量
#define MEAS_CTRL_ContinuousTemp 0x06 //连续温度测量
#define MEAS_CTRL_ContinuousPressTemp 0x07 //连续气压温度测量//FIFO_STS
#define SPL06_FIFO_FULL 0x02
#define SPL06_FIFO_EMPTY 0x01//INT_STS
#define SPL06_INT_FIFO_FULL 0x04
#define SPL06_INT_TMP 0x02
#define SPL06_INT_PRS 0x01//CFG_REG
#define SPL06_CFG_T_SHIFT 0x08 //oversampling times>8时必须使用
#define SPL06_CFG_P_SHIFT 0x04#define SP06_PSR_B2 0x00 //气压值
#define SP06_PSR_B1 0x01
#define SP06_PSR_B0 0x02
#define SP06_TMP_B2 0x03 //温度值
#define SP06_TMP_B1 0x04
#define SP06_TMP_B0 0x05#define SP06_PSR_CFG 0x06 //气压测量配置
#define SP06_TMP_CFG 0x07 //温度测量配置
#define SP06_MEAS_CFG 0x08 //测量模式配置#define SP06_CFG_REG 0x09
#define SP06_INT_STS 0x0A
#define SP06_FIFO_STS 0x0B#define SP06_RESET 0x0C
#define SP06_ID 0x0D#define SP06_COEF 0x10 //-0x21
#define SP06_COEF_SRCE 0x28static float _kT,_kP;
static float _Temp,_Press;uint8_t spl06_init(void)
{uint8_t coef[18];uint8_t id;if(spl06_write_reg(SP06_RESET,0x89)){puts("spl06 reset fail\r\n");return 1;}id = spl06_read_reg(SP06_ID);if(id != 0x10){puts("sol06 id error !!!\r\n");}//delay_ms(200); //复位后系数准备好需要至少40msspl06_read_buffer(SP06_COEF,coef,18);_C0 = ((int16_t)coef[0]<<4 ) + ((coef[1]&0xF0)>>4);_C0 = (_C0&0x0800)?(0xF000|_C0):_C0;_C1 = ((int16_t)(coef[1]&0x0F)<<8 ) + coef[2];_C1 = (_C1&0x0800)?(0xF000|_C1):_C1;_C00 = ((int32_t)coef[3]<<12 ) + ((uint32_t)coef[4]<<4 ) + (coef[5]>>4);_C10 = ((int32_t)(coef[5]&0x0F)<<16 ) + ((uint32_t)coef[6]<<8 ) + coef[7];_C00 = (_C00&0x080000)?(0xFFF00000|_C00):_C00;_C10 = (_C10&0x080000)?(0xFFF00000|_C10):_C10;_C01 = ((int16_t)coef[8]<<8 ) + coef[9];_C11 = ((int16_t)coef[10]<<8 ) + coef[11];_C11 = (_C11&0x0800)?(0xF000|_C11):_C11;_C20 = ((int16_t)coef[12]<<8 ) + coef[13];_C20 = (_C20&0x0800)?(0xF000|_C20):_C20;_C21 = ((int16_t)coef[14]<<8 ) + coef[15];_C21 = (_C21&0x0800)?(0xF000|_C21):_C21;_C30 = ((int16_t)coef[16]<<8 ) + coef[17];_C30 = (_C30&0x0800)?(0xF000|_C30):_C30;spl06_config_pressure(PM_RATE_128,PM_PRC_64);spl06_config_temperature(PM_RATE_8,TMP_PRC_8);spl06_start(MEAS_CTRL_ContinuousPressTemp); //启动连续的气压温度测量delay_ms(20);return 0;
}void spl06_start(uint8_t mode)
{spl06_write_reg(SP06_MEAS_CFG, mode);
}void spl06_config_temperature(uint8_t rate,uint8_t oversampling)
{switch(oversampling){case TMP_PRC_1:_kT = 524288;break;case TMP_PRC_2:_kT = 1572864;break;case TMP_PRC_4:_kT = 3670016;break;case TMP_PRC_8:_kT = 7864320;break;case TMP_PRC_16:_kT = 253952;break;case TMP_PRC_32:_kT = 516096;break;case TMP_PRC_64:_kT = 1040384;break;case TMP_PRC_128:_kT = 2088960;break;}spl06_write_reg(SP06_TMP_CFG,rate|oversampling|0x80); //温度每秒128次测量一次if(oversampling > TMP_PRC_8){uint8_t temp = spl06_read_reg(SP06_CFG_REG);spl06_write_reg(SP06_CFG_REG,temp|SPL06_CFG_T_SHIFT);}
}void spl06_config_pressure(uint8_t rate,uint8_t oversampling)
{switch(oversampling){case PM_PRC_1:_kP = 524288;break;case PM_PRC_2:_kP = 1572864;break;case PM_PRC_4:_kP = 3670016;break;case PM_PRC_8:_kP = 7864320;break;case PM_PRC_16:_kP = 253952;break;case PM_PRC_32:_kP = 516096;break;case PM_PRC_64:_kP = 1040384;break;case PM_PRC_128:_kP = 2088960;break;}spl06_write_reg(SP06_PSR_CFG,rate|oversampling);if(oversampling > PM_PRC_8){uint8_t temp = spl06_read_reg(SP06_CFG_REG);spl06_write_reg(SP06_CFG_REG,temp|SPL06_CFG_P_SHIFT);}
}int32_t spl06_get_pressure_adc()
{uint8_t buf[3];int32_t adc;spl06_read_buffer(SP06_PSR_B2,buf,3);adc = (int32_t)(buf[0]<<16) + (buf[1]<<8) + buf[2];adc = (adc&0x800000)?(0xFF000000|adc):adc;return adc;
}int32_t spl06_get_temperature_adc()
{uint8_t buf[3];int32_t adc;spl06_read_buffer(SP06_TMP_B2,buf,3);adc = (int32_t)(buf[0]<<16) + (buf[1]<<8) + buf[2];return adc;
}void spl06_update_pressure()
{float Traw_src, Praw_src;float qua2, qua3;Traw_src = _kT * _raw_temp;Praw_src = _kP * _raw_press;//计算温度_Temp = 0.5f*_C0 + Traw_src * _C1;//计算气压qua2 = _C10 + Praw_src * (_C20 + Praw_src* _C30);qua3 = Traw_src * Praw_src * (_C11 + Praw_src * _C21);_Press = _C00 + Praw_src * qua2 + Traw_src * _C01 + qua3;
}void spl06_update()
{_raw_temp = spl06_get_temperature_adc();_raw_press = spl06_get_pressure_adc();spl06_update_pressure();
}float spl06_get_temperature()
{return _Temp;
}float spl06_get_pressure()
{return _Press;
}uint8_t spi2_write_reg(uint8_t reg_addr,uint8_t reg_val)
{spi2_read_write_byte(reg_addr&0x7f);spi2_read_write_byte(reg_val);return 0;
}uint8_t spi2_read_reg(uint8_t reg_addr)
{spi2_read_write_byte(reg_addr|0x80);return spi2_read_write_byte(0xff);
}
uint8_t spi2_read_reg_buffer(uint8_t reg_addr,void *buffer,uint16_t len)
{uint8_t *p = buffer;uint16_t i;spi2_read_write_byte(reg_addr|0x80);for(i=0;i<len;i++){*p++= spi2_read_write_byte(0xff);}return 0;
}
SPL06-001 气压计相关推荐
- 疯壳AI开源无人机开机测试及硬件资源介绍
一.开机测试 1.1 前期准备 疯壳cocofly无人机到手后是一个高耐压防碰撞内置优质海绵泡沫防护的手提铝合金箱子,打开铝合金手提箱子就可以看到包含的物品:无人机一架.遥控手柄一个.无人机电池一个. ...
- 【疯壳·无人机开发教程2】开源编队无人机-硬件资源简介
疯壳·开源编队无人机 硬件资源简介 硬件主要由三部分组成,分别是无人机.遥控手柄以及 cocobit 编程板. 2.1无人机简介 无人机整机如下图所示. 图1 无人机采用的主核心是 ARM Cor ...
- 【快速上手教程2】开源编队无人机-硬件资源简介
二.硬件资源简介 硬件主要由三部分组成,分别是无人机.遥控手柄以及 cocobit 编程板. 2.1无人机简介 无人机整机如下图所示. 图1 无人机采用的主核心是 ARM Cortex®-M3 内 ...
- (置顶)飞控板不用看得高大上,本质就是STM32加那几个传感器,和平衡车板子差不多,是完全可以自己画的,甚至不用画,买个STM32核心板+十轴模块
你自己画一块板子,然后真正飞成了,我觉得你会非常开心的,这种感觉不一样的我觉得,你说是不是. 飞控我们不用看得高大上,本质还是STM32加传感器,可能和平衡车的差不多,所以不用觉得高大上什么的. 真的 ...
- 【UAV】气压计 SPL06
文章目录 Ref: 给个SPL06的实际数据log,看看有多稳,没有滤波之前几本能保持在30cm,比bpm280好上一倍不止:(刷新周期是5ms,可以看到短时间内) Ref: 关于SPL06的使用
- LPS25HB 气压计 参考手册中关于FIFO功能的解读
文章目录 LPS25HB 气压计 参考手册中关于FIFO功能的解读 FIFO 普通模式 FIFO Stream 模式 Stream-to-FIFO 模式 Bypass-to-Stream 模式 FIF ...
- 图灵有奖书评征集活动第001期
图灵有奖书评征集活动第001期 为了促进LAMP技术在国内的发展,几年以来,图灵公司出版了一系列优秀的LAMP类著作.在读者朋友的鼓励和支持下,图灵的这一系列图书获得了非常好的口碑.为了感谢广大读者朋 ...
- SAP QM中阶执行事务代码QDB1,报错- Inspection severity 001 AQL 0.650 not in sampling schema A01-
SAP QM中阶执行事务代码QDB1,报错- Inspection severity 001 AQL 0.650 not in sampling schema A01- 对于sampling proc ...
- SpringBoot 2.0 系列001 -- 入门介绍以及相关概念
为什么80%的码农都做不了架构师?>>> SpringBoot 2.0 系列001 -- 入门介绍以及相关概念 什么是SpringBoot? 项目地址:http://proje ...
- (001) java后台开发之流程初识
java 后台开发流程 这篇文章为了奠基一下被我打入冷宫两个月左右的iOS开发,因为之前由于iOS项目停止的原因,被调至后台开发,两个月中也学习到了很多关于Java.sql.js.jsp的内容,感谢我 ...
最新文章
- devops开发运维训练营_嗨,网络开发人员训练营的毕业生:这是您第一份工作需要了解的内容。...
- 22个案例详解Pandas数据分析/预处理时的实用技巧,超简单
- SAP S4 OP/Cloud大乱斗
- 自动机理论、形式语言和计算导论提纲
- (教程)2020最新windows10/anaconda/pytorch-gpu环境配置(附CUDA/cuDNN配置)
- linux nslookup 解析不到dns_涉及DNS的简单操作,只看这一篇就够了
- 设计模式笔记十一:外观模式
- 面向对象进阶 各种可以自定制的内置方法
- Yolov3目标检测实战【实现图像中随机出现手写数字的检测】
- JavaC++题解与拓展——leetcode953.验证外星语【么的新知识】
- 射影几何笔记7:直线方程
- XML学习记录(归纳总结,方便查看)
- destoon php 循环语句,destoon二次开发模板及调用语法汇总_PHP
- 小程序提示 网络异常 Network Anomalies
- dbv数据库乱码_使用DBV进行数据库版本控制
- 安徽省2016“京胜杯”程序设计大赛_C_箭无虚发
- jfinal整合IJPay paypal支付
- 【频率计】基于FPGA的频率计设计
- getchar()的作用
- Linux 之 开机自启动
热门文章
- 在 K8s 中快速部署使用 GitLab 并构建 DevOps 项目
- 第四期 JTAG接口和TTL接口 《路由器就是开发板》
- SQL Server的数据类型
- 使用第三方jieba中文分词库对三国演义片段进行分词统计
- 证照速打王注册器使用说明
- 计算机使用hdmi需要设置方法,win10系统使用hdmi连接电视的操作方法
- Error: Node Sass does not yet support your current environment: Windows 64-bit with Unsupported runt
- python异步协程库_Python连载42-异步协程函数
- Vue-实现自适应屏幕高度的方法
- 中国剩余定理(又称孙子定理)