引言
目前市场上的气压传感器大多为模拟输出,这不仅容易引入干扰信号,增加外围信号调理电路的复杂度,而且还需AD转换,给MCU增加额外功耗。本文介绍的MPL3115A2数字气压传感器,具有较强的抗干扰能力,补偿运算可给出最大、最小测量值及设定测量阈值和窗口,内部FIFO数据缓存区允许MCU处于低功耗的睡眠模式,直至FIFO数据存满后再唤醒MCU读取数据。MPL3115A2压力传感器可广泛应用于导航设备、GPS、智能手机等手持式低功耗设备。本文基于STM32介绍MEMS气压传感器的内部寄存器设置、工作模式配置等。
1 硬件电路
STM32是32位微控制器芯片,兼具低功耗和高性价比。图1所示是STM32F103CBT6与MPL3115A2的电路图,MPL3115A2的INT1、INT2引脚短接时需外接4.7 kΩ的上拉电阻,当STM32初始化MPL3115A2时,需将INT1、INT2设置成开漏输出。引脚2接100 nF电容到地,旁路芯片内部产生的高频噪声。
图1 基于STM32F103CBT6的MPL3115A2气压测量系统电路
2 MPL3115A2寄存器介绍及设置
MPL3115A2内部有44个寄存器,寄存器地址为0x00~0x2D。首先用宏定义将寄存器的地址和名称联系起来,如地址为0x00的寄存器,则“#define MPL3115A2_STATUS 0x00”。此外还要宏定义I2C地址“#define MPL3115A2_ADDR 0xc0”。
2.1 控制寄存器
图2是F_SETUP寄存器,用于配置FIFO缓冲区的工作模式以及“水印”的数值。图3是PT_DATA_CFG寄存器,用于配置采样数据后是否置位相应的就绪标志位。图4是CTRL_REG1寄存器,用于配置芯片的活动模式、输出采样率、测高或者测压功能的选择以及器件的软件复位。图5是CTRL_REG2寄存器,用于设置自动采样时间间隔=2^ST,选择“窗口”“阈值”数据的来源。图6是CTRL_REG3寄存器,用于设置两个中断引脚的工作模式。图7是CTRL_REG4寄存器,用于使能各类中断源。图8是CTRL_REG5寄存器,用于将各类的中断源路由到引脚INT1或者INT2。
图2 F_SETUP寄存器
图3 PT_DATA_CFG寄存器
图4 CTRL_REG1寄存器
图5 CTRL_REG2寄存器
图6 CTRL_REG3寄存器
图7 CTRL_REG4寄存器
图8 CTRL_REG5寄存器
图9 DR_STATUS寄存器
2.2 状态寄存器
MPL3115A2有3个状态寄存器,STATUS、DR_STATUS和F_STATUS。若使用FIFO,则STATUS与F_STATUS共享地址;若不使用FIFO,则STATUS与DR_STATUS共享地址。图9是DR_STATUS寄存器,其中数据位用于指示数据的状态——就绪或者溢出。
图10是F_STATUS寄存器,给出FIFO中断类型和当前FIFO保存的采样次数。
图10 F_STATUS寄存器
2.3 数据寄存器
寄存器OUT_P(MSB、CSB、LSB)保存20位有符号气压/高度数据,OUT_P_MSB和OUT_P_CSB存储整数,OUT_P_LSB的高4位存储小数。寄存器OUT_T(MSB、LSB)保存12位有符号温度数据,OUT_T_MSB存储整数,OUT_T_LSB的高4位存储小数。在MPL3115A2初始化程序中,需对这5个数据寄存器“伪读”,确保清除所有的中断标志。
3 软件控制
3.1 工作模式配置
MPL3115A2有3种工作模式,就绪模式(stand by)、活动测高模式(active altitude)和活动测压模式(active barometer)。模式的切换可通过配置控制寄存器CTRL_REG1实现,如图4所示。Bit0=1使MPL3115A2进入活动模式,反之为就绪模式,该模式下传感器的I2C工作;Bit2=1,复位所有寄存器到初始状态;Bit3~Bit5设置传感器的输出采样率;Bit7=0,表示OUT_P(MSB、CSB、LSB)存储气压值,反之是高度值。
对CTRL_REG1寄存器的任何改动,必须在MPL3115A2就绪模式下进行。建议在MPL3115A2初始化开始复位所有寄存器,进入就绪模式;在初始化结束打开活动测高模式。具体设置如下:
I2C_WriteByte(MPL3115A2_ADDR,MPL3115A2_CTRL_REG1,0x04);//复位所有寄存器,进入就绪模式
I2C_WriteByte(MPL3115A2_ADDR,MPL3115A2_CTRL_REG1,0xB9);//输出采样时间间隔512 ms,进入活动测高模式
3.2 数据格式的转换
由于数据寄存器保存的数据有整数和小数部分,因此需要对采样数据进行格式转换,如:
OUT_P_MSB = I2C_ReadByte (MPL3115A2_ADDR, MPL3115A2_OUT_P_MSB);
OUT_P_CSB = I2C_ReadByte (MPL3115A2_ADDR, MPL3115A2_OUT_P_CSB);
OUT_P_LSB = I2C_ReadByte (MPL3115A2_ADDR, MPL3115A2_OUT_P_LSB);
OUT_P_INT = ((u16) OUT_P_MSB<<8) | OUT_P_CSB;
if (OUT_P_MSB & 0x80)//判断数据符号
{ OUT_P_INT = ~OUT_P_INT + 1;flag = 1;}
//flag==1,表示负数
Altitude = OUT_P_INT + (float) (OUT_P_LSB>>4)>>4;
3.3 轮询法与中断法
读取传感器数据的方式有轮询法和中断法。轮询法只需要配置工作模式,并不断地检查DR_STATUS寄存器的标志位。采用轮询法时须在初始化函数中设置PT_DATA_CFG寄存器的值为0x07,否则DR_STATUS寄存器的各位不会自动置位。
轮询法虽然简单,但是效率低,要求MCU轮询传感器的速度必须大于其采样速率,否则会造成数据丢失。相反,中断法很大程度上缓轻了CPU的负荷。中断法初始化前需要将INT1和INT2设置成开漏输出,构成“线与”的逻辑,并且使能下降沿触发。具体实现如下:“I2C_WriteByte(MPL3115A2_ADDR,MPL3115A2_CTRL_REG3,0x11);”
MPL3115A2有8个中断源,无FIFO时采用中断法。在初始化MPL3115A2时,需要把CTRL_REG4寄存器的Bit7置位,打开DRDY中断位,如图11所示,当数据就绪时会置位Bit7(SRC_SDRDY)。当程序进入中断后,首先读取INT_SOURCE寄存器,判断中断源。在中断函数中置位自定义的标志位,在主程序中完成数据读取。为及时清除中断标志位,还需读取状态寄存器。
图11 INT_SOURCE寄存器
3.4 阈值和窗口
阈值和窗口是MPL3115A2的特点,均可由用户设定。阈值是用户可编程限定采样数据的极限值,为有符号;窗口是设定采样数据在阈值上下浮动的范围,为无符号。
高度阈值保存在寄存器P_TGT_MSB和P_TGT_LSB中,气压/高度的窗口数据保存在P_WND_MSB和P_WND_LSB中。温度阈值保存在寄存器T_TGT中,温度的窗口数据保存在T_WND寄存器中。设定阈值与窗口后,用户可选择希望发生的中断提醒事件,在CTRL_REG5寄存器中选择PW(Pressure Window)、TW(Temperature Window)、PTH(Pressure Threshold)、TTH(Temperature Threshold)。其中,XW(X代表P或T)中断表示传感器采集的数据在用户设定的窗范围内时,置位相应的中断标志位,通知MCU。这个窗的大小由Window = X_TGT(MSB,LSB)±X_WND(MSB,LSB)决定。XTH(X代表P或T)中断表示当传感器获取的数据在X_TGT(MSB,LSB)+X_WND(MSB,LSB)或X_TGT(MSB,LSB)-X_WND(MSB,LSB)或X_TGT(MSB,LSB)时就触发中断。进入中断后,一定要先判断中断的来源。飞行器用阈值与窗口可实现在某一高度区间飞行。
3.5 FIFO
利用MPL3115A2的FIFO可实现系统的低功耗。FIFO缓冲区有160字节,1次采样有3字节的气压/高度数据、2字节的温度数据,FIFO可保存32次采样数据。采样间隔由用户编程设定,最长可达9小时,因此,FIFO最长保存的采样数据可达12天之久。此外,FIFO还具有“Watermark(水印)”概念,是用户设置FIFO的采样次数。如果打开水印中断,当MPL3115A2采样次数达到水印值后便触发FIFO中断。具体实现如下:在中断程序中首先需要判断中断来源,如果是FIFO中断,读F_STATUS寄存器。若开启的是FIFO溢出中断而非水印中断,则当F_CNT>32时将置位F_OVF标志位;若开启的是FIFO的水印中断,则当F_CNT>Watermark时将置位F_WMRK_FLAG。
MPL3115A2的FIFO功能,可将MCU置于低功耗模式。当MPL3115A2完成预定的采样次数时,即产生中断,启动MCU,使之执行数据读取功能,这样整个系统处于低功耗状态。在F_SETUP寄存器设置FIFO,如图2,F_MODE[1:0]用于配置FIFO的工作模式。默认00是关闭FIFO功能;01表示FIFO工作在循环缓冲区,即当采样数据超过32时,最先采集的数据将被舍弃;10表示FIFO工作在“满停”缓冲区,即当采样数据达到32时,采样暂停。前文提到的水印数值保存在F_SETUP寄存器的低6位。需要注意的是,当切换FIFO的工作模式时,需要先关掉FIFO功能,再开启另外一种模式。
4 提高精度措施
MPL3115A2根据测量的气压值换算其对应的高度,默认海平面气压值为101 326 Pa,存储在寄存器BAR_IN_MSB和BAR_IN_LSB中。若要高度与被测地一致,可将当地海平面的大气压值保存在这两个寄存器中。
此外,芯片长时间使用指针会产生偏置。MPL3115A2作为一款精密的气压传感器,提供了OFF_P、OFF_T、OFF_H三个寄存器,可对气压、温度、海拔的输出数据进行偏置修正。
结语
本文是基于STM32F103CBT6开发的气象检测系统。笔者结合自己的使用经验介绍了MPL3115A2的使用方法。其众多的工作模式可广泛应用于四轴飞行器、GPS等系统。I2C总线接口可与众多MCU通信,FIFO可降低系统的功耗,非常适合手持式设备。