Fixed Incorrect pressure readings for the barometer

Fork of MS5637 by chris stevens

Revision:
9:83b2554646f5
Parent:
8:3a9d37268ccd
--- a/ms5637.cpp	Tue May 20 16:18:00 2014 +0000
+++ b/ms5637.cpp	Wed Jun 15 14:45:25 2016 +0000
@@ -15,6 +15,7 @@
 
 #include "mbed.h"
 #include "ms5637.h"
+//Serial pc2(USBTX, USBRX);
 
 double P;                       // compensated pressure value (mB)
 double T;                       // compensated temperature value (degC)
@@ -256,30 +257,32 @@
 void ms5637::calcPT() {
     int32_t D2 = cmd_adc(MS5637_CMD_ADC_D2 + MS5637_CMD_ADC_4096); // read D2
     int32_t D1 = cmd_adc(MS5637_CMD_ADC_D1 + MS5637_CMD_ADC_4096); // read D1
-    int64_t dT = D2 - ((uint64_t)C[5] << 8);
-    int64_t OFF  = ((uint32_t)C[2] << 17) + ((dT * (C[4]) >> 6));     //was  OFF  = (C[2] << 17) + dT * C[4] / (1 << 6);
-    int64_t SENS = ((uint32_t)C[1] << 16) + ((dT * (C[3]) >> 7));     //was  SENS = (C[1] << 16) + dT * C[3] / (1 << 7);
-    //T = (2000 + (((uint64_t)dT * C[6]) / (float)(1 << 23))) / 100;
-    T=(2000+(dT*C[6])/8388608)/100;
-    //int32_t TEMP = 2000 + (int64_t)dT * (int64_t)C[6] / (int64_t)(1 << 23);
-    int32_t TEMP = 2000 + (int64_t)dT * (int64_t)(C[6] >> 23);
-    if(TEMP < 2000) { // if temperature lower than 20 Celsius
-        float T1 = (TEMP - 2000) * (TEMP - 2000);
-        int64_t OFF1  = (61 * T1) / 16;
-        int64_t SENS1 = (29 * T1) / 16;
 
+    float dT = (float)D2 - ((float)C[5] * 256.0);
+    float TEMP = 2000.0 + (dT*(float)C[6])/8388608.0;
+    
+    float OFF  = ((float)C[2] * 131072.0 + (dT * (float)C[4])/64.0);
+    float SENS = ((float)C[1] * 65536.0)+ ((dT * ((float)C[3]) /128.0));
+    
+    // Commented out serial pc2 at start of code so you can check raw values
+    //pc2.printf("D1: %d\r\nD2: %d\r\nC1: %d\r\nC2: %d\r\nC3: %d\r\nC4: %d\r\nC5: %d\r\nC6: %d\r\n", D1, D2, C[1], C[2], C[3], C[4], C[5], C[6]);
+    //pc2.printf("OFF: %f\r\nSENS: %f\r\n",OFF, SENS);
+
+if(TEMP < 2000) { // if temperature lower than 20 Celsius
+        float T1 = (TEMP - 2000.0) * (TEMP - 2000.0);
+        float OFF1  = (61.0 * T1) / 16.0;
+        float SENS1 = (29.0 * T1) / 16.0;
+ 
         if(TEMP < -1500) { // if temperature lower than -15 Celsius
-            T1 = (TEMP + 1500) * (TEMP + 1500);
-            OFF1  += 17 * T1;
-            SENS1 += 9 * T1 ;
+            T1 = (TEMP + 1500.0) * (TEMP + 1500.0);
+            OFF1  += 17.0 * T1;
+            SENS1 += 9.0 * T1 ;
         } 
         OFF -= OFF1;
         SENS -= SENS1;
-        T = (float)TEMP / 100; 
     }
-//    int64_t P1 = ((((int64_t)D1 * SENS) >> 21) - OFF) >> 15;   
-    //P = ((((int64_t)D1 * SENS ) >> 21) - OFF) / (double) (1 << 15) / 100.0;
-    P=(D1*SENS/2097152-OFF)/3276800;
+        T = TEMP / 100.0;
+        P = ((D1*(SENS / 2097152.0)-OFF)/32768.0)/100.0;
 }
 
 //********************************************************