这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 有奖活动 » AG32VH407下温度大气压传感器及其检测

共1条 1/1 1 跳转至

AG32VH407下温度大气压传感器及其检测

助工
2026-04-14 22:19:06     打赏

BMP085是一款高精度、小体积、低能耗的压力传感器,适于应用移动设备精度可以达到0.03hPa,耗电只有3μA 

主要特点如下 

压力范围:300~1100hPa(海拔9000~-500米) 

电源电压:1.8V~3.6VVDDA),1.62V~3.6VVDDD

高精度:低功耗模式下,分辨率为0.06hPa0.5米) 

高线性模式下,分辨率为0.03hPa0.25米)

MSL 1反应时间:7.5ms 

待机电流:0.1μA 

无需外部时钟电路 

典型应用方向为 

GPS导航(航位推算,上下桥检测等) 

室内外导航 

休闲、体育和医疗健康等监测 

天气预报 

垂直速度指示(上升/下沉速度)

BMP085通过I2C总线直接与各种微处理器相连其外观如图1所示

image.png

1 模块外观

在检测时,它与开发板的连接关系为:

SCL---PIN_62

SDA---PIN_61

为此在 VE文件中所建立的映射关系如下:

GPIO5_0 PIN_62  #CLK

GPIO5_1 PIN_61  #SDA

为便于提供高低电平的输出及读取引脚状态定义的语句为:

#define SCL1_Clr()  GPIO_SetLow(GPIO5,GPIO_BIT0)

#define SCL1_Set()  GPIO_SetHigh(GPIO5,GPIO_BIT0)

#define SDA1_Clr()  GPIO_SetLow(GPIO5,GPIO_BIT1)

#define SDA1_Set()  GPIO_SetHigh(GPIO5,GPIO_BIT1)

#define IIC_SDA_IN1 GPIO_GetValue(GPIO5,GPIO_BIT1)

#define BMP085_SlaveAddress    0xee

#define OSS 0

辅助数据收发处理的启动与停止函数为:

void BMP085_Start(void)
{
      IIC_OUTPUT_MODE_SET1();
      SDA1_Set();
      SCL1_Set();
      UTIL_IdleUs(5); 
      SDA1_Clr();
      UTIL_IdleUs(5); 
      SCL1_Clr();
}

void BMP085_Stop(void)
{
      IIC_OUTPUT_MODE_SET1();
      SDA1_Clr();
      SCL1_Clr();
      UTIL_IdleUs(5); 
      SCL1_Set();
      UTIL_IdleUs(10); 
}

发送字节数据的函数为:

void BMP085_Send_Byte(char txd)
{
    char t;
    IIC_OUTPUT_MODE_SET1();
    SCL1_Clr();
    for(t=0;t<8;t++)
    {
        if((txd&0x80)>>7)
            SDA1_Set();
        else
            SDA1_Clr();
        txd<<=1;
        UTIL_IdleUs(2); 
        SCL1_Set();
        UTIL_IdleUs(2); 
        SCL1_Clr();
        UTIL_IdleUs(2); 
    }
}

 读取字节数据的函数为:

char BMP085_Read_Byte(unsigned char ack)
{
    unsigned char i,receive=0;
    IIC_INPUT_MODE_SET1();
    for(i=0;i<8;i++)
    {
        SCL1_Clr();
        UTIL_IdleUs(2); 
        SCL1_Set();
        receive<<=1;
        if(IIC_SDA_IN1) receive++;
        UTIL_IdleUs(1); 
    }
    if(!ack)
        BMP085_NAck();
    else
        BMP085_Ack();
    return receive;
}

读取多字节数据的函数为:

short Multiple_read(char ST_Address)
{
      char msb, lsb;
      short _data;
      BMP085_Start();
      BMP085_Send_Byte(BMP085_SlaveAddress);
      while(BMP085_Wait_Ack());
      BMP085_Send_Byte(ST_Address);
      while(BMP085_Wait_Ack());
      BMP085_Start();
      BMP085_Send_Byte(BMP085_SlaveAddress+1);
      while(BMP085_Wait_Ack());
      msb = BMP085_Read_Byte(1);
      lsb = BMP085_Read_Byte(0);
      BMP085_Stop();
      UTIL_IdleUs(5e3);
      _data = msb << 8;
      _data |= lsb;
      return _data;
}

读取温度的函数为:

long bmp085ReadTemp(void)
{
    BMP085_Start();
    BMP085_Send_Byte(BMP085_SlaveAddress);
    while(BMP085_Wait_Ack());
    BMP085_Send_Byte(0xF4);
    while(BMP085_Wait_Ack());
    BMP085_Send_Byte(0x2E);
    while(BMP085_Wait_Ack());
    BMP085_Stop();
    UTIL_IdleUs(10e3);    
    return (long) Multiple_read(0xF6);
}

读取大气压的函数为:

long bmp085ReadPressure(void)
{
    long pressure = 0;
    BMP085_Start();
    BMP085_Send_Byte(BMP085_SlaveAddress);
    while(BMP085_Wait_Ack()){}
    BMP085_Send_Byte(0xF4);
    while(BMP085_Wait_Ack()){}
    BMP085_Send_Byte(0x34);
    while(BMP085_Wait_Ack()){}
    BMP085_Stop();
    UTIL_IdleUs(10e3);
    pressure = Multiple_read(0xF6);
    pressure &= 0x0000FFFF;
    return pressure;
}

BMP085的初始化函数为:

void Init_BMP085()
{
    ac1 = Multiple_read(0xAA);
    ac2 = Multiple_read(0xAC);
    ac3 = Multiple_read(0xAE);
    ac4 = Multiple_read(0xB0);
    ac5 = Multiple_read(0xB2);
    ac6 = Multiple_read(0xB4);
    b1 =  Multiple_read(0xB6);
    b2 =  Multiple_read(0xB8);
    mb =  Multiple_read(0xBA);
    mc =  Multiple_read(0xBC);
    md =  Multiple_read(0xBE);
}

温度与大气压数值变换处理的函数为:

void bmp085Convert()
{
      unsigned int ut;
      unsigned long up;
      long x1, x2, b5, b6, x3, b3, p;
      unsigned long b4, b7;
      ut = bmp085ReadTemp();
      up = bmp085ReadPressure();
      x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
      x2 = ((long) mc << 11) / (x1 + md);
      b5 = x1 + x2;
      temperature = ((b5 + 8) >> 4);
      b6 = b5 - 4000;
      x1 = (b2 * (b6 * b6)>>12)>>11;
      x2 = (ac2 * b6)>>11;
      x3 = x1 + x2;
      b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
      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;
      pressure = p+((x1 + x2 + 3791)>>4);
}

实现温度、大气压检测的主程序为:

int main(void)
{
   uint16_t k=0;
   board_init();
   BMP085_Init();
   Init_BMP085();
   while (1)
   {
        bmp085Convert();
        k=pressure/100; 
        printf("pressure: %d \r\n",k);      
        k=temperature/10;
        printf("temperature: %d \r\n",k);
        UTIL_IdleUs(500e3);     
   }
}

经程序的编译和下载,在按图2进行连接的情况下,其检测结果如图3所示。

image.png

2 器件连接

image.png

3 检测结果







关键词: AG32VH407    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]