找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4242|回复: 2
收起左侧

bmp280温度传感器数据补偿算法的两种实现方式程序

[复制链接]
ID:428075 发表于 2018-11-17 10:49 | 显示全部楼层 |阅读模式
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;
}

回复

使用道具 举报

ID:975054 发表于 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脚就可用,但贵很多很多暂无必要。
回复

使用道具 举报

ID:975054 发表于 2022-2-10 17:48 | 显示全部楼层
STC8+280/180/5611硬件I2C都实现了,各有千秋,其实16位好像足以。280定点浮点公式都可以,定点不显示小数点。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表