性能描述
高度分辨率组件,10cm 转换时间低于1ms
低功率,工作电流1uA(待机状态<0.15uA) QFN封装尺寸:5.0×3.0×1.0 mm3 供电电压1.8V~3.6V
集成数字气压传感器(24位ADC)
测量/工作范围:10~1200mbar(毫巴=百帕),-40~+85℃ I2C和SPI接口,传输速率可达20MHz 无外接元件(内置振荡器) 长期稳定性好
描述
MS5611-o1BA气压传感器是由MEAS(瑞士)推出的一款SPI和I²C总线接口的新一代高分辨率气压传感器,分辨率可达到10cm。该传感器模块包括一个高线性度的压力传感器和一个超低功耗的24位Σ模数转换器(工厂校准系数)。MS5611提供了一个精确的24位数字压力值和温度值以及不同的操作模式,可以提高转换速度并优化电流消耗。高分辨率的温度输出无须额外传感器可实现高度计/温度计功能。可以与几乎任何微控制器连接。通信协议简单,无需在设备内部寄存器编程。MS5611压力传感器只有5.0毫米×3.0毫米×1.0毫米的小尺寸可以集成在移动设备中。这款传感器采用领先的MEMS技术并得益于MEAS(瑞士)十余年的成熟设计以及大批量制造经验,保证产品具有高稳定性以及非常低的压力信号滞后。
内部结构及技术数据
移动高度计/气压计系统 自行车电脑 气压表
医疗警报高度计 室内导航
原理框图
技术数据
性能参数
最大工作范围 参数 电源电压 最大压力值 最大焊接温度 电气特性 参数 工作电压 工作温度 工作电流 (1 sample per sec.) 符号 VDD Pmax Tmax 符号 VDD T IDD 条件 最长40秒 条件 OSR 4096 2048 1024 512 最小 -0.3V 最小 1.8V -40℃ 典型 典型 3.0V +25℃ 12.5uA 6.3uA 3.2uA 1.7uA 最大 +4.0V 6bar 250℃ 最大 3.6V +85℃ VDD对地电容 模数转换(ADC) 参数 符号 输出字长(bit) 256 VDD to GND 条件 OSR 4096 2048 1024 512 256 100nF 最小 7.40 3.72 1.88 0.95 0.48 0.9uA 典型 24 8.22 4.13 2.08 1.06 0.54 最大 9.04 4.54 2.28 1.17 0.60 转换时间(ms) tc 气压值输出特征 温度值输出特征
数字输入(CSB,I2C,DIN,SCLK) 气压输出(I2C,DOUT)
功能描述
综合描述
MS5611-01BA是由压阻传感器和传感器接口组成的的集成电路,主要功能是把测得未得补偿模拟气压值经ADC转换成24位的数字值输出,同时也可以输出一个24位的数字温度值。
出厂校验
每个模块都在两种温度和两种压力下有其单独的出厂校验,6系数必要补偿为过程变化和温度变化计算和存储到一个内部的128-bit存储器(PROM)中,这些值(划分成6个系数)用软件来读取并要通过程序将D1和D2中的值转换成标准气压、温度值。
串行接口
MS5611-01BA有两种类型的串行接口:SPI和I2C。通过调节PS引脚的电压来选择使用I2C或SPI通信接口:
SPI模式
外部微控制器通过输入SCLK(串行时钟)和SDI(串行数据)来传输数据。在SPI模式下时钟极性和相位允许同时模式0和模式3。SDO(串行数据)引脚为传感器的响应输出。CSB(芯片选择)引脚用来控制芯片使能/禁用,所以,其他设备可以共用同一组SPI总线。在命令发送完毕或命令执行结束(例如结束的转换)时CSB引脚将被拉高。在SPI总线空闲模式下模块有较好的噪声性能和在ADC转换时与其他设备链接。
I2C模式
外部微控制器通过输入SCLK(串行时钟)和SDA(串行数据)来传输数据。传感器的响应在一根双向的I2C总线接口SDA线上。所以这个接口类型只使用2信号线路而不需要片选信号,这可以减少板空间。在I2C模式下补充引脚CSB (芯片选择)代表了LSB的I2C地址。在I2C总线上可以使用两个传感器和两个不同的地址。CSB引脚应当连接到VDD或GND(不能悬空)。
指令
MS5611-01BA03只有5个基本命令: 1.复位(Reset)
2.读取存储器(128-bit PROM) 3.D1转换 4.D2转换
5.读取ADC结果(24-bit气压/温度值)
气压和温度计算(详见原文)
1.开始
TMAX85C,TMIN40C,PMAX1200mbar,计算结果最大值:PMIN10mbar ,
TREF20C
2.从PROM读取出厂校准数据 变量 C1 C2 C3 C4 C5 C6 D1 D2 描述|方程 压力灵敏度|SENST1 压力抵消| OFFT1 温度压力灵敏度系数| TCS 温度系数的压力抵消| TCO 参考温度|TREF 温度系数的温度|TEMPSENS 数字压力值 数字温度值 实际和参考温度之间的差异 dTD2TREFD2C5*28 推荐变量类型 Size bit uint 16 uint 16 uint 16 uint 16 uint 16 uint 16 uint 32 uint 32 int 32 int 32 16 16 16 16 16 16 24 24 min 0 0 0 0 0 0 值 Max 65535 65535 65535 65535 65535 65535 40127 36924 23317 23282 33464 28312 9085466 8569150 例子/典型 3.读取数字气压和温度值 0 16777216 0 16777216 4.计算温度 dT 25 -16776960 16777216 2366 41 -4000 8500 TEMP 实际温度(-40…85°C 0.01°C的分辨率) TEMP20CdT*TEMPSENS 2000dT*C6/2232007= 20.07°C 5.计算温度补偿下的气压值 OFF 实际温度抵消 OFFOFFT1TCO*dTC2*2(c3*dT)/2167uint 41 -8589672450 12884705280 2420281617 64 uint 41 -4294836225 6442352640 64 uint 58 1000 64 1315097036 SENS 实际温度灵敏度 SENSSENST1TCS*dTc1*215(C3*dT)/28P 温度补偿压力(10…1200mbar与0.01mbar分辨率) PD1*SENSOFF(D1*SENS/2OFF)/22115 100009 =1000.09 mbar 6.得到气压和温度值。
二阶温度补偿
是TEMP<20C否低温高温T2dT2/231OFF25(TEMP2000)2/21SENS25(TEMP2000)2/22是TEMP<-15C否T20OFF20SENS20非常低的温度OFF2OFF27(TEMP1500)2SENS2SENS11(TEMP1500)2/21计算压力和温度TEMPTEMPT2OFFOFFOFF2SENSSENESENS2 对压力和温度达到最佳精度的流程图
SPI接口
SPI命令
下面的表格描述中每个命令的大小是1字节(8位)。执行ADC read指令后将会返回一个24-bit的结果,执行PROM read指令后返回16-bit的结果。存储器(PROM)的地址在PROM read命令中的a2,a1和a0位。
命令结构
SPI复位时序 转换时序
存储器读取时序图参见原文。
I2C接口
I2C命令
每个I2C通信消息都有开始和停止状态。MS5611-01BA的I2C地址为111011Cx,其中C为CSB引脚的补码值(取反)。因为传感器内并没有微控制器,所有I2C的命令和SPI是相同的。
I2C复位时序
复位指令可以在任何时间发送。如果没有成功的上电复位,这可能是被屏蔽的SDA模块在应答状态。MS5611-01BA唯一的复位方式是发送几个SCLKs后跟一个复位指令或上电复位。
来自主机 S = 开始命令 W = 写命令 A =应答 来自从机 P = 停止命令 R =读命令 N = 无应答
I2C复位指令
存储器读取时序
PROM读指令由两部分构成,第一部分使系统处于PROM读模式,第二部分从系统中读取数据。
来自主机 S = 开始命令 W = 写命令 A =应答 来自从机 P = 停止命令 R =读命令 N = 无应答 I2C读存储器指令,地址=011(系数:3)
来自主机 S = 开始命令 W = 写命令 A =应答 来自从机 P = 停止命令 R =读命令 N = 无应答
I2C从芯片中应答
转换时序
通过向MS5611-01BA发送指令可以进入转换模式。当命令写入到系统中,系统处于忙碌状态,直到转换完成。当转换完成后可以发送一个读指令,此时MS5611-01BA发回一个应答,24个SCLK时钟将所有bit位传送出来。每隔8bit就会等待一个应答信号
来自主机 S = 开始命令 W = 写命令 A =应答 来自从机 P = 停止命令 R =读命令 N = 无应答 I2C启动压力转换指令(OSR=4096, typ=D1)
来自主机 S = 开始命令 W = 写命令 A =应答 来自从机 P = 停止命令 R =读命令 N = 无应答
ADC读时序
来自主机 S = 开始命令 W = 写命令 A =应答 来自从机 P = 停止命令 R =读命令 N = 无应答
I2C从MS5611-01BA读取数据
循环冗余检查(CRC)
MS5611-01BA包含128-Bit的PROM存储器。存储器中有一个4bit的CRC数据检测位。下面详细描述了CRC-4代码的使用。
典型应用电路
SPI协议
I2C协议
引脚定义
引脚 1 2 3 4 5 6 7 8
名称 VDD PS GND CSB SDO SDI/SDA SCLK 类型 P I G I O I/IO I 电源电压 通讯协议选择 PS high(VDD)→I2C PS low(GND)→SPI 接地 片选(低电平有效), 内部连接 串口数据输出 串口数据输入/I2C数据 串口时钟 描述 ***注:原文附录有一些典型测量值的特征曲线可参考。其中的一些关键点:ADC的测量值D1和D2是分别用来测气压和温度的,且基本成线性关系;在常温(20℃)或大于常温时,测量误差很小,而温度低于20℃时,气压和温度测量误差会明显增大;电源电压为3V时,气压和温度测量误差很小,而其它供电电压下误差会大幅度增加。
ARDUINO 测试代码
MS561101BA.h文件:
#ifndef MS561101BA_h #define MS561101BA_h
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) #endif
#include \"WProgram.h\" #include //#define DEBUG_V //#define DEBUG //#include // addresses of the device #define MS561101BA_ADDR_CSB_HIGH 0x76 //CBR=1 0x76 I2C address when CSB is connected to HIGH (VCC) #define MS561101BA_ADDR_CSB_LOW 0x77 //CBR=0 0x77 I2C address when CSB is connected to LOW (GND) // registers of the device #define MS561101BA_D1 0x40 #define MS561101BA_D2 0x50 #define MS561101BA_RESET 0x1E // D1 and D2 result size (bytes) #define MS561101BA_D1D2_SIZE 3 // OSR (Over Sampling Ratio) constants #define MS561101BA_OSR_256 0x00 #define MS561101BA_OSR_512 0x02 #define MS561101BA_OSR_1024 0x04 #define MS561101BA_OSR_2048 0x06 #define MS561101BA_OSR_4096 0x08 #define MS561101BA_PROM_BASE_ADDR 0xA2 // by adding ints from 0 to 6 we can read all the prom configuration values. // C1 will be at 0xA2 and all the subsequent are multiples of 2 #define MS561101BA_PROM_REG_COUNT 6 // number of registers in the PROM #define MS561101BA_PROM_REG_SIZE 2 // size in bytes of a prom registry. class MS561101BA { public: MS561101BA(); void init(uint8_t addr); float getPressure(uint8_t OSR); float getTemperature(uint8_t OSR); int64_t getDeltaTemp(uint8_t OSR); int32_t rawPressure(uint8_t OSR); int32_t rawTemperature(uint8_t OSR); int readPROM(); void reset(); private: unsigned long doConversion(uint8_t command); uint8_t _addr; uint16_t _C[MS561101BA_PROM_REG_COUNT]; }; #endif // MS561101BA_h MS561101BA.cpp文件: #include \"MS561101BA.h\" #define EXTRA_PRECISION 5 // trick to add more precision to the pressure and temp readings MS561101BA::MS561101BA() { ; } void MS561101BA::init(uint8_t address) { _addr = address; // disable internal pullups of the ATMEGA which Wire enable by default #if defined(__AVR_ATmega168__) || defined(__AVR_ATmega8__) || defined(__AVR_ATmega328P__) // deactivate internal pull-ups for twi // as per note from atmega8 manual pg167 cbi(PORTC, 4); cbi(PORTC, 5); #else // deactivate internal pull-ups for twi // as per note from atmega128 manual pg204 cbi(PORTD, 0); cbi(PORTD, 1); #endif reset(); // reset the device to populate its internal PROM registers delay(1000); // some safety time readPROM(); // reads the PROM into object variables for later use } float MS561101BA::getPressure(uint8_t OSR) { // see datasheet page 7 for formulas int64_t dT = getDeltaTemp(OSR); int64_t off = (((int64_t)_C[1]) << 16) + ((_C[3] * dT) >> 7); int64_t sens = (((int64_t)_C[0]) << 15) + ((_C[2] * dT) >> 8); return ((((rawPressure(OSR) * sens) >> 21) - off) >> (15-EXTRA_PRECISION)) / ((1< // see datasheet page 7 for formulas return ((1< return rawTemperature(OSR) - (((int32_t)_C[4]) << 8); } int32_t MS561101BA::rawPressure(uint8_t OSR) { return doConversion(MS561101BA_D1 + OSR); } int32_t MS561101BA::rawTemperature(uint8_t OSR) { return doConversion(MS561101BA_D2 + OSR); } unsigned long MS561101BA::doConversion(uint8_t command) { unsigned long conversion = 0; // see page 11 of the datasheet // initialize pressure conversion Wire.beginTransmission(_addr); Wire.send(command); Wire.endTransmission(); delay(10); // the conversion will take a time <= 9.04 ms to have the output ready // TODO: make the delay dependant on the OSR requested in the command // start read sequence Wire.beginTransmission(_addr); Wire.send(0); Wire.endTransmission(); Wire.beginTransmission(_addr); Wire.requestFrom(_addr, (uint8_t) MS561101BA_D1D2_SIZE); if(Wire.available()) { conversion = Wire.receive() * 65536 + Wire.receive() * 256 + Wire.receive(); } else { conversion = -1; } return conversion; } /*** Reads factory calibration and store it into object variables.*/ int MS561101BA::readPROM() { for (int i=0;i Wire.send(MS561101BA_PROM_BASE_ADDR + (i * MS561101BA_PROM_REG_SIZE)); Wire.endTransmission(); Wire.beginTransmission(_addr); Wire.requestFrom(_addr, (uint8_t) MS561101BA_PROM_REG_SIZE); if(Wire.available()) { _C[i] = Wire.receive() << 8 | Wire.receive(); //DEBUG_PRINT(_C[i]); } else { return -1; // error reading the PROM or communicating with the device } } return 0; } /*** Send a reset command to the device. With the reset command the device * populates its internal registers with the values read from the PROM.*/ void MS561101BA::reset() { Wire.beginTransmission(_addr); Wire.send(MS561101BA_RESET); Wire.endTransmission(); } 因篇幅问题不能全部显示,请点此查看更多更全内容