麒麟座MINI开发板--BMP085数字压力传感器
物联网
4678 人阅读
|
1 人回复
|
2017-10-24
TA的每日心情 | 开心 2017-12-5 20:32 |
|---|
签到天数: 10 天 连续签到: 2 天 [LV.3]偶尔看看II
童生
- 积分
- 124
|
最近几天一直在看FreeRTOS的东西,今天抽了点时间把手头的数字压力传感器模块GY-65连接到麒麟座MINI开发板上测试了下,主要实现了温度,气压,海拔高度的OLED显示和串口打印显示。
1.GY-65气压模块简介
GY-65气压模块是一块数字气压检测模块,它内部采用了BOSCH博世生产的BMP085数字压力传感器。
该模块的主要特性如下:
- 压力范围:300 - 1100hPa(海拔9000米至-500米)
- 电源电压:1.8V - 3.6V(VDDA)
- 1.62V - 3.6V(VDDD)
- 低功耗: 5μA 在标准模式
- 高精度: 低功耗模式下,分辨率为0.06hPa(0.5米)
- 高线性模式下,分辨率为0.03hPa(0.25米)
- 含温度输出
- I2C接口
- 温度补偿
2. GY-65气压模块实物图及内部电路图
3.GY-65模块与麒麟座MINI开发板连接及实际显示
由于模块是I2C接口,所以直接和开发板上的I2C接口相连
SCL-->PB10
SDA-->PB11
GY-65模块输出的压力值为96Kpa(27层楼),而当地的实时气压为102Kpa(墨迹天气提供),测量传感器所处海拔高度的有一定的影响。另外实测高度440m,而根据所在地位置查询出的海拔高度410米,楼层高度约80米,误差还是挺大的。
4.GY-65模块数据手册及代码
BMP085的STM32驱动代码来源于网络,在这里我贴出来,有兴趣的可以看下。- #include "math.h"
- short ac1;
- short ac2;
- short ac3;
- unsigned short ac4;
- unsigned short ac5;
- unsigned short ac6;
- short b1;
- short b2;
- short mb;
- short mc;
- short md;
- void delay5ms(void)
- {
-
- int i=5000;
- while(i)
- {
- i--;
- }
- }
- //***************************************************
- void Single_Write_BMP085(unsigned char REG_Address,unsigned char REG_data)
- {
- i2c_Start(); //起始信号
- i2c_SendByte(BMP085_ADDRESS); //发送设备地址+写信号
- i2c_WaitAck();
- i2c_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf
- i2c_WaitAck();
- i2c_SendByte(REG_data); //内部寄存器数据,请参考中文pdf
- i2c_WaitAck();
- i2c_Stop(); //发送停止信号
- }
- //********单字节读取内部寄存器*************************
- unsigned char Single_Read_BMP085(unsigned char REG_Address)
- { unsigned char REG_data;
- i2c_Start(); //起始信号
- i2c_SendByte(BMP085_ADDRESS); //发送设备地址+写信号
- i2c_WaitAck();
- i2c_SendByte(REG_Address); //发送存储单元地址,从0开始
- i2c_WaitAck();
- i2c_Start(); //起始信号
- i2c_SendByte(BMP085_ADDRESS+1); //发送设备地址+读信号
- i2c_WaitAck();
- REG_data=i2c_ReadByte(0); //读出寄存器数据
- i2c_Stop(); //停止信号
- return REG_data;
- }
- //******************************************************
- //
- //连续读出HMC5883内部角度数据,地址范围0x3~0x5
- //
- //******************************************************
- short Multiple_read_BMP085(unsigned char REG_Address)
- { unsigned char msb,lsb;
- short _data;
- i2c_Start(); //起始信号
- i2c_SendByte(BMP085_ADDRESS); //发送设备地址+写信号
- i2c_WaitAck();
- i2c_SendByte(REG_Address); //发送存储单元地址,从0x3开始
- i2c_WaitAck();
- i2c_Start(); //起始信号
- i2c_SendByte(BMP085_ADDRESS+1); //发送设备地址+读信号
- i2c_WaitAck();
- msb=i2c_ReadByte(1);
- lsb=i2c_ReadByte(0);
- i2c_Stop(); //停止信号
- delay5ms();
- _data=(msb<<8)|lsb;
- return(_data);
- }
- //********************************************************************
- long BMP085ReadTemp(void)
- {
- long Temperature = 0;
- i2c_Start(); //起始信号
- i2c_SendByte(BMP085_ADDRESS); //发送设备地址+写信号
- i2c_WaitAck();
- i2c_SendByte(0xF4); // write register address
- i2c_WaitAck();
- i2c_SendByte(0x2E); // write register data for temp
- i2c_WaitAck();
- i2c_Stop(); //发送停止信号
- Temperature = Multiple_read_BMP085(0xF6);
- return Temperature ;
- }
- //*************************************************************
- long BMP085ReadPressure(void)
- {
- long pressure = 0;
- uint8_t pressureX[3];
- i2c_Start(); //起始信号
- i2c_SendByte(BMP085_ADDRESS); //发送设备地址+写信号
- i2c_WaitAck();
- i2c_SendByte(0xF4); // write register address
- i2c_WaitAck();
- i2c_SendByte(0x34); // write register data for pressure
- i2c_WaitAck();
- i2c_Stop();
-
- pressureX[0]= Multiple_read_BMP085(0xF6);
- pressureX[1]= Multiple_read_BMP085(0xF7);
- pressureX[2]= Multiple_read_BMP085(0xF8);
- pressure = (((long)pressureX[0]<<16)+((long)pressureX[1]<<8)+((long)pressureX[2]))>>8; //////////////////////////////////////////////////////////////
-
- return pressure;
- }
- //**************************************************************
- //初始化BMP085,根据需要请参考pdf进行修改**************
- void Init_BMP085()
- {
- ac1 = Multiple_read_BMP085(0xAA);
- ac2 = Multiple_read_BMP085(0xAC);
- ac3 = Multiple_read_BMP085(0xAE);
- ac4 = Multiple_read_BMP085(0xB0);
- ac5 = Multiple_read_BMP085(0xB2);
- ac6 = Multiple_read_BMP085(0xB4);
- b1 = Multiple_read_BMP085(0xB6);
- b2 = Multiple_read_BMP085(0xB8);
- mb = Multiple_read_BMP085(0xBA);
- mc = Multiple_read_BMP085(0xBC);
- md = Multiple_read_BMP085(0xBE);
- }
- void BMP085Convert(BMP085_Data_TypeDef *BMP085_Data)
- {
- unsigned int ut;
- unsigned long up;
- long x1, x2, b5, b6, x3, b3, p;
- unsigned long b4, b7;
- double dat_temp;
- double dat_temp1;
- ut = BMP085ReadTemp(); // ????
- up = BMP085ReadPressure(); // ????
- x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
- x2 = ((long) mc << 11) / (x1 + md);
- b5 = x1 + x2;
- BMP085_Data->temp = (b5 + 8) >> 4;
- BMP085_Data->temp = BMP085_Data->temp/10;
- //*************
-
-
- b6 = b5 - 4000;
- // Calculate B3
- x1 = (b2 * (b6 * b6)>>12)>>11;
- x2 = (ac2 * b6)>>11;
- x3 = x1 + x2;
- b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
-
- // Calculate B4
- x1 = (ac3 * b6)>>13;
- x2 = (b1 * ((b6 * b6)>>12))>>16;
- x3 = ((x1 + x2) + 2)>>2;
- b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;
-
- b7 = ((unsigned long)(up - b3) * (50000>>OSS));
- if (b7 < 0x80000000)
- p = (b7<<1)/b4;
- else
- p = (b7/b4)<<1;
-
- x1 = (p>>8) * (p>>8);
- x1 = (x1 * 3038)>>16;
- x2 = (-7357 * p)>>16;
- p= p + ((x1 + x2 + 3791) >> 4);
- BMP085_Data->pres= p/1000;
- dat_temp1=(double)p/101325;
- dat_temp=pow(dat_temp1,0.1903);
- BMP085_Data->altitude=(double)44330*(1-dat_temp)/10; //
- }
复制代码 5.后续计划
尽快掌握FreeRTOS的应用,把前面所用的传感器整合起来,接入ONENET平台。
|
|
|
|
|
|
|
|
|
|
|
沙发
ky123
发表于 2017-10-26 14:18:57
|
只看该作者
|
|
|
|
|
|
|
|