找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5101|回復: 2
打印 上一主題 下一主題
收起左側

bmp280溫度傳感器數(shù)據(jù)補償算法的兩種實現(xiàn)方式程序

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:428075 發(fā)表于 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;
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:975054 發(fā)表于 2022-2-10 17:47 | 只看該作者
目前基本正常,最后的主要問題:
(1) dig_P1 為unsigned short,但我讀出來顯示總是負數(shù)(但好像不影響最終結果),其他參數(shù)都正常; 不知道哪里錯了,統(tǒng)一定義和讀取顯示的。
(2)計算氣壓時,已加手冊公式里的一句:if (var1 == 0) { retune 0};
但最后一個var1不知為何讀出來都總是0,于是我又在后面再加了一句“if (var1 == 0) { retune0};不然繼續(xù)算下去最終讀數(shù)總是低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也夠了,模塊還小不少,價錢倒還貴一點停產(chǎn)了,不知道什么庫存或拆件?MS5611也試過只接4腳就可用,但貴很多很多暫無必要。
回復

使用道具 舉報

板凳
ID:975054 發(fā)表于 2022-2-10 17:48 | 只看該作者
STC8+280/180/5611硬件I2C都實現(xiàn)了,各有千秋,其實16位好像足以。280定點浮點公式都可以,定點不顯示小數(shù)點。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表