参照官方pdf文档做了一个bmp180输出温度气压程序,现在温度能正常,气压就是不准确,怎么调都不行,请大佬们帮忙看看哪里出了问题
[mw_shl_code=c,true]u8 oss=0x01;
bmp_data bmp_180;
static u16 bmp_tworead(u8 msb,u8 lsb)
{
u8 s1,s2;
s1=I2C_ReadByte(bmp180_addr,msb);
s2=I2C_ReadByte(bmp180_addr,lsb);
return((s1<<8)|(s2&0xFF));
}
void bmp_getcalib(void)
{
bmp_180.ac1=(short)bmp_tworead(0xAA,0xAB);
bmp_180.ac2=(short)bmp_tworead(0xAC,0xAD);
bmp_180.ac3=(short)bmp_tworead(0xAE,0xAF);
bmp_180.ac4=bmp_tworead(0xB0,0xB1);
bmp_180.ac5=bmp_tworead(0xB2,0xB3);
bmp_180.ac6=bmp_tworead(0xB4,0xB5);
bmp_180.b1=(short)bmp_tworead(0xB6,0xB7);
bmp_180.b2=(short)bmp_tworead(0xB8,0xB9);
bmp_180.mb=(short)bmp_tworead(0xBA,0xBB);
bmp_180.mc=(short)bmp_tworead(0xBC,0xBD);
bmp_180.md=(short)bmp_tworead(0xBE,0xBF);
}
u8 bmp180_init(void)
{
bmp_getcalib();
if(I2C_ReadByte(bmp180_addr,0xD0)==0x55)
{
return(0);
}else{return(1);}
}
void bmp_getdata(long *temp,long *pres)
{
u8 xlsb;
u16 mlsb;
long x1,x2,x3,b3,b5,b6,p;
unsigned long b4,b7;
I2C_WriteByte(bmp180_addr,0xF4,0x2E);//开始测温度
delay_ms(5);
bmp_180.ut=(long)bmp_tworead(0xF6,0xF7);//读出ut
x1=(bmp_180.ut-bmp_180.ac6)*bmp_180.ac5/32768;
x2=bmp_180.mc*2048/(x1+bmp_180.md);
b5=x1+x2;
*temp=(b5+8)/16;//计算出温度
I2C_WriteByte(bmp180_addr,0xF4,0x34+(oss<<6));//开始测气压
delay_ms(8);
mlsb=bmp_tworead(0xF6,0xF7);
xlsb=I2C_ReadByte(bmp180_addr,0xF8);
bmp_180.up=(mlsb<<8+xlsb)>>(8-oss);//读出up
b6=b5-4000;
x1=(bmp_180.b2*(b6*b6/4096))/2048;
x2=bmp_180.ac2*b6/2048;
x3=x1+x2;
b3=((bmp_180.ac1*4+x3)<<oss+2)/4;
x1=bmp_180.ac3*b6/8192;
x2=(bmp_180.b1*(b6*b6/4096))/65536;
x3=((x1+x2)+2)/4;
b4=bmp_180.ac4*(unsigned long)(x3+32768)/32768;
b7=((unsigned long)bmp_180.up-b3)*(50000>>oss);
if(b7<0x80000000)
{
p=(b7*2)/b4;
}else
{
p=(b7/b4)*2;
}
x1=(p/256)*(p/256);
x1=(x1*3038)/65536;
x2=(-7357*p)/65536;
p=p+(x1+x2+3791)/16;
*pres=p;
}[/mw_shl_code]
BST-BMP180-DS000-12.pdf
(635.94 KB, 下载次数: 47)
2018-8-21 20:46 上传
点击文件名下载附件
bmp180 pdf
输出数据:
输出数据
一周热门 更多>