MS561101BA03气压计高度计中文资料最终上课讲义Word文档格式.docx
《MS561101BA03气压计高度计中文资料最终上课讲义Word文档格式.docx》由会员分享,可在线阅读,更多相关《MS561101BA03气压计高度计中文资料最终上课讲义Word文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
![MS561101BA03气压计高度计中文资料最终上课讲义Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/27/0c222210-01a4-4a8f-a2c4-c00f65da9078/0c222210-01a4-4a8f-a2c4-c00f65da90781.gif)
电源电压
VDD
-0.3V
+4.0V
最大压力值
Pmax
6bar
最大焊接温度
Tmax
最长40秒
250℃
电气特性
工作电压
1.8V
3.0V
3.6V
工作温度
T
-40℃
+25℃
+85℃
工作电流
(1samplepersec.)
IDD
OSR4096
2048
1024
512
256
12.5uA
6.3uA
3.2uA
1.7uA
0.9uA
VDD对地电容
VDDtoGND
100nF
模数转换(ADC)
输出字长(bit)
24
转换时间(ms)
tc
7.40
3.72
1.88
0.95
0.48
8.22
4.13
2.08
1.06
0.54
9.04
4.54
2.28
1.17
0.60
气压值输出特征
温度值输出特征
数字输入(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-bitPROM)
3.D1转换
4.D2转换
5.读取ADC结果(24-bit气压/温度值)
气压和温度计算(详见原文)
1.开始
计算结果最大值:
,
,
2.从PROM读取出厂校准数据
变量
描述|方程
推荐变量类型
Size
值
例子/典型
bit
min
Max
C1
压力灵敏度|SENST1
uint16
16
65535
40127
C2
压力抵消|OFFT1
36924
C3
温度压力灵敏度系数|TCS
23317
C4
温度系数的压力抵消|TCO
23282
C5
参考温度|TREF
33464
C6
温度系数的温度|TEMPSENS
28312
3.读取数字气压和温度值
D1
数字压力值
uint32
16777216
9085466
D2
数字温度值
8569150
4.计算温度
dT
实际和参考温度之间的差异
int32
25
-16776960
2366
TEMP
实际温度(-40…85°
C0.01°
C的分辨率)
41
-4000
8500
2007=
20.07°
C
5.计算温度补偿下的气压值
OFF
实际温度抵消
int64
-8589672450
12884705280
2420281617
SENS
实际温度灵敏度
-4294836225
6442352640
1315097036
P
温度补偿压力(10…1200mbar与0.01mbar分辨率)
58
1000
100009
=1000.09mbar
6.得到气压和温度值。
二阶温度补偿
对压力和温度达到最佳精度的流程图
SPI接口
SPI命令
下面的表格描述中每个命令的大小是1字节(8位)。
执行ADCread指令后将会返回一个24-bit的结果,执行PROMread指令后返回16-bit的结果。
存储器(PROM)的地址在PROMread命令中的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读模式,第二部分从系统中读取数据。
I2C读存储器指令,地址=011(系数:
3)
I2C从芯片中应答
通过向MS5611-01BA发送指令可以进入转换模式。
当命令写入到系统中,系统处于忙碌状态,直到转换完成。
当转换完成后可以发送一个读指令,此时MS5611-01BA发回一个应答,24个SCLK时钟将所有bit位传送出来。
每隔8bit就会等待一个应答信号
I2C启动压力转换指令(OSR=4096,typ=D1)
ADC读时序
I2C从MS5611-01BA读取数据
循环冗余检查(CRC)
MS5611-01BA包含128-Bit的PROM存储器。
存储器中有一个4bit的CRC数据检测位。
下面详细描述了CRC-4代码的使用。
典型应用电路
SPI协议
I2C协议
引脚定义
引脚
名称
类型
1
2
PS
I
通讯协议选择
PShigh(VDD)→I2C
PSlow(GND)→SPI
3
GND
G
接地
4
CSB
片选(低电平有效),
内部连接
5
6
SDO
O
串口数据输出
7
SDI/SDA
I/IO
串口数据输入/I2C数据
8
SCLK
串口时钟
***注:
原文附录有一些典型测量值的特征曲线可参考。
其中的一些关键点:
ADC的测量值D1和D2是分别用来测气压和温度的,且基本成线性关系;
在常温(20℃)或大于常温时,测量误差很小,而温度低于20℃时,气压和温度测量误差会明显增大;
电源电压为3V时,气压和温度测量误差很小,而其它供电电压下误差会大幅度增加。
51单片机测试代码
/**********MS5611模块*************/
/**用途:
MS5611模块IIC测试程序****/
/*****串口波特率设置为9600********/
#include<
REG52.H>
math.h>
//Keillibrary
stdlib.h>
stdio.h>
INTRINS.H>
#defineucharunsignedchar
#defineuintunsignedint
#defineulongunsignedlong
sbitSCL=P0^1;
//IIC时钟引脚定义
sbitSDA=P0^2;
//IIC数据引脚定义
#defineMS561101BA_SlaveAddress0xee//定义器件在IIC总线中的从地址
#defineMS561101BA_D10x40
#defineMS561101BA_D20x50
#defineMS561101BA_RST0x1E
//#defineMS561101BA_D1_OSR_2560x40
//#defineMS561101BA_D1_OSR_5120x42
//#defineMS561101BA_D1_OSR_10240x44
//#defineMS561101BA_D1_OSR_20480x46
#defineMS561101BA_D1_OSR_40960x48
//#defineMS561101BA_D2_OSR_2560x50
//#defineMS561101BA_D2_OSR_5120x52
//#defineMS561101BA_D2_OSR_10240x54
//#defineMS561101BA_D2_OSR_20480x56
#defineMS561101BA_D2_OSR_40960x58
#defineMS561101BA_ADC_RD0x00
#defineMS561101BA_PROM_RD0xA0
#defineMS561101BA_PROM_CRC0xAE
////////////////////////////////////////////////////////////////////////////////////
unsignedintCal_C[7];
//用于存放PROM中的8组数据
unsignedlongD1_Pres,D2_Temp;
//存放压力和温度
floatdT,TEMP;
doubleOFF_,SENS;
floatPressure;
//大气压
floatTEMP2,Aux,OFF2,SENS2;
//温度校验值
ulongex_Pressure;
//串口读数转换值
ucharexchange_num[8];
//-----------子函数声明-------------
voiddelay(unsignedintk);
voidDelay5us();
voidDelay5ms();
voidI2C_Start();
voidI2C_Stop();
voidI2C_SendACK(bitack);
bitI2C_RecvACK();
voidI2C_SendByte(uchardat);
ucharI2C_RecvByte();
voidMS561101BA_RESET();
voidMS561101BA_PROM_READ();
ulongMS561101BA_DO_CONVERSION(ucharcommand);
voidMS561101BA_getTemperature(ucharOSR_Temp);
voidMS561101BA_getPressure(ucharOSR_Pres);
voidMS561101BA_Init();
voidinit_uart();
voidSeriPushSend(ucharsend_data);
voidExchange_Number();
//-----------------------------------
//*********************************************************
//****************************************
//延时
voiddelay(unsignedintk)
{
unsignedinti,j;
for(i=0;
i<
k;
i++)
{
for(j=0;
j<
121;
j++);
}
}
/**************************************
延时5微秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数,注意时钟过快时需要修改
当改用1T的MCU时,请调整此延时函数
**************************************/
voidDelay5us()
{
_nop_();
_nop_();
延时5毫秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数
voidDelay5ms()
uintn=560;
while(n--);
//**************************************
//I2C起始信号
voidI2C_Start()
SDA=1;
//拉高数据线
SCL=1;
//拉高时钟线
Delay5us();
//延时
SDA=0;
//产生下降沿
SCL=0;
//拉低时钟线
//I2C停止信号
voidI2C_Stop()
//拉低数据线
//产生上升沿
//I2C发送应答信号
//入口参数:
ack(0:
ACK1:
NAK)
voidI2C_SendACK(bitack)
SDA=ack;
//写应答信号
//I2C接收应答信号
bitI2C_RecvACK()
CY=SDA;
//读应答信号
returnCY;
//向I2C总线发送一个字节数据
voidI2C_SendByte(uchardat)
uchari;
for(i=0;
i<
8;
i++)//8位计数器
{
dat<
<
=1;
//移出数据的最高位
SDA=CY;
//送数据口
}
I2C_RecvACK();
//从I2C总线接收一个字节数据
ucharI2C_RecvByte()
uchardat=0;
//使能内部上拉,准备读取数据,
dat|=SDA;
//读数据
returndat;
//=========================================================
//******MS561101BA程序********
voidMS561101BA_RESET()
{
I2C_Start();
I2C_SendByte(MS561101BA_SlaveAddress);
//I2C_RecvACK();
I2C_SendByte(MS561101BA_RST);
I2C_Stop();
voidMS561101BA_PROM_READ()
uchard1,d2,i;
=6;
I2C_Start();
I2C_SendByte(MS561101BA_SlaveAddress);
I2C_SendByte((MS561101BA_PROM_RD+i*2));
I2C_SendByte(MS561101BA_SlaveAddress+1);
d1=I2C_RecvByte();
I2C_SendACK(0);
d2=I2C_RecvByte();
I2C_SendACK
(1);
I2C_Stop();
Delay5ms();
Cal_C[i]=((uint)d1<
8)|d2;
ulongMS561101BA_DO_CONVERSION(ucharcommand)
ulongconversion=0;
ulongconv1,conv2,conv3;
I2C_SendByte(command);
delay(100);
I2C_SendByte(MS5