128 lines
4.0 KiB
C
128 lines
4.0 KiB
C
#include "DS_BMP180.h"
|
|
|
|
void DS_BMP180_Init(DS_BMP180 *DS_BMP180, I2C_HandleTypeDef *hi2c, uint8_t address)
|
|
{
|
|
uint8_t calibration[22];
|
|
|
|
DS_BMP180->address = address;
|
|
DS_BMP180->hi2c = hi2c;
|
|
|
|
for (uint8_t i = 0; i < 21; i++)
|
|
{
|
|
calibration[i] = 0;
|
|
};
|
|
|
|
HAL_I2C_Mem_Read(DS_BMP180->hi2c, DS_BMP180->address, 0xAA, 1, (uint8_t*)(&calibration), 22, 1000);
|
|
|
|
// uint8_t a = 0;
|
|
// uint8_t temp = 0;
|
|
// for (uint8_t i = 0; i < 21; i++)
|
|
// {
|
|
// if (a==0)
|
|
// {
|
|
// temp = calibration[i];
|
|
// a++;
|
|
// }
|
|
// else
|
|
// {
|
|
// calibration[i-1] = calibration[i];
|
|
// calibration[i] = temp;
|
|
// a=0;
|
|
// }
|
|
// };
|
|
|
|
// int16_t *pAC1 = &calibration[0];
|
|
// void *vp;
|
|
// vp = pAC1;
|
|
|
|
// uint16_t AC1;
|
|
// AC1 = (uint16_t)*((uint16_t *)vp);
|
|
|
|
//void AC1 = *pAC1;
|
|
|
|
//uint16_t AC1 = *(uint16_t*)(&calibration[0]);
|
|
|
|
DS_BMP180->Calibration.AC1 = (calibration[0]<<8) + calibration[1];
|
|
DS_BMP180->Calibration.AC2 = (calibration[2]<<8) + calibration[3];
|
|
DS_BMP180->Calibration.AC3 = (calibration[4]<<8) + calibration[5];
|
|
DS_BMP180->Calibration.AC4 = (calibration[6]<<8) + calibration[7];
|
|
DS_BMP180->Calibration.AC5 = (calibration[8]<<8) + calibration[9];
|
|
DS_BMP180->Calibration.AC6 = (calibration[10]<<8) + calibration[11];
|
|
|
|
DS_BMP180->Calibration.B1 = (calibration[12]<<8) + calibration[13];
|
|
DS_BMP180->Calibration.B2 = (calibration[14]<<8) + calibration[15];
|
|
|
|
DS_BMP180->Calibration.MB = (calibration[16]<<8) + calibration[17];
|
|
DS_BMP180->Calibration.MC = (calibration[18]<<8) + calibration[19];
|
|
DS_BMP180->Calibration.MD = (calibration[20]<<8) + calibration[21];
|
|
}
|
|
|
|
void DS_BMP180_StartConversionPressure(DS_BMP180 *DS_BMP180, uint8_t OversamplingRatio)
|
|
{
|
|
uint8_t pData[1];
|
|
pData[0] = 0x34 + (OversamplingRatio << 6);
|
|
DS_BMP180->Calibration.OSS = OversamplingRatio;
|
|
HAL_I2C_Mem_Write(DS_BMP180->hi2c, DS_BMP180->address, 0xF4, 1, (uint8_t*)&pData, 1, 1000);
|
|
}
|
|
|
|
void DS_BMP180_StartConversionTemperature(DS_BMP180 *DS_BMP180)
|
|
{
|
|
uint8_t pData[1];
|
|
pData[0] = 0x2E;
|
|
HAL_I2C_Mem_Write(DS_BMP180->hi2c, DS_BMP180->address, 0xF4, 1, (uint8_t*)&pData, 1, 1000);
|
|
}
|
|
|
|
long DS_BMP180_GetTemperature(DS_BMP180 *DS_BMP180)
|
|
{
|
|
uint16_t pow15 = 32768;
|
|
uint16_t pow11 = 2048;
|
|
uint8_t pow4 = 16;
|
|
|
|
uint8_t pData[2];
|
|
HAL_I2C_Mem_Read(DS_BMP180->hi2c, DS_BMP180->address, 0xF6, 1, (uint8_t*)(&pData), 2, 1000);
|
|
|
|
long UT = (pData[0]<<8) + pData[1];
|
|
|
|
long X1 = (UT - DS_BMP180->Calibration.AC6) * DS_BMP180->Calibration.AC5 / pow15;
|
|
long X2 = DS_BMP180->Calibration.MC * pow11 / (X1+DS_BMP180->Calibration.MD);
|
|
DS_BMP180->Calibration.B5 = X1 + X2;
|
|
long T = (DS_BMP180->Calibration.B5+8) / pow4;
|
|
return T;
|
|
}
|
|
|
|
long DS_BMP180_GetPressure(DS_BMP180 *DS_BMP180)
|
|
{
|
|
uint32_t pow16 = 65536;
|
|
uint16_t pow15 = 32768;
|
|
uint16_t pow13 = 8192;
|
|
uint16_t pow12 = 4096;
|
|
uint16_t pow11 = 2048;
|
|
uint16_t pow8 = 256;
|
|
uint8_t pow4 = 16;
|
|
|
|
uint8_t pData[3];
|
|
HAL_I2C_Mem_Read(DS_BMP180->hi2c, DS_BMP180->address, 0xF6, 1, (uint8_t*)(&pData), 8, 1000);
|
|
|
|
long UP = ((pData[0]<<16) + (pData[1]<<8) + pData[0]) >> (8-DS_BMP180->Calibration.OSS);
|
|
|
|
long B6 = DS_BMP180->Calibration.B5 - 4000;
|
|
long X1 = (DS_BMP180->Calibration.B2 * (B6 * B6 / pow12))/pow11;
|
|
long X2 = DS_BMP180->Calibration.AC2 * B6 / pow11;
|
|
long X3 = X1 + X2;
|
|
long B3 = (((DS_BMP180->Calibration.AC1*4+X3)<<DS_BMP180->Calibration.OSS)+2)/4;
|
|
X1 = DS_BMP180->Calibration.AC3 * B6 /pow13;
|
|
X2 = (DS_BMP180->Calibration.B1*(B6*B6/pow12))/pow16;
|
|
X3 = ((X1 + X2)+2)/4;
|
|
unsigned long B4 = DS_BMP180->Calibration.AC4 * (unsigned long)(X3+pow15)/pow15;
|
|
unsigned long B7 = ((unsigned long)UP - B3)*(50000>>DS_BMP180->Calibration.OSS);
|
|
long p;
|
|
if (B7 < 0x80000000) {p = (B7 * 2)/B4;}
|
|
else {p = (B7 / B4) * 2;}
|
|
X1 = (p/pow8)*(p/pow8);
|
|
X1 = (X1 * 3038)/pow16;
|
|
X2 = (-7357*p)/pow16;
|
|
p = p + (X1 + X2 + 3791) / pow4;
|
|
|
|
return p;
|
|
}
|