1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
#include "alti.h"
static long pressure0;
long altitude = 0;
long pressure = 0;
static long_BMP085_reg g_long_registres;
static PressureVar variables;
// Cette fonction n'est pas exécutée
long readUncompensatedTemperature()
{
uint8_t txbuf[2] = {0};
uint8_t rawTemperature[2] = {0};
txbuf[0] = 0xF4; //Register address //Calibration data ac1
txbuf[1] = 0x2E; //Temperature
i2cAcquireBus(&I2CD1);
i2cMasterTransmitTimeout(&I2CD1, 0x77, txbuf, 2, NULL, 0, 1000);
i2cReleaseBus(&I2CD1);
chThdSleepMilliseconds(5);
txbuf[0] = 0xF6;
i2cAcquireBus(&I2CD1);
i2cMasterTransmitTimeout(&I2CD1, 0x77, txbuf, 1, rawTemperature, 2, 100);
i2cReleaseBus(&I2CD1);
return (((uint16_t)rawTemperature[0]<<8)|((uint16_t)rawTemperature[1]));
}
// Cette fonction n'est pas exécutée
long readUncompensatedPressure()
{
uint8_t txbuf[2] = {0};
uint8_t rawPressure[3] = {0};
txbuf[0] = 0xF4; //Registrer address //Calibration data ac1
txbuf[1] = 0x34+(OSS<<6); //Temperature
i2cAcquireBus(&I2CD1);
i2cMasterTransmitTimeout(&I2CD1, 0x77, txbuf, 2, NULL, 0, 100);
i2cReleaseBus(&I2CD1);
chThdSleepMilliseconds(26);
txbuf[0] = 0xF6;
i2cAcquireBus(&I2CD1);
i2cMasterTransmitTimeout(&I2CD1, 0x77, txbuf, 1, rawPressure, 3, 100);
i2cReleaseBus(&I2CD1);
return (((long)rawPressure[0]<<16)|((long)rawPressure[1]<<8)|(long)rawPressure[2])>>(8-OSS);
}
long calculateTemperature(/*PressureVar *variables,*/)
{
static int uncompensatedTemperature = 0;
uncompensatedTemperature = readUncompensatedTemperature(); // cet appel n'est pas réalisé!
variables.X1 = (uncompensatedTemperature-g_long_registres.ac6)*g_long_registres.ac5>>15;
variables.X2 = (g_long_registres.mc<<11)/(variables.X1+g_long_registres.md);
variables.B5 = variables.X1+variables.X2;
return (variables.B5+8)>>4;
}
long calculatePressure(/*, PressureVar *variables*/)
{
static long uncompensatedPressure = 0;
//int temperature = 0;
static long pressure = 0;
uncompensatedPressure = readUncompensatedPressure(); // cet appel n'est pas réalisé!
calculateTemperature(/*variables,*/);
variables.B6 = variables.B5-4000;
...
variables.B7 = ((unsigned long)uncompensatedPressure-variables.B3)*(50000>>OSS);
if(variables.B7 < 0x80000000)
{
pressure = (variables.B7*2)/variables.B4;
}
else
{
pressure = (variables.B7/variables.B4)*2;
}
variables.X1 = (pressure/pow(2,8))*(pressure/pow(2,8));
...
return pressure;
}
void initAlti()
{
uint8_t txbuf[10] = {0};
BMP085_reg registres;
//PressureVar variablesPression;
//récupération de ac1
txbuf[0] = 0xAA; //Calibration data ac1
i2cAcquireBus(&I2CD1);
i2cMasterTransmitTimeout(&I2CD1, 0x77, txbuf, 1, (uint8_t*)registres.ac1, 2, 1000);
i2cReleaseBus(&I2CD1);
g_long_registres.ac1 = (short)((registres.ac1[0]<<8)+registres.ac1[1]);
...
pressure0 = calculatePressure(/*g_long_registres, &variablesPression*/);
}
long getAltitude()
{
pressure = calculatePressure(/*g_long_registres, &variablesPression*/);
altitude = 44330.75*(1-pow((double)pressure/pressure0, 0.19029))*100;
return altitude;
} |
Partager