Bosch Sensortec Community

    cancel
    Showing results for 
    Search instead for 
    Did you mean: 

    BME280 Temperature Compensation Issue

    BME280 Temperature Compensation Issue

    Theorem25
    Member

    Hi,

    I'm using the BME280 for a project, and is having hard time converting the sensor's ADC temperature value into "human" readable temperature, the values always off. I'm not sure whether the issue is with the compensation equations or somewhere else.  I'm able to write and read data back and forth between the  BME280 sensor and the microcontroller.

    Below are sample pictures of the I2C communication

    Get VersionGet VersionRaw Temp and PressureRaw Temp and PressureRead Calibration ValuesRead Calibration Values

    Compensation Equations to convert raw ADC value into human readable temperature. For instance, the UT value  at this moment in time  is 0x00086b2b. After that value went throught the equations, the t_fine_temp value is 0x00000594 or 1428 in decimal which is 14.28 degree C which i think is incorrect. Unfortunately, i don't know what the correct value should be.

    int32_t BME280_CalcT(int32_t UT) 
    {
    #if 1
    
    	volatile sLWord t_fine_temp = 0x0000;
    	volatile sLWord t_fine_temp2= 0x0000;
    	//int32_t t_fine_temp3;
    	//int32_t t_fine_1;
    	
    #if 1
    	t_fine_temp  = ((((UT >> 3) - ((sLWord)cal_param.dig_T1 << 1))) * ((sLWord)cal_param.dig_T2)) >> 11;
    	t_fine_temp2 = (((((UT >> 4) - ((sLWord)cal_param.dig_T1)) * ((UT >> 4) - ((sLWord)cal_param.dig_T1))) >> 12) * ((sLWord)cal_param.dig_T3)) >> 14;
    	t_fine_temp += t_fine_temp2;
    	t_fine_temp = ((t_fine_temp * 5) + 128) >> 8;
    #endif
    	return t_fine_temp;
    #endif
    }
    cal_param	0x00000116	0x000116`Ram	
    	dig_T1	0x596f	0x000116`Ram	
    	dig_T2	0x1067	0x000118`Ram	
    	dig_T3	0x3200	0x00011a`Ram	

    Can anyone show me where thing went wrong ?

    Thank you very much

    Vu

    10 REPLIES 10

    o_o
    Contributor

    Assuming that you are properly reading the calibration and data registers into the variables in your code, the formula is correct.

     

    Here's an excel spreadsheet where you can validate that the formula is good.

    Hi,

    Thanks for your help.  Your excel spreadsheet verified that the equations i used to calcaulate the "human" readable temperature are indeed correct. Do you have any document or method to validate the calibration or the raw temperature values read from the BME280 sensor is  valid ?  Is the UT value 0x86B2B a valid number  at a specific temperature ? Maybe 25 something degree C ? 

    Based on the "Raw Temp and Pressure" and "Read Calibration Values" images the  calibration and temperature values look valid.

    Thanks

    Vu

    There are no specific boundaries to the value of UT. To validate that the calibration is good, the only way is to compare the output of the compensated temperature to a reference device.

    Hi Vu, it looks like the 0x86B2B is a valid uncompensated temperature reading, but the calibration data has swapped msb and lsb data.  Unlike the raw temperature data that is stored msb ahead of lsb, the calibration data seems to be lsb ahead of the msb.  So instead of:

    dig_T122895
    dig_T24199
    dig_T312800

    It should be:

    dig_T128505
    dig_T226384
    dig_T350

     

    This gives a temperature of 30.09C.  Is that more in line with what you expected?

    It didn't matter for this calculation, but the spreadsheet has UP and UT measurement entries switched, based on where the data should be per the 1.6v 092018 data sheet.

    Icon--AD-black-48x48Icon--address-consumer-data-black-48x48Icon--appointment-black-48x48Icon--back-left-black-48x48Icon--calendar-black-48x48Icon--center-alignedIcon--Checkbox-checkIcon--clock-black-48x48Icon--close-black-48x48Icon--compare-black-48x48Icon--confirmation-black-48x48Icon--dealer-details-black-48x48Icon--delete-black-48x48Icon--delivery-black-48x48Icon--down-black-48x48Icon--download-black-48x48Ic-OverlayAlertIcon--externallink-black-48x48Icon-Filledforward-right_adjustedIcon--grid-view-black-48x48IC_gd_Check-Circle170821_Icons_Community170823_Bosch_Icons170823_Bosch_Icons170821_Icons_CommunityIC-logout170821_Icons_Community170825_Bosch_Icons170821_Icons_CommunityIC-shopping-cart2170821_Icons_CommunityIC-upIC_UserIcon--imageIcon--info-i-black-48x48Icon--left-alignedIcon--Less-minimize-black-48x48Icon-FilledIcon--List-Check-grennIcon--List-Check-blackIcon--List-Cross-blackIcon--list-view-mobile-black-48x48Icon--list-view-black-48x48Icon--More-Maximize-black-48x48Icon--my-product-black-48x48Icon--newsletter-black-48x48Icon--payment-black-48x48Icon--print-black-48x48Icon--promotion-black-48x48Icon--registration-black-48x48Icon--Reset-black-48x48Icon--right-alignedshare-circle1Icon--share-black-48x48Icon--shopping-bag-black-48x48Icon-shopping-cartIcon--start-play-black-48x48Icon--store-locator-black-48x48Ic-OverlayAlertIcon--summary-black-48x48tumblrIcon-FilledvineIc-OverlayAlertwhishlist