UAVX Multicopter Flight Controller.

Dependencies:   mbed

Revision:
2:90292f8bd179
Parent:
1:1e3318a30ddd
--- a/baro.c	Fri Feb 25 01:35:24 2011 +0000
+++ b/baro.c	Tue Apr 26 12:12:29 2011 +0000
@@ -2,7 +2,7 @@
 // =                              UAVXArm Quadrocopter Controller                                =
 // =                           Copyright (c) 2008 by Prof. Greg Egan                             =
 // =                 Original V3.15 Copyright (c) 2007 Ing. Wolfgang Mahringer                   =
-// =                     http://code.google.com/p/uavp-mods/ http://uavp.ch                      =
+// =                           http://code.google.com/p/uavp-mods/                               =
 // ===============================================================================================
 
 //    This is part of UAVXArm.
@@ -75,8 +75,8 @@
 } // ShowBaro
 
 void BaroTest(void) {
+
     TxString("\r\nAltitude test\r\n");
-
     TxString("Initialising\r\n");
 
     InitBarometer();
@@ -87,7 +87,9 @@
     TxString("\r\nType:\t");
     ShowBaroType();
 
-    TxString("Init Retries:\t");
+    TxString("BaroScale:\t");
+    TxVal32(P[BaroScale],0,0);
+    TxString("\r\nInit Retries:\t");
     TxVal32((int32)BaroRetries - 2, 0, ' '); // always minimum of 2
     if ( BaroRetries >= BARO_INIT_RETRIES )
         TxString(" FAILED Init.\r\n");
@@ -95,7 +97,9 @@
         TxNextLine();
 
     if ( BaroType == BaroMPX4115 ) {
-        TxString("Range   :\t");
+        TxString("\r\nAddress :\t0x");
+        TxValH(MCP4725_ID_Actual);
+        TxString("\r\nRange   :\t");
         TxVal32((int32) BaroDescentAvailable * 10.0, 1, ' ');
         TxString("-> ");
         TxVal32((int32) BaroClimbAvailable * 10.0, 1, 'M');
@@ -106,15 +110,19 @@
         TxNextLine();
     }
 
-    if ( !F.BaroAltitudeValid ) goto BAerror;
+    if ( F.BaroAltitudeValid ) {
+
+        while ( !F.NewBaroValue )
+            GetBaroAltitude();
+
+        F.NewBaroValue = false;
 
-    while ( !F.NewBaroValue )
-        GetBaroAltitude();
-    F.NewBaroValue = false;
+        TxString("Alt.:     \t");
+        TxVal32(BaroRelAltitude * 10.0, 1, ' ');
+        TxString("M\r\n");
 
-    TxString("Alt.:     \t");
-    TxVal32(BaroRelAltitude * 10.0, 1, ' ');
-    TxString("M\r\n");
+    } else
+        TxString("Barometer FAILED\r\n");
 
     TxString("\r\nR.Finder: \t");
     if ( F.RangefinderAltitudeValid ) {
@@ -128,9 +136,6 @@
     TxVal32((int32)AmbientTemperature.i16, 1, ' ');
     TxString("C\r\n");
 
-    return;
-BAerror:
-    TxString("FAIL\r\n");
 } // BaroTest
 
 void GetBaroAltitude(void) {
@@ -167,7 +172,7 @@
             Stats[BaroFailS]++;
         }
 
-        Temp = Limit( Temp , -BARO_SANITY_CHECK_MPS, BARO_SANITY_CHECK_MPS );
+        Temp = Limit1(Temp, BARO_SANITY_CHECK_MPS);
         ROC = ROC * 0.9 + Temp * 0.1;
         BaroRelAltitudeP = BaroRelAltitude;
 
@@ -191,18 +196,17 @@
     BaroRelAltitude = BaroRelAltitudeP = CompBaroPressure = OriginBaroPressure = 0;
     BaroType = BaroUnknown;
 
-    Comp[Alt] = AltDiffSum = AltDSum = 0;
+    AltComp = AltDiffSum = AltDSum = 0;
     F.BaroAltitudeValid= true; // optimistic
- 
+
     if ( IsFreescaleBaroActive() )
         InitFreescaleBarometer();
     else
         if ( IsBoschBaroActive() )
             InitBoschBarometer();
-        else {
+        else
             F.BaroAltitudeValid = F.HoldingAlt = false;
-            Stats[BaroFailS]++;
-        }
+
 } // InitBarometer
 
 // -----------------------------------------------------------
@@ -222,32 +226,43 @@
 
 void SetFreescaleMCP4725(int16 d) {
     static i16u dd;
-    static uint8 r;
 
     dd.u16 = d << 4;                            // left align
 
     I2CBARO.start();
-    r = I2CBARO.write(MCP4725_ID_Actual) != I2C_ACK;
-    r = I2CBARO.write(MCP4725_CMD) != I2C_ACK;
-    r = I2CBARO.write(dd.b1) != I2C_ACK;
-    r = I2CBARO.write(dd.b0) != I2C_ACK;
+    if ( I2CBARO.write(MCP4725_ID_Actual) != I2C_ACK ) goto MCP4725Error;
+    if ( I2CBARO.write(MCP4725_CMD) != I2C_ACK ) goto MCP4725Error;
+    if ( I2CBARO.write(dd.b1) != I2C_ACK ) goto MCP4725Error;
+    if ( I2CBARO.write(dd.b0) != I2C_ACK ) goto MCP4725Error;
     I2CBARO.stop();
 
+    return;
+
+MCP4725Error:
+    I2CBARO.stop();
+    I2CError[MCP4725_ID_Actual]++;
+
 } // SetFreescaleMCP4725
 
 boolean IdentifyMCP4725(void) {
 
     static boolean r;
-    
+
     r = true;
-    if ( I2CBAROAddressResponds( MCP4725_ID_0xC8 ) )
-        MCP4725_ID_Actual = MCP4725_ID_0xC8;
-    else 
-        if ( I2CBAROAddressResponds( MCP4725_ID_0xCC ) )
-            MCP4725_ID_Actual = MCP4725_ID_0xCC;
+    MCP4725_ID_Actual = MCP4725_ID_0xCC;
+    if ( I2CBAROAddressResponds( MCP4725_ID_0xCC ) )
+        MCP4725_ID_Actual = MCP4725_ID_0xCC;
+    else
+        if ( I2CBAROAddressResponds( MCP4725_ID_0xC8 ) )
+            MCP4725_ID_Actual = MCP4725_ID_0xC8;
         else
             r = false;
-   return(r);    
+
+    return(r);
+
+//   MCP4725_ID_Actual = FORCE_BARO_ID;
+//   return(true);
+
 } // IdentifyMCP4725
 
 void SetFreescaleOffset(void) {
@@ -280,13 +295,14 @@
     Delay1mS(100);
     ReadFreescaleBaro();
 
-    while ( (BaroVal.u16 < (uint16)(((uint24)ADS7823_MAX*4L*3L)/4L) ) && (BaroOffsetDAC > 2) ) {
-        BaroOffsetDAC -= 2;
+    while ( (BaroVal.u16 < (uint16)(((uint24)ADS7823_MAX*4L*3L)/4L) ) && (BaroOffsetDAC > 1) ) {
+        BaroOffsetDAC -= 1;
         SetFreescaleMCP4725(BaroOffsetDAC);
-        Delay1mS(10);
+        Delay1mS(10); // 10
         ReadFreescaleBaro();
         TxVal32(BaroOffsetDAC,0,HT);
-        TxVal32(BaroVal.u16,0,' ');
+        TxVal32(BaroVal.u16,0,HT);
+        TxVal32((int32)FreescaleToDM(BaroVal.u16), 1, 0);
         TxNextLine();
         LEDYellow_TOG;
     }
@@ -303,11 +319,13 @@
     mS[BaroUpdate] = mSClock() + ADS7823_TIME_MS;
 
     I2CBARO.start();  // start conversion
+    if ( I2CBARO.write(ADS7823_WR) != I2C_ACK ) goto ADS7823Error;
+    if ( I2CBARO.write(ADS7823_CMD) != I2C_ACK ) goto ADS7823Error;
+    I2CBARO.stop();
 
-    if ( I2CBARO.write(ADS7823_WR) != I2C_ACK ) goto FSError;
-    if ( I2CBARO.write(ADS7823_CMD) != I2C_ACK ) goto FSError;
+    if ( I2CBARO.blockread(ADS7823_RD, B, 8) ) goto ADS7823Error;
 
-    I2CBARO.blockread(ADS7823_RD, B, 8);  // read block of 4 baro samples
+    // read block of 4 baro samples
 
     B0.b0 = B[1];
     B0.b1 = B[0];
@@ -324,15 +342,17 @@
 
     return;
 
-FSError:
+ADS7823Error:
     I2CBARO.stop();
 
-    F.BaroAltitudeValid = F.HoldingAlt = false;
+    I2CError[ADS7823_ID]++;
+
+    // F.BaroAltitudeValid = F.HoldingAlt = false;
     if ( State == InFlight ) {
         Stats[BaroFailS]++;
         F.BaroFailure = true;
     }
-    return;
+
 } // ReadFreescaleBaro
 
 real32 FreescaleToDM(int24 p) { // decreasing pressure is increase in altitude negate and rescale to metre altitude
@@ -369,15 +389,15 @@
 
 void InitFreescaleBarometer(void) {
     static int16 BaroOriginAltitude, MinAltitude;
-    real32 Error;
     static int24 BaroPressureP;
 
     AltitudeUpdateRate = 1000L/ADS7823_TIME_MS;
 
     BaroTemperature = 0;
-    Error = ( (int16)P[BaroScale] * 20 ) / 16;  // 0.2M
+    if ( P[BaroScale] <= 0 )
+        P[BaroScale] = 56; // failsafe setting
+
     BaroPressure =  0;
-
     BaroRetries = 0;
     do {
         BaroPressureP = BaroPressure;
@@ -388,7 +408,7 @@
         ReadFreescaleBaro();
         BaroPressure = (int24)BaroVal.u16;
     } while ( ( ++BaroRetries < BARO_INIT_RETRIES )
-              && ( abs((int16)(BaroPressure - BaroPressureP)) > Error ) );
+              && ( fabs( FreescaleToDM(BaroPressure - BaroPressureP) ) > 5 ) );
 
     F.BaroAltitudeValid = BaroRetries < BARO_INIT_RETRIES;
 
@@ -444,54 +464,57 @@
     }
 
     I2CBARO.start();
-    if ( I2CBARO.write(BOSCH_ID) != I2C_ACK ) goto SBerror;
-
+    if ( I2CBARO.write(BOSCH_ID) != I2C_ACK ) goto BoschError;
     // access control register, start measurement
-    if ( I2CBARO.write(BOSCH_CTL) != I2C_ACK ) goto SBerror;
-
+    if ( I2CBARO.write(BOSCH_CTL) != I2C_ACK ) goto BoschError;
     // select 32kHz input, measure temperature
-    if ( I2CBARO.write(TempOrPress) != I2C_ACK ) goto SBerror;
+    if ( I2CBARO.write(TempOrPress) != I2C_ACK ) goto BoschError;
     I2CBARO.stop();
 
     F.BaroAltitudeValid = true;
     return;
 
-SBerror:
+BoschError:
     I2CBARO.stop();
-    F.BaroAltitudeValid = F.HoldingAlt = false;
-    return;
+
+    I2CError[BOSCH_ID]++;
+    F.BaroAltitudeValid = false;
+
 } // StartBoschBaroADC
 
 void ReadBoschBaro(void) {
+
     // Possible I2C protocol error - split read of ADC
     I2CBARO.start();
-    if ( I2CBARO.write(BOSCH_WR) != I2C_ACK ) goto RVerror;
-    if ( I2CBARO.write(BOSCH_ADC_MSB) != I2C_ACK ) goto RVerror;
+    if ( I2CBARO.write(BOSCH_WR) != I2C_ACK ) goto BoschError;
+    if ( I2CBARO.write(BOSCH_ADC_MSB) != I2C_ACK ) goto BoschError;
     I2CBARO.start();    // restart
-    if ( I2CBARO.write(BOSCH_RD) != I2C_ACK ) goto RVerror;
+    if ( I2CBARO.write(BOSCH_RD) != I2C_ACK ) goto BoschError;
     BaroVal.b1 = I2CBARO.read(I2C_NACK);
     I2CBARO.stop();
 
     I2CBARO.start();
-    if ( I2CBARO.write(BOSCH_WR) != I2C_ACK ) goto RVerror;
-    if ( I2CBARO.write(BOSCH_ADC_LSB) != I2C_ACK ) goto RVerror;
+    if ( I2CBARO.write(BOSCH_WR) != I2C_ACK ) goto BoschError;
+    if ( I2CBARO.write(BOSCH_ADC_LSB) != I2C_ACK ) goto BoschError;
     I2CBARO.start();    // restart
-    if ( I2CBARO.write(BOSCH_RD) != I2C_ACK ) goto RVerror;
+    if ( I2CBARO.write(BOSCH_RD) != I2C_ACK ) goto BoschError;
     BaroVal.b0 = I2CBARO.read(I2C_NACK);
     I2CBARO.stop();
 
     F.BaroAltitudeValid = true;
     return;
 
-RVerror:
+BoschError:
     I2CBARO.stop();
 
+    I2CError[BOSCH_ID]++;
+
     F.BaroAltitudeValid = F.HoldingAlt = false;
     if ( State == InFlight ) {
         Stats[BaroFailS]++;
         F.BaroFailure = true;
     }
-    return;
+
 } // ReadBoschBaro
 
 #define BOSCH_BMP085_TEMP_COEFF        62L
@@ -535,10 +558,8 @@
 
                 F.NewBaroValue = F.BaroAltitudeValid;
             }
-        else {
+        else
             AcquiringPressure = true;
-            Stats[BaroFailS]++;
-        }
 
         StartBoschBaroADC(AcquiringPressure);
     }
@@ -565,6 +586,7 @@
     return(true);
 
 BoschInactive:
+
     return(false);
 
 } // IsBoschBaroActive