Arduino 开源代码——BMP180 程序(二)寄存器介绍

1.项目描述:

使用硬 IIC 口,从 BMP180 中获取温度、气压以及海拔高度值。

2.项目准备

Arduino nano 板、BMP180 模组、Arduino IDE。
Arduino 是我非常喜欢的一款 IDE,C++ 语法特性让我在设计以及使用的时候非常方便。同时在工作中,如果需要快速开发做演示,我也很喜欢使用 Arduino。走量产项目的话,还是不推荐它。

3.数据手册解读

http://read.pudn.com/downloads707/sourcecode/others/2839579/GY68BMP180/相关数据手册/BST-BMP180-DS000-07.pdf

BMP180 寄存器

在上一篇我们讲解了 BMP180 的工作环境和电气性能。我们知晓 BMP180 是通过 IIC 进行操作的,那么这章我们就可以开始介绍 BMP180 的寄存器。
Arduino 开源代码——BMP180 程序(一)器件选型须知

寄存器表

Arduino 开源代码——BMP180 程序(二)寄存器介绍_第1张图片
分析表图,大致的感觉是。
out_xlsb、out_lsb、out_msb(只读): 存放数据的寄存器。
ctrl_meas(读写): 功能比较多。
soft_reset(读写): 复位用的。
id(只读): 存放设备ID信息的。
calib21 downto calib0(只读): 存放某某信息的。

寄存器功能

Arduino 开源代码——BMP180 程序(二)寄存器介绍_第2张图片
进一步了解寄存器。
ctrl_meas<0xF4h 7:6>(读写) ,配置模式
Arduino 开源代码——BMP180 程序(二)寄存器介绍_第3张图片
ctrl_meas<0xF4h 5>(读写) ,转换状态,这个位的值在转换期间保持为 1,并且为转换完成后重置为 0。

Soft_reset<0xE0h >(读写),软复位寄存器,如果设置为 0xB6,则将复位。

id<0xD0h >(只读),存放id信息,BMP180 值为 0x55。

calib21 downto calib0<0xBFh:0xAAh >(只读),存放了 AC1 到 MD 信息的值。这些值的作用暂时不明。带着疑惑往下看。
Arduino 开源代码——BMP180 程序(二)寄存器介绍_第4张图片

操作流程分析

Arduino 开源代码——BMP180 程序(二)寄存器介绍_第5张图片
第一步:从 0xAA 到 0xBF 寄存器中获取 AC1-MD 的值。
第二步:写 0x2E 到 0xF4 中(配置为温度模式),并等待4.5ms。再读取 0xF6(out_msb) 与 0xF7(out_lsb) 寄存器,拼接二者数据得到 UT 值(UT = MSB << 8 + LSB)。
第三步:写 0x34+(oss<<6) 到 0xF4 中(配置为对应oss的功耗模式),并等待XX(根据功耗模式选)ms。再读取 0xF6(out_msb) 与 0xF7(out_lsb) 与 0xF8(out_xlsb)寄存器,拼接三者数据得到 UP 值( UP = (MSB<<16 + LSB<<8 + XLSB) >> (8-oss) )。
第四步:通过 UT 值和 AC1-MD 值计算温度T(℃)。
X1 = (UT - AC6) * AC5 / 2^15
X2 = MC * 211 / (X1 + MD)
B5 = X1 + X2
T = (B5 + 8) / 24/10
第五步:通过UP值和 AC1-MD 值计算气压p(Pa)。
B6 = B5 - 4000
X1 = (B2 * (B6 * B6 / 2^12 )) / 2^11
X2 = AC2 * B6 / 2^11
X3 = X1 + X2
B3 = ((AC1*4+X3) << oss + 2) / 4
X1 = AC3 * B6 / 2^13
X2 = (B1 * (B6 * B6 / 212 )) / 2^16
X3 = ((X1 + X2) + 2) / 2^2
B4 = AC4 * (unsigend long)(X3 + 32768) / 2^15
B7 = ((unsigned long)UP - B3) * (50000 >> oss)
if (B7 < 0x80000000) { p = (B7 * 2) / B4 }
else { p = (B7 / B4) * 2 }
X1 = (p / 2^8 ) * (p / 2^8 )
X1 = (X1 * 3038) / 2^16
X2 = (-7357 * p) / 2^16
p = p + (X1 + X2 + 3791) / 2^4
第六步:得到数据回到第二步。

你可能感兴趣的:(Arduino)