Crazepony开源四轴飞行器

气压计MS5611

作者:nieyong

Crazepony使用气压计(或者叫高度计)MS5611。

MS5611气压传感器是由MEAS(瑞士)推出的SPI和I²C总线接口的新一代高分辨率气压传感器,分辨率可达到10cm。我们使用的I2C接口,挂在MPU5060的从I2C接口上。MS5611有2种型号的封装MS5611-01BA03(金属封装) 和MS5611-01BA01(塑壳封装),我们使用的金属封装。

MS5611的I2C地址为0b111011Cx,其中C比特位由CSB引脚决定,为CSB引脚的补码值(取反)。Crazepony上MS5611的CSB引脚接地,所以CSB引脚值为0,8位I2C地址为0b1110111x(0xEE),7位I2C地址为0b1110111(0x77)。

MS5611的I2C操作命令

下面以I2C连接模式讲解,符合Crazepony硬件上的连接。对MS5611芯片操作,只有5个命令。

  • 复位芯片

复位MS5611芯片,写入一个字节0x1E即可。

IICwriteOneByte( ms5611Address, 0x1E);      // Reset Device
  • 读取PROM中的值

MS5611气压传感器在出厂的时候,将该片IC对应的6个系数写在了内部寄存器(PROM)中,读取该系数,用于后面对实际温度和实际气压的计算。

内部寄存器的位置分别为0xA2/0xA4/0xA6/0xA8/0xAA/0xAC/0xAE,只需要对该位置读取2个字节则可。

IICreadBytes( ms5611Address, 0xA2, 2, data);    // Read Calibration Data C1
c1.bytes[1] = data[0];
c1.bytes[0] = data[1];

IICreadBytes( ms5611Address, 0xA4, 2, data);    // Read Calibration Data C2
c2.bytes[1] = data[0];
c2.bytes[0] = data[1];

IICreadBytes( ms5611Address, 0xA6, 2, data);    // Read Calibration Data C3
c3.bytes[1] = data[0];
c3.bytes[0] = data[1];

IICreadBytes( ms5611Address, 0xA8, 2, data);    // Read Calibration Data C4
c4.bytes[1] = data[0];
c4.bytes[0] = data[1];

IICreadBytes( ms5611Address, 0xAA, 2, data);    // Read Calibration Data C5
c5.bytes[1] = data[0];
c5.bytes[0] = data[1];

IICreadBytes( ms5611Address, 0xAC, 2, data);    // Read Calibration Data C6
c6.bytes[1] = data[0];
c6.bytes[0] = data[1];
  • 配置进行D1转化

D1转化即气压转化,告知IC进行气压转化,下一步就可以读取气压值(24位)。如果OSR为4096,则写入0x48即可。

IICwriteOneByte( ms5611Address, 0x48);
  • 配置进行D2转化

D2转化即温度转化,告知IC进行温度转化,下一步就可以读取温度值(24位)。如果OSR为4096,则写入0x58即可。

IICwriteOneByte( ms5611Address, 0x58);
  • 读取ADC的值

ADC值即上面进行的D1转化或者D2转化,为24位数值。对0x00读取3个字节即可。

IICreadBytes( ms5611Address, 0x00, 3, data);    // Request temperature read

上面这5个命令,是对ms5611操作的所有命令了。我们可以获得6个系数(只需要在初始化时读取一遍即可),然后就是传感器测量到的温度数值和气压数值。下面就是要对读到的气压值和温度值进行计算,获得真实的气压(帕斯卡)和温度(摄氏度)。

实际温度和气压的计算

首先看ms5611出厂时已经确定的6个系数:

  • c1,气压敏感度,SENS
  • c2,气压偏差值,OFF
  • c3,气压敏感度的温度系数,简写为TCS
  • c4,气压偏差值的温度系数,简写为TCO
  • c5,参考温度,Tref
  • c6,温度系数,TEMPSENS

上面6个系数为出厂时已经确定,为16位数值。不同的MS5611芯片会不相同,但是同一片芯片是固定的,只需要在初始化时读取一遍,用于后面的计算。

进行D1和D2转化,获得气压数值d1和温度数值d2,为24位数值。

得到了上面8个值之后,就可以计算当前的实际温度和实际气压了。计算过程如下。

二阶温度补偿

不同温度对大气压强测量有着很大影响,MS5611手册提供有二阶温度补偿的方法。如果温度低于20摄氏度,则进行二阶温度补偿。

扩展-气压计的应用

智能手机

气压传感器首次在智能手机上使用是在Galaxy Nexus上,而之后推出的一些Android旗舰手机里也包含了这一传感器,像GalaxySIII、GalaxyNote2和小米2手机上也都有。

登山测高

对于喜欢登山的人来说,都会非常关心自己所处的高度。海拔高度的测量方法,一般常用的有2种方式,一是通过GPS全球定位系统,二是通过测出大气压,然后根据气压值计算出海拔高度。

导航辅助

现在不少开车人士会用手机来进行导航,不过常常会有人抱怨在高架桥里导航常常会出错 。比如在高架桥上时,GPS说右转,而实际上右边根本没有右转出口,这主要是GPS无法判断你是桥上还是桥下而造成的错误导航。一般高架桥上下两层的高度都会有几米到十几米的距离了,而GPS的误差可能会有几十米,所以发生上面的事情也就可以理解了。

而如果手机里增加一个气压传感器就不一样了,他的精度可以做到1米的误差,这样就可以很好的辅助GPS来测量出所处的高度,错误导航的问题也就容易解决了。

室内定位

由于在室内无法很好的接收GPS信号,所以当使用者进入一幢很厚的楼宇时,内置感应器可能会失去卫星的信号,所以无法识别用户的地理位置,并且无法感知垂直高度。而如果手机加上气压传感器再配合加速计、陀螺仪等技术就可以做到精准的室内定位。这样以后你在商场购物时,就可以通过手机定位来告诉你你想购买的产品在商场的那个位置,哪一层楼。

渔具

另外气压传感器还可以为钓鱼爱好者提供相关信息(鱼在水中分层及活跃性与大气压相关)或天气预报等功能。

不过目前气压传感器还处于一个被忽略的状态,气压传感器要想被更多人了解和使用还需要一些相关技术的成熟和普及,以及更多的开发者针对这一传感器推出更多的应用和相关功能。