bmp085 의 data sheet의 있는식을 변환해서 적어본다.
altitude = 44330 * (1.0 - pow(pressure /sealevelPressure,0.1903));
아래는 github에 올라와있는 압력 읽어오는 part.
arduino 코드라 128에 맞게 포팅시키면 될듯.
int32_t Adafruit_BMP085::readPressure(void) { | |
int32_t UT, UP, B3, B5, B6, X1, X2, X3, p; | |
uint32_t B4, B7; | |
UT = readRawTemperature(); | |
UP = readRawPressure(); | |
#if BMP085_DEBUG == 1 | |
// use datasheet numbers! | |
UT = 27898; | |
UP = 23843; | |
ac6 = 23153; | |
ac5 = 32757; | |
mc = -8711; | |
md = 2868; | |
b1 = 6190; | |
b2 = 4; | |
ac3 = -14383; | |
ac2 = -72; | |
ac1 = 408; | |
ac4 = 32741; | |
oversampling = 0; | |
#endif | |
B5 = computeB5(UT); | |
#if BMP085_DEBUG == 1 | |
Serial.print("X1 = "); Serial.println(X1); | |
Serial.print("X2 = "); Serial.println(X2); | |
Serial.print("B5 = "); Serial.println(B5); | |
#endif | |
// do pressure calcs | |
B6 = B5 - 4000; | |
X1 = ((int32_t)b2 * ( (B6 * B6)>>12 )) >> 11; | |
X2 = ((int32_t)ac2 * B6) >> 11; | |
X3 = X1 + X2; | |
B3 = ((((int32_t)ac1*4 + X3) << oversampling) + 2) / 4; | |
#if BMP085_DEBUG == 1 | |
Serial.print("B6 = "); Serial.println(B6); | |
Serial.print("X1 = "); Serial.println(X1); | |
Serial.print("X2 = "); Serial.println(X2); | |
Serial.print("B3 = "); Serial.println(B3); | |
#endif | |
X1 = ((int32_t)ac3 * B6) >> 13; | |
X2 = ((int32_t)b1 * ((B6 * B6) >> 12)) >> 16; | |
X3 = ((X1 + X2) + 2) >> 2; | |
B4 = ((uint32_t)ac4 * (uint32_t)(X3 + 32768)) >> 15; | |
B7 = ((uint32_t)UP - B3) * (uint32_t)( 50000UL >> oversampling ); | |
#if BMP085_DEBUG == 1 | |
Serial.print("X1 = "); Serial.println(X1); | |
Serial.print("X2 = "); Serial.println(X2); | |
Serial.print("B4 = "); Serial.println(B4); | |
Serial.print("B7 = "); Serial.println(B7); | |
#endif | |
if (B7 < 0x80000000) { | |
p = (B7 * 2) / B4; | |
} else { | |
p = (B7 / B4) * 2; | |
} | |
X1 = (p >> 8) * (p >> 8); | |
X1 = (X1 * 3038) >> 16; | |
X2 = (-7357 * p) >> 16; | |
#if BMP085_DEBUG == 1 | |
Serial.print("p = "); Serial.println(p); | |
Serial.print("X1 = "); Serial.println(X1); | |
Serial.print("X2 = "); Serial.println(X2); | |
#endif | |
p = p + ((X1 + X2 + (int32_t)3791)>>4); | |
#if BMP085_DEBUG == 1 | |
Serial.print("p = "); Serial.println(p); | |
#endif | |
return p; | |
} | |
int32_t Adafruit_BMP085::readSealevelPressure(float altitude_meters) { | |
float pressure = readPressure(); | |
return (int32_t)(pressure / pow(1.0-altitude_meters/44330, 5.255)); | |
} | |
float Adafruit_BMP085::readTemperature(void) { | |
int32_t UT, B5; // following ds convention | |
float temp; | |
UT = readRawTemperature(); | |
#if BMP085_DEBUG == 1 | |
// use datasheet numbers! | |
UT = 27898; | |
ac6 = 23153; | |
ac5 = 32757; | |
mc = -8711; | |
md = 2868; | |
#endif | |
B5 = computeB5(UT); | |
temp = (B5+8) >> 4; | |
temp /= 10; | |
return temp; | |
} |
'Side-Project > Drone' 카테고리의 다른 글
쿼드콥터 제어기 주기. (0) | 2014.08.23 |
---|---|
gy-86 도착 (0) | 2014.08.23 |
모터 동작 개념및 코드 (0) | 2014.08.10 |
printf (0) | 2014.08.10 |
atmega128 사용기 (0) | 2014.08.10 |