BMP085是新一代的小封装气压传感器,主要用于气压温度检测,在四轴飞行器上可以用作定高检测,该传感器属于IIC总线接口,依然沿用标准IIC驱动程序
使用该传感器需要注意的是我们不能直接读出转换好的二进制温度数据或者气压数据,必须先读出一整套约176位的矫正数据,然后启动转换,将转换的数据与矫正数据一起进行矫正运算才能正常获得温度,温度精度为0.1,大气压有16bit或者19bit的精度,一般选择16位精度,
所以对于该传感器设备,驱动模式如下
1.获取矫正数据-->启动温度转换--->获取原始温度数据-->启动大气压转换-->获取原始大气压数据-->计算实际温度数据大气压数据
另,转换时的转换时间也是计算时的重要参数,计算大气压时的过程中需要使用冤死温度
矫正数据如下
矫正数据都是16位有符号的,所以读出的时候需要连续读取两个字节
通过计算得到的大气压强可以计算得到当前传感器相对于海平面的绝对高度
具体驱动代码如下所示
#ifndef __BMP085_H_
#define __BMP085_H_
#include "ioremap.h"
#include "common.h"
#include "stm32f10x.h"
#include "uart.h"
#include "delay.h"
//BMP SDA PC0
//BMP SCL PC1
#define BMP_ACK_WAIT_TIME 200 //iic通讯时的ack等待时间
#define BMP085_DEBUG 1
#define OSS 0 // 大气压的转换时间,有0-3可选值
//地址均为读地址
#define BMP085_ADDR 0xEE //定义器件在IIC总线中的写地址
#define BMP_AC1_ADDR 0XAA //定义校准寄存器的地址
#define BMP_AC2_ADDR 0XAC
#define BMP_AC3_ADDR 0XAE
#define BMP_AC4_ADDR 0XB0
#define BMP_AC5_ADDR 0XB2
#define BMP_AC6_ADDR 0XB4
#define BMP_B1_ADDR 0XB6
#define BMP_B2_ADDR 0XB8
#define BMP_MB_ADDR 0XBA
#define BMP_MC_ADDR 0XBC
#define BMP_MD_ADDR 0XBE
#define CONTROL_REG_ADDR 0XF4 //控制寄存器,在这个寄存器中设置不同的值可以设置不同转换时间,同时不同的值可以确认转换大气压或者温度
#define BMP_COVERT_TEMP 0X2E //转换温度 4.5MS
#define BMP_COVERT_PRES_0 0X34 //转换大气压 4.5ms
#define BMP_COVERT_PRES_1 0X74 //转换大气压 7.5ms
#define BMP_COVERT_PRES_2 0XB4 //转换大气压 13.5ms
#define BMP_COVERT_PRES_3 0XF4 //转换大气压 25.5ms
#define BMP_TEMP_PRES_DATA_REG 0XF6 //两个字节温度数据
//0xf6 0xf7 0xf8 压强地址
//0xf6 0xf7 温度地址
typedef struct BMP085PARAM //校准参数表
{
s16 a