标题: bmp280温度传感器数据补偿算法的两种实现方式程序 [打印本页]
作者: 卡卡西718 时间: 2018-11-17 10:49
标题: bmp280温度传感器数据补偿算法的两种实现方式程序
int64_t var1,var2,p;
var1=((int64_t)bmp280Cal1.t_fine)-128000;
var2=var1*var1*(int64_t)bmp280Cal1.dig_P6;
var2=var2+((var1*(int64_t)bmp280Cal1.dig_P5)<<17);
var2=var2+(((int64_t)bmp280Cal1.dig_P4)<<35);
var1=((var1*var1*(int64_t)bmp280Cal1.dig_P3)>>8)+((var1*(int64_t)bmp280Cal1.dig_P2)<<12);
var1=(((((int64_t)1)<<47)+var1))*((int64_t)bmp280Cal1.dig_P1)>>33;
if (var1==0)
delay_ms(10);
p=1048576- bmp280RawPressure1;
p=(((p<<31)-var2)*3125)/var1;
var1=(((int64_t)bmp280Cal1.dig_P9)*(p>>13)*(p>>13))>>25;
var2=(((int64_t)bmp280Cal1.dig_P8)*p)>>19;
p=((p+var1+var2)>>8)+(((int64_t)bmp280Cal1.dig_P7)<<4);
p=p/25600.0;
longbmp280_GetValue(void)
{
long adc_T;
long adc_P;
long var1, var2, t_fine, T, p;
adc_T =bmp280_MultipleReadThree(BMP280_TEMP_ADDR);
adc_P =bmp280_MultipleReadThree(BMP280_PRESS_ADDR);
if(adc_P == 0)
{
return 0;
}
//Temperature
var1 = (((double)adc_T)/16384.0-((double)dig_T1)/1024.0)*((double)dig_T2);
var2 =((((double)adc_T)/131072.0-((double)dig_T1)/8192.0)*(((double)adc_T)
/131072.0-((double)dig_T1)/8192.0))*((double)dig_T3);
t_fine = (unsigned long)(var1+var2);
T = (var1+var2)/5120.0;
var1 = ((double)t_fine/2.0)-64000.0;
var2 = var1*var1*((double)dig_P6)/32768.0;
var2 = var2 +var1*((double)dig_P5)*2.0;
var2 =(var2/4.0)+(((double)dig_P4)*65536.0);
var1 = (((double)dig_P3)*var1*var1/524288.0+((double)dig_P2)*var1)/524288.0;
var1 = (1.0+var1/32768.0)*((double)dig_P1);
p = 1048576.0-(double)adc_P;
p = (p-(var2/4096.0))*6250.0/var1;
var1 = ((double)dig_P9)*p*p/2147483648.0;
var2 = p*((double)dig_P8)/32768.0;
p = p+(var1+var2+((double)dig_P7))/16.0;
return p;
}
作者: ax6808 时间: 2022-2-10 17:47
目前基本正常,最后的主要问题:
(1) dig_P1 为unsigned short,但我读出来显示总是负数(但好像不影响最终结果),其他参数都正常; 不知道哪里错了,统一定义和读取显示的。
(2)计算气压时,已加手册公式里的一句:if (var1 == 0) { retune 0};
但最后一个var1不知为何读出来都总是0,于是我又在后面再加了一句“if (var1 == 0) { retune0};不然继续算下去最终读数总是低1850Pa(但没用到dig_P7、8、9);
P: var1 = ...;
var2 = ...;
var2 = ...;
var2 = ...;
var1 = (((double)dig_P3)*var1*var1/524288.0+((double)dig_P2)*var1)/524288.0;
var1 = (1.0+var1/32768.0)*((double)dig_P1);
if (var1 == 0.0) return 0; //avoid exception caused by division by zero避免被零除异常;
p = 1048576.0-(double)adc_P;
p = (p-(var2/4096.0))*6250.0/var1;
var1 = ((double)dig_P9)*P*P/2147483648.0; //这个 var1读出来总是0???
if (var1 == 0.0) return 0; // 于是自己再加了1句:更准了(后面2句无效)!
var2 = p*((double)dig_P8)/32768.0;
p = p+(var1+var2+((double)dig_P7))/16.0;
return p;
(3)GY-63模块如此便宜,真不敢相信是否原装货?
(4)其实16位足够一般人用了,用BMP180也够了,模块还小不少,价钱倒还贵一点停产了,不知道什么库存或拆件?MS5611也试过只接4脚就可用,但贵很多很多暂无必要。
作者: ax6808 时间: 2022-2-10 17:48
STC8+280/180/5611硬件I2C都实现了,各有千秋,其实16位好像足以。280定点浮点公式都可以,定点不显示小数点。
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |