Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
baro.c
00001 // =============================================================================================== 00002 // = UAVXArm Quadrocopter Controller = 00003 // = Copyright (c) 2008 by Prof. Greg Egan = 00004 // = Original V3.15 Copyright (c) 2007 Ing. Wolfgang Mahringer = 00005 // = http://code.google.com/p/uavp-mods/ = 00006 // =============================================================================================== 00007 00008 // This is part of UAVXArm. 00009 00010 // UAVXArm is free software: you can redistribute it and/or modify it under the terms of the GNU 00011 // General Public License as published by the Free Software Foundation, either version 3 of the 00012 // License, or (at your option) any later version. 00013 00014 // UAVXArm is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without 00015 // even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 00016 // See the GNU General Public License for more details. 00017 00018 // You should have received a copy of the GNU General Public License along with this program. 00019 // If not, see http://www.gnu.org/licenses/ 00020 00021 #include "UAVXArm.h" 00022 00023 // Barometers Freescale TI ADC and Bosch BMP085 3.8MHz, Bosch SMD500 400KHz 00024 00025 #define BARO_MIN_CLIMB 150.0 // M minimum available barometer climb from origin 00026 #define BARO_MIN_DESCENT -50.0 //M minimum available barometer descent from origin 00027 00028 void GetBaroAltitude(void); 00029 void InitBarometer(void); 00030 00031 void ShowBaroType(void); 00032 void BaroTest(void); 00033 00034 #define BaroROCFilter HardFilter 00035 00036 uint16 BaroPressure, BaroTemperature; 00037 boolean AcquiringPressure; 00038 int16 BaroOffsetDAC; 00039 00040 #define BARO_BUFF_SIZE 4 00041 00042 struct { 00043 uint8 Head, Tail; 00044 int24 B[BARO_BUFF_SIZE]; 00045 } BaroQ; 00046 00047 int32 OriginBaroPressure, CompBaroPressure; 00048 real32 BaroRelAltitude, BaroRelAltitudeP; 00049 i16u BaroVal; 00050 int8 BaroType; 00051 int16 BaroClimbAvailable, BaroDescentAvailable; 00052 int16 AltitudeUpdateRate; 00053 int8 BaroRetries; 00054 00055 real32 FakeBaroRelAltitude; 00056 int8 SimulateCycles = 0; 00057 00058 void ShowBaroType(void) { 00059 switch ( BaroType ) { 00060 case BaroMPX4115: 00061 TxString("MPX4115\r\n"); 00062 break; 00063 case BaroSMD500: 00064 TxString("SMD500\r\n"); 00065 break; 00066 case BaroBMP085: 00067 TxString("BMP085\r\n"); 00068 break; 00069 case BaroUnknown: 00070 TxString("None\r\n"); 00071 break; 00072 default: 00073 break; 00074 } 00075 } // ShowBaro 00076 00077 void BaroTest(void) { 00078 00079 TxString("\r\nAltitude test\r\n"); 00080 TxString("Initialising\r\n"); 00081 00082 InitBarometer(); 00083 00084 while ( F.BaroAltitudeValid && ! F.NewBaroValue ) 00085 GetBaroAltitude(); 00086 00087 TxString("\r\nType:\t"); 00088 ShowBaroType(); 00089 00090 TxString("BaroScale:\t"); 00091 TxVal32(P[BaroScale],0,0); 00092 TxString("\r\nInit Retries:\t"); 00093 TxVal32((int32)BaroRetries - 2, 0, ' '); // always minimum of 2 00094 if ( BaroRetries >= BARO_INIT_RETRIES ) 00095 TxString(" FAILED Init.\r\n"); 00096 else 00097 TxNextLine(); 00098 00099 if ( BaroType == BaroMPX4115 ) { 00100 TxString("\r\nAddress :\t0x"); 00101 TxValH(MCP4725_ID_Actual); 00102 TxString("\r\nRange :\t"); 00103 TxVal32((int32) BaroDescentAvailable * 10.0, 1, ' '); 00104 TxString("-> "); 00105 TxVal32((int32) BaroClimbAvailable * 10.0, 1, 'M'); 00106 TxString(" {Offset "); 00107 TxVal32((int32)BaroOffsetDAC, 0,'}'); 00108 if (( BaroClimbAvailable < BARO_MIN_CLIMB ) || (BaroDescentAvailable > BARO_MIN_DESCENT)) 00109 TxString(" Bad climb or descent range - offset adjustment?"); 00110 TxNextLine(); 00111 } 00112 00113 if ( F.BaroAltitudeValid ) { 00114 00115 while ( !F.NewBaroValue ) 00116 GetBaroAltitude(); 00117 00118 F.NewBaroValue = false; 00119 00120 TxString("Alt.: \t"); 00121 TxVal32(BaroRelAltitude * 10.0, 1, ' '); 00122 TxString("M\r\n"); 00123 00124 } else 00125 TxString("Barometer FAILED\r\n"); 00126 00127 TxString("\r\nR.Finder: \t"); 00128 if ( F.RangefinderAltitudeValid ) { 00129 GetRangefinderAltitude(); 00130 TxVal32(RangefinderAltitude * 100.0, 2, ' '); 00131 TxString("M\r\n"); 00132 } else 00133 TxString("no rangefinder\r\n"); 00134 00135 TxString("\r\nUAVXArm Shield:\t"); 00136 TxVal32((int32)AmbientTemperature.i16, 1, ' '); 00137 TxString("C\r\n"); 00138 00139 } // BaroTest 00140 00141 void GetBaroAltitude(void) { 00142 static real32 Temp, AltChange; 00143 00144 if ( BaroType == BaroMPX4115 ) 00145 GetFreescaleBaroAltitude(); 00146 else 00147 GetBoschBaroAltitude(); 00148 00149 if ( F.NewBaroValue ) { 00150 #ifdef SIMULATE 00151 if ( State == InFlight ) { 00152 if ( ++SimulateCycles >= AltitudeUpdateRate ) { 00153 FakeBaroRelAltitude += ( DesiredThrottle - CruiseThrottle ) + Comp[Alt]; 00154 if ( FakeBaroRelAltitude < -5.0 ) 00155 FakeBaroRelAltitude = 0.0; 00156 00157 SimulateCycles = 0; 00158 00159 ROC = FakeBaroRelAltitude - BaroRelAltitudeP; 00160 BaroRelAltitudeP = FakeBaroRelAltitude; 00161 } 00162 BaroRelAltitude = FakeBaroRelAltitude; 00163 } 00164 #else 00165 00166 AltChange = BaroRelAltitude - BaroRelAltitudeP; 00167 Temp = AltChange * AltitudeUpdateRate; 00168 00169 if ( fabs( Temp ) > BARO_SANITY_CHECK_MPS ) { 00170 BaroRelAltitude = BaroRelAltitudeP; // use previous value 00171 Temp = 0; 00172 Stats[BaroFailS]++; 00173 } 00174 00175 Temp = Limit1(Temp, BARO_SANITY_CHECK_MPS); 00176 ROC = ROC * 0.9 + Temp * 0.1; 00177 BaroRelAltitudeP = BaroRelAltitude; 00178 00179 #endif // SIMULATE 00180 00181 if ( State == InFlight ) { 00182 if ( ROC > Stats[MaxROCS] ) 00183 Stats[MaxROCS] = ROC; 00184 else 00185 if ( ROC < Stats[MinROCS] ) 00186 Stats[MinROCS] = ROC; 00187 00188 if ( BaroRelAltitude > Stats[BaroRelAltitudeS] ) 00189 Stats[BaroRelAltitudeS] = BaroRelAltitude; 00190 } 00191 } 00192 00193 } // GetBaroAltitude 00194 00195 void InitBarometer(void) { 00196 BaroRelAltitude = BaroRelAltitudeP = CompBaroPressure = OriginBaroPressure = 0; 00197 BaroType = BaroUnknown; 00198 00199 AltComp = AltDiffSum = AltDSum = 0; 00200 F.BaroAltitudeValid= true; // optimistic 00201 00202 if ( IsFreescaleBaroActive() ) 00203 InitFreescaleBarometer(); 00204 else 00205 if ( IsBoschBaroActive() ) 00206 InitBoschBarometer(); 00207 else 00208 F.BaroAltitudeValid = F.HoldingAlt = false; 00209 00210 } // InitBarometer 00211 00212 // ----------------------------------------------------------- 00213 00214 // Freescale ex Motorola MPX4115 Barometer with ADS7823 12bit ADC 00215 00216 void SetFreescaleMCP4725(int16); 00217 boolean IdentifyMCP4725(void); 00218 void SetFreescaleOffset(void); 00219 void ReadFreescaleBaro(void); 00220 real32 FreescaleToDM(int24); 00221 void GetFreescaleBaroAltitude(void); 00222 boolean IsFreescaleBaroActive(void); 00223 void InitFreescaleBarometer(void); 00224 00225 uint8 MCP4725_ID_Actual; 00226 00227 void SetFreescaleMCP4725(int16 d) { 00228 static i16u dd; 00229 00230 dd.u16 = d << 4; // left align 00231 00232 I2CBARO.start(); 00233 if ( I2CBARO.write(MCP4725_ID_Actual) != I2C_ACK ) goto MCP4725Error; 00234 if ( I2CBARO.write(MCP4725_CMD) != I2C_ACK ) goto MCP4725Error; 00235 if ( I2CBARO.write(dd.b1) != I2C_ACK ) goto MCP4725Error; 00236 if ( I2CBARO.write(dd.b0) != I2C_ACK ) goto MCP4725Error; 00237 I2CBARO.stop(); 00238 00239 return; 00240 00241 MCP4725Error: 00242 I2CBARO.stop(); 00243 I2CError[MCP4725_ID_Actual]++; 00244 00245 } // SetFreescaleMCP4725 00246 00247 boolean IdentifyMCP4725(void) { 00248 00249 static boolean r; 00250 00251 r = true; 00252 MCP4725_ID_Actual = MCP4725_ID_0xCC; 00253 if ( I2CBAROAddressResponds( MCP4725_ID_0xCC ) ) 00254 MCP4725_ID_Actual = MCP4725_ID_0xCC; 00255 else 00256 if ( I2CBAROAddressResponds( MCP4725_ID_0xC8 ) ) 00257 MCP4725_ID_Actual = MCP4725_ID_0xC8; 00258 else 00259 r = false; 00260 00261 return(r); 00262 00263 // MCP4725_ID_Actual = FORCE_BARO_ID; 00264 // return(true); 00265 00266 } // IdentifyMCP4725 00267 00268 void SetFreescaleOffset(void) { 00269 // Steve Westerfeld 00270 // 470 Ohm, 1uF RC 0.47mS use 2mS for settling? 00271 00272 TxString("\r\nOffset \tPressure\r\n"); 00273 00274 BaroOffsetDAC = MCP4725_MAX; 00275 00276 SetFreescaleMCP4725(BaroOffsetDAC); 00277 00278 Delay1mS(20); // initial settling 00279 ReadFreescaleBaro(); 00280 00281 while ( (BaroVal.u16 < (uint16)(((uint24)ADS7823_MAX*4L*7L)/10L) ) 00282 && (BaroOffsetDAC > 20) ) { // first loop gets close 00283 BaroOffsetDAC -= 20; // approach at 20 steps out of 4095 00284 SetFreescaleMCP4725(BaroOffsetDAC); 00285 Delay1mS(20); 00286 ReadFreescaleBaro(); 00287 TxVal32(BaroOffsetDAC,0,HT); 00288 TxVal32(BaroVal.u16,0,' '); 00289 TxNextLine(); 00290 LEDYellow_TOG; 00291 } 00292 00293 BaroOffsetDAC += 20; // move back up to come at it a little slower 00294 SetFreescaleMCP4725(BaroOffsetDAC); 00295 Delay1mS(100); 00296 ReadFreescaleBaro(); 00297 00298 while ( (BaroVal.u16 < (uint16)(((uint24)ADS7823_MAX*4L*3L)/4L) ) && (BaroOffsetDAC > 1) ) { 00299 BaroOffsetDAC -= 1; 00300 SetFreescaleMCP4725(BaroOffsetDAC); 00301 Delay1mS(10); // 10 00302 ReadFreescaleBaro(); 00303 TxVal32(BaroOffsetDAC,0,HT); 00304 TxVal32(BaroVal.u16,0,HT); 00305 TxVal32((int32)FreescaleToDM(BaroVal.u16), 1, 0); 00306 TxNextLine(); 00307 LEDYellow_TOG; 00308 } 00309 00310 Delay1mS(200); // wait for caps to settle 00311 F.BaroAltitudeValid = BaroOffsetDAC > 0; 00312 00313 } // SetFreescaleOffset 00314 00315 void ReadFreescaleBaro(void) { 00316 static char B[8]; 00317 static i16u B0, B1, B2, B3; 00318 00319 mS[BaroUpdate] = mSClock() + ADS7823_TIME_MS; 00320 00321 I2CBARO.start(); // start conversion 00322 if ( I2CBARO.write(ADS7823_WR) != I2C_ACK ) goto ADS7823Error; 00323 if ( I2CBARO.write(ADS7823_CMD) != I2C_ACK ) goto ADS7823Error; 00324 I2CBARO.stop(); 00325 00326 if ( I2CBARO.blockread(ADS7823_RD, B, 8) ) goto ADS7823Error; 00327 00328 // read block of 4 baro samples 00329 00330 B0.b0 = B[1]; 00331 B0.b1 = B[0]; 00332 B1.b0 = B[3]; 00333 B1.b1 = B[2]; 00334 B2.b0 = B[5]; 00335 B2.b1 = B[4]; 00336 B3.b0 = B[7]; 00337 B3.b1 = B[6]; 00338 00339 BaroVal.u16 = (uint16)16380 - ( B0.u16 + B1.u16 + B2.u16 + B3.u16 ); 00340 00341 F.BaroAltitudeValid = true; 00342 00343 return; 00344 00345 ADS7823Error: 00346 I2CBARO.stop(); 00347 00348 I2CError[ADS7823_ID]++; 00349 00350 // F.BaroAltitudeValid = F.HoldingAlt = false; 00351 if ( State == InFlight ) { 00352 Stats[BaroFailS]++; 00353 F.BaroFailure = true; 00354 } 00355 00356 } // ReadFreescaleBaro 00357 00358 real32 FreescaleToDM(int24 p) { // decreasing pressure is increase in altitude negate and rescale to metre altitude 00359 return( -( (real32)p * 0.8 ) / (real32)P[BaroScale] ); 00360 } // FreescaleToDM 00361 00362 void GetFreescaleBaroAltitude(void) { 00363 static int24 BaroPressure; 00364 00365 if ( mSClock() >= mS[BaroUpdate] ) { 00366 ReadFreescaleBaro(); 00367 if ( F.BaroAltitudeValid ) { 00368 BaroPressure = (int24)BaroVal.u16; // sum of 4 samples 00369 BaroRelAltitude = FreescaleToDM(BaroPressure - OriginBaroPressure); 00370 F.NewBaroValue = F.BaroAltitudeValid; 00371 } 00372 } 00373 00374 } // GetFreescaleBaroAltitude 00375 00376 boolean IsFreescaleBaroActive(void) { // check for Freescale Barometer 00377 00378 static boolean r; 00379 00380 r = I2CBAROAddressResponds( ADS7823_ID ); 00381 if ( r ) { 00382 BaroType = BaroMPX4115; 00383 r = IdentifyMCP4725(); 00384 TrackMinI2CRate(400000); 00385 } 00386 return (r); 00387 00388 } // IsFreescaleBaroActive 00389 00390 void InitFreescaleBarometer(void) { 00391 static int16 BaroOriginAltitude, MinAltitude; 00392 static int24 BaroPressureP; 00393 00394 AltitudeUpdateRate = 1000L/ADS7823_TIME_MS; 00395 00396 BaroTemperature = 0; 00397 if ( P[BaroScale] <= 0 ) 00398 P[BaroScale] = 56; // failsafe setting 00399 00400 BaroPressure = 0; 00401 BaroRetries = 0; 00402 do { 00403 BaroPressureP = BaroPressure; 00404 00405 SetFreescaleOffset(); 00406 00407 while ( mSClock() < mS[BaroUpdate] ) {}; 00408 ReadFreescaleBaro(); 00409 BaroPressure = (int24)BaroVal.u16; 00410 } while ( ( ++BaroRetries < BARO_INIT_RETRIES ) 00411 && ( fabs( FreescaleToDM(BaroPressure - BaroPressureP) ) > 5 ) ); 00412 00413 F.BaroAltitudeValid = BaroRetries < BARO_INIT_RETRIES; 00414 00415 OriginBaroPressure = BaroPressure; 00416 00417 BaroRelAltitudeP = BaroRelAltitude = 0.0; 00418 00419 MinAltitude = FreescaleToDM((int24)ADS7823_MAX*4); 00420 BaroOriginAltitude = FreescaleToDM(OriginBaroPressure); 00421 BaroDescentAvailable = MinAltitude - BaroOriginAltitude; 00422 BaroClimbAvailable = -BaroOriginAltitude; 00423 00424 //F.BaroAltitudeValid &= (( BaroClimbAvailable >= BARO_MIN_CLIMB ) 00425 // && (BaroDescentAvailable <= BARO_MIN_DESCENT)); 00426 00427 #ifdef SIMULATE 00428 FakeBaroRelAltitude = 0; 00429 #endif // SIMULATE 00430 00431 } // InitFreescaleBarometer 00432 00433 // ----------------------------------------------------------- 00434 00435 // Bosch SMD500 and BMP085 Barometers 00436 00437 void StartBoschBaroADC(boolean); 00438 int24 CompensatedBoschPressure(uint16, uint16); 00439 00440 void GetBoschBaroAltitude(void); 00441 boolean IsBoschBaroActive(void); 00442 void InitBoschBarometer(void); 00443 00444 // SMD500 9.5mS (T) 34mS (P) 00445 // BMP085 4.5mS (T) 25.5mS (P) OSRS=3 00446 #define BOSCH_TEMP_TIME_MS 11 // 10 increase to make P+T acq time ~50mS 00447 //#define BMP085_PRESS_TIME_MS 26 00448 //#define SMD500_PRESS_TIME_MS 34 00449 #define BOSCH_PRESS_TIME_MS 38 00450 #define BOSCH_PRESS_TEMP_TIME_MS 50 // pressure and temp time + overheads 00451 00452 void StartBoschBaroADC(boolean ReadPressure) { 00453 static uint8 TempOrPress; 00454 00455 if ( ReadPressure ) { 00456 TempOrPress = BOSCH_PRESS; 00457 mS[BaroUpdate] = mSClock() + BOSCH_PRESS_TIME_MS; 00458 } else { 00459 mS[BaroUpdate] = mSClock() + BOSCH_TEMP_TIME_MS; 00460 if ( BaroType == BaroBMP085 ) 00461 TempOrPress = BOSCH_TEMP_BMP085; 00462 else 00463 TempOrPress = BOSCH_TEMP_SMD500; 00464 } 00465 00466 I2CBARO.start(); 00467 if ( I2CBARO.write(BOSCH_ID) != I2C_ACK ) goto BoschError; 00468 // access control register, start measurement 00469 if ( I2CBARO.write(BOSCH_CTL) != I2C_ACK ) goto BoschError; 00470 // select 32kHz input, measure temperature 00471 if ( I2CBARO.write(TempOrPress) != I2C_ACK ) goto BoschError; 00472 I2CBARO.stop(); 00473 00474 F.BaroAltitudeValid = true; 00475 return; 00476 00477 BoschError: 00478 I2CBARO.stop(); 00479 00480 I2CError[BOSCH_ID]++; 00481 F.BaroAltitudeValid = false; 00482 00483 } // StartBoschBaroADC 00484 00485 void ReadBoschBaro(void) { 00486 00487 // Possible I2C protocol error - split read of ADC 00488 I2CBARO.start(); 00489 if ( I2CBARO.write(BOSCH_WR) != I2C_ACK ) goto BoschError; 00490 if ( I2CBARO.write(BOSCH_ADC_MSB) != I2C_ACK ) goto BoschError; 00491 I2CBARO.start(); // restart 00492 if ( I2CBARO.write(BOSCH_RD) != I2C_ACK ) goto BoschError; 00493 BaroVal.b1 = I2CBARO.read(I2C_NACK); 00494 I2CBARO.stop(); 00495 00496 I2CBARO.start(); 00497 if ( I2CBARO.write(BOSCH_WR) != I2C_ACK ) goto BoschError; 00498 if ( I2CBARO.write(BOSCH_ADC_LSB) != I2C_ACK ) goto BoschError; 00499 I2CBARO.start(); // restart 00500 if ( I2CBARO.write(BOSCH_RD) != I2C_ACK ) goto BoschError; 00501 BaroVal.b0 = I2CBARO.read(I2C_NACK); 00502 I2CBARO.stop(); 00503 00504 F.BaroAltitudeValid = true; 00505 return; 00506 00507 BoschError: 00508 I2CBARO.stop(); 00509 00510 I2CError[BOSCH_ID]++; 00511 00512 F.BaroAltitudeValid = F.HoldingAlt = false; 00513 if ( State == InFlight ) { 00514 Stats[BaroFailS]++; 00515 F.BaroFailure = true; 00516 } 00517 00518 } // ReadBoschBaro 00519 00520 #define BOSCH_BMP085_TEMP_COEFF 62L 00521 #define BOSCH_SMD500_TEMP_COEFF 50L 00522 00523 int24 CompensatedBoschPressure(uint16 BaroPress, uint16 BaroTemp) { 00524 static int24 BaroTempComp; 00525 00526 if ( BaroType == BaroBMP085 ) 00527 BaroTempComp = (BaroTemp * BOSCH_BMP085_TEMP_COEFF + 64L) >> 7; 00528 else 00529 BaroTempComp = (BaroTemp * BOSCH_SMD500_TEMP_COEFF + 8L) >> 4; 00530 00531 return ((int24)BaroPress + BaroTempComp - OriginBaroPressure); 00532 00533 } // CompensatedBoschPressure 00534 00535 void GetBoschBaroAltitude(void) { 00536 static int24 Temp; 00537 00538 if ( mSClock() >= mS[BaroUpdate] ) { 00539 ReadBoschBaro(); 00540 if ( F.BaroAltitudeValid ) 00541 if ( AcquiringPressure ) { 00542 BaroPressure = (int24)BaroVal.u16; 00543 AcquiringPressure = false; 00544 } else { 00545 BaroTemperature = (int24)BaroVal.u16; 00546 AcquiringPressure = true; 00547 00548 Temp = CompensatedBoschPressure(BaroPressure, BaroTemperature); 00549 CompBaroPressure -= BaroQ.B[BaroQ.Head]; 00550 BaroQ.B[BaroQ.Head] = Temp; 00551 CompBaroPressure += Temp; 00552 BaroQ.Head = (BaroQ.Head + 1) & (BARO_BUFF_SIZE -1); 00553 00554 // Pressure queue has 4 entries corresponding to an average delay at 20Hz of 0.1Sec 00555 // decreasing pressure is increase in altitude negate and rescale to decimetre altitude 00556 00557 BaroRelAltitude = - ( (real32)CompBaroPressure * (real32)P[BaroScale] ) / 1280.0; 00558 00559 F.NewBaroValue = F.BaroAltitudeValid; 00560 } 00561 else 00562 AcquiringPressure = true; 00563 00564 StartBoschBaroADC(AcquiringPressure); 00565 } 00566 } // GetBoschBaroAltitude 00567 00568 boolean IsBoschBaroActive(void) { // check for Bosch Barometers 00569 static uint8 r; 00570 00571 I2CBARO.start(); 00572 if ( I2CBARO.write(BOSCH_WR) != I2C_ACK ) goto BoschInactive; 00573 if ( I2CBARO.write(BOSCH_TYPE) != I2C_ACK ) goto BoschInactive; 00574 I2CBARO.start(); // restart 00575 if ( I2CBARO.write(BOSCH_RD) != I2C_ACK ) goto BoschInactive; 00576 r = I2CBARO.read(I2C_NACK); 00577 I2CBARO.stop(); 00578 00579 if (r == BOSCH_ID_BMP085 ) 00580 BaroType = BaroBMP085; 00581 else 00582 BaroType = BaroSMD500; 00583 00584 TrackMinI2CRate(400000); 00585 00586 return(true); 00587 00588 BoschInactive: 00589 00590 return(false); 00591 00592 } // IsBoschBaroActive 00593 00594 void InitBoschBarometer(void) { 00595 int8 s; 00596 int24 Temp, CompBaroPressureP; 00597 00598 AltitudeUpdateRate = 1000L / BOSCH_PRESS_TEMP_TIME_MS; 00599 00600 F.NewBaroValue = false; 00601 CompBaroPressure = 0; 00602 00603 TxString("Temp. \tPressure\r\n"); 00604 00605 BaroRetries = 0; 00606 do { // occasional I2C misread of Temperature so keep doing it until the Origin is stable!! 00607 CompBaroPressureP = CompBaroPressure; 00608 CompBaroPressure = BaroQ.Head = 0; 00609 00610 AcquiringPressure = true; 00611 StartBoschBaroADC(AcquiringPressure); // Pressure 00612 00613 for ( s = 0; s < 4; s++ ) { 00614 while ( mSClock() < mS[BaroUpdate] ); 00615 ReadBoschBaro(); // Pressure 00616 BaroPressure = BaroVal.u16; 00617 00618 AcquiringPressure = !AcquiringPressure; 00619 StartBoschBaroADC(AcquiringPressure); // Temperature 00620 while ( mSClock() < mS[BaroUpdate] ); 00621 ReadBoschBaro(); 00622 BaroTemperature = BaroVal.u16; 00623 00624 TxVal32(BaroTemperature,0,HT); 00625 TxVal32(BaroPressure,0,0); 00626 TxNextLine(); 00627 00628 Temp = CompensatedBoschPressure(BaroPressure, BaroTemperature); 00629 BaroQ.B[s] = Temp; 00630 CompBaroPressure += Temp; 00631 00632 AcquiringPressure = !AcquiringPressure; 00633 StartBoschBaroADC(AcquiringPressure); 00634 } 00635 00636 } while ( ( ++BaroRetries < BARO_INIT_RETRIES ) && ( abs(CompBaroPressure - CompBaroPressureP) > 12 ) ); // stable within ~0.5M 00637 00638 OriginBaroPressure = SRS32(CompBaroPressure, 2); 00639 00640 F.BaroAltitudeValid = BaroRetries < BARO_INIT_RETRIES; 00641 BaroRelAltitudeP = BaroRelAltitude = 0.0; 00642 00643 #ifdef SIMULATE 00644 FakeBaroRelAltitude = 0.0; 00645 #endif // SIMULATE 00646 00647 } // InitBoschBarometer
Generated on Wed Jul 13 2022 01:50:20 by
1.7.2