From: Martin Mares Date: Sat, 26 May 2018 22:38:19 +0000 (+0200) Subject: BMP085 temperature and pressure readings X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=d966fcc249eda75f7eaed87c850e0e96ae4cbb08;p=home-hw.git BMP085 temperature and pressure readings --- diff --git a/Src/test.c b/Src/test.c index ec85b6c..57d9753 100644 --- a/Src/test.c +++ b/Src/test.c @@ -1,9 +1,12 @@ #include "main.h" #include +#include #include typedef unsigned int uint; +typedef uint16_t u16; +typedef int16_t s16; void debug_putc(int c) { @@ -131,12 +134,118 @@ void debug_printf(const char *fmt, ...) va_end(args); } +static uint bmp_read(uint reg, uint bytes) +{ + LL_I2C_ClearFlag_STOP(I2C1); + LL_I2C_ClearFlag_BERR(I2C1); + LL_I2C_HandleTransfer(I2C1, 0xee, LL_I2C_ADDRSLAVE_7BIT, 1, LL_I2C_MODE_SOFTEND, LL_I2C_GENERATE_START_WRITE); + while (!LL_I2C_IsActiveFlag_TXE(I2C1)) + ; + LL_I2C_TransmitData8(I2C1, reg); + while (!LL_I2C_IsActiveFlag_TC(I2C1)) + ; + LL_I2C_HandleTransfer(I2C1, 0xef, LL_I2C_ADDRSLAVE_7BIT, bytes, LL_I2C_MODE_AUTOEND, LL_I2C_GENERATE_RESTART_7BIT_READ); + + uint d = 0; + for (uint i=0; i>= (8-oss); + + int X1 = (UT-AC6)*AC5 / (1<<15); + int X2 = MC*(1<<11) / (X1+MD); + int B5 = X1 + X2; + int T = (B5+8) / (1<<4); + *tt = T; + + int B6 = B5 - 4000; + X1 = (B2*(B6*B6/(1<<12))) / (1<<11); + X2 = AC2 * B6 / (1<<11); + int X3 = X1 + X2; + int B3 = (((AC1*4 + X3) << oss) + 2) / 4; + X1 = AC3 * B6 / (1<<13); + X2 = (B1*(B6*B6/(1<<12))) / (1<<16); + X3 = ((X1+X2) + 2) / (1<<2); + uint B4 = (uint)(AC4 * (X3 + 32768)) / (1U<<15); + uint B7 = (uint)(UP-B3) * (uint)(50000>>oss); + int p; + if (B7 < 0x80000000) + p = (B7*2) / B4; + else + p = B7 / B4 * 2; + X1 = (p/(1<<8)) * (p/(1<<8)); + X1 = (X1*3038) / (1<<16); + X2 = (-7357*p) / (1<<16); + p = p + (X1 + X2 + 3791) / (1<<4); + *pp = p; +} + void run_test(void) { for (;;) { LL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin); - debug_printf("Testing printf: %08X %s\r\n", -42, "mnaeiou"); - LL_mDelay(200); + + debug_puts("Constants:"); + u16 cc[11]; + for (uint i=0; i<11; i++) + { + cc[i] = bmp_read(0xaa + 2*i, 2); + debug_printf(" %04x", cc[i]); + } + debug_puts("\r\n"); + + uint raw_temp = bmp_measure(0x2e, 2); + debug_printf("Raw temperature: %04x\r\n", raw_temp); + + uint oss = 3; // Over-sampling setting + uint raw_press = bmp_measure(0xf4 | (oss<<6), 3); + debug_printf("Raw pressure: %06x\r\n", raw_press); + + int temp, press; + bmp_recalc(raw_temp, raw_press, oss, cc, &temp, &press); + debug_printf("Temperature: %d ddegC\r\n", temp); + debug_printf("Pressure: %d Pa\r\n", press); + + LL_mDelay(1000); } } diff --git a/bmp-conv.c b/bmp-conv.c new file mode 100644 index 0000000..6cadc78 --- /dev/null +++ b/bmp-conv.c @@ -0,0 +1,87 @@ +#include +#include + +typedef unsigned int uint; +typedef uint16_t u16; +typedef int16_t s16; + +uint UT = 0x6ba7; +uint UP = 0xa32c20; +uint oss = 3; + +static uint cc[] = { + 0x1e45, + 0xfaf6, + 0xc787, + 0x86e1, + 0x61f4, + 0x4ab5, + 0x157a, + 0x0047, + 0x8000, + 0xd4bd, + 0x0980, +}; + +int main(void) +{ + s16 AC1 = cc[0]; + s16 AC2 = cc[1]; + s16 AC3 = cc[2]; + u16 AC4 = cc[3]; + u16 AC5 = cc[4]; + u16 AC6 = cc[5]; + s16 B1 = cc[6]; + s16 B2 = cc[7]; + s16 MB = cc[8]; + s16 MC = cc[9]; + s16 MD = cc[10]; + UP >>= (8-oss); + +#if 0 + // Test values from spec + AC1 = 408; + AC2 = -72; + AC3 = -14383; + AC4 = 32741; + AC5 = 32757; + AC6 = 23153; + B1 = 6190; + B2 = 4; + MB = -32768; + MC = -8711; + MD = 2868; + UT = 27898; + UP = 23843; + oss = 0; +#endif + + int X1 = (UT-AC6)*AC5 / (1<<15); + int X2 = MC*(1<<11) / (X1+MD); + int B5 = X1 + X2; + int T = (B5+8) / (1<<4); + printf("T = %.1f degC\n", T/10.); + + int B6 = B5 - 4000; + X1 = (B2*(B6*B6/(1<<12))) / (1<<11); + X2 = AC2 * B6 / (1<<11); + int X3 = X1 + X2; + int B3 = (((AC1*4 + X3) << oss) + 2) / 4; + X1 = AC3 * B6 / (1<<13); + X2 = (B1*(B6*B6/(1<<12))) / (1<<16); + X3 = ((X1+X2) + 2) / (1<<2); + uint B4 = (uint)(AC4 * (X3 + 32768)) / (1U<<15); + uint B7 = (uint)(UP-B3) * (uint)(50000>>oss); + int p; + if (B7 < 0x80000000) + p = (B7*2) / B4; + else + p = B7 / B4 * 2; + X1 = (p/(1<<8)) * (p/(1<<8)); + X1 = (X1*3038) / (1<<16); + X2 = (-7357*p) / (1<<16); + p = p + (X1 + X2 + 3791) / (1<<4); + printf("p = %d Pa\n", p); + + return 0; +}