[活动专区] 【AutoChips MCU评测报告】+BMP085气温气压检测

[复制链接]
 楼主| jinglixixi 发表于 2020-6-12 08:14 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2020-6-12 08:16 编辑

BMP085是一款可测量气温、气压的I2C器件,它具有体积小、易于使用的特点。

BH1750MCU的连接关系为:
SCL——PA7
SDA——PA8

为使 BMP085有效工作,所作的相关定义语句如下:
#define SCL_Set()      GPIO_SetPinBits(GPIO_PA7)      // PA7      
#define SCL_Clr()      GPIO_ResetPinBits(GPIO_PA7)        

#define SDA_Set()      GPIO_SetPinBits(GPIO_PA8)      // PA8
#define SDA_Clr()      GPIO_ResetPinBits(GPIO_PA8)   
#define IIC_SDA_IN     GPIO_GetPinValue(GPIO_PA8)

#define IIC_INPUT_MODE_SET()   GPIO_SetDir(GPIO_PA8, 0)
#define IIC_OUTPUT_MODE_SET()  GPIO_SetDir(GPIO_PA8, 1)

使 BMP085工作的辅助函数有:
  1. void BMP085_Start(void)      
  2. {
  3. IIC_OUTPUT_MODE_SET();
  4. SDA_Set();         
  5. SCL_Set();         
  6. udelay(5);           
  7. SDA_Clr();        
  8. udelay(5);  
  9. SCL_Clr();
  10. }

  11. void BMP085_Stop(void)
  12. {
  13. IIC_OUTPUT_MODE_SET();
  14. SDA_Clr();            
  15. SCL_Clr();
  16. udelay(5);   
  17. SCL_Set();
  18. udelay(5);
  19. SDA_Set();  
  20. udelay(5);
  21. }

读取气温的函数为:
  1. long bmp085ReadTemp(void)
  2. {
  3. BMP085_Start();                 
  4. BMP085_Send_Byte(BMP085_SlaveAddress);   
  5. while(BMP085_Wait_Ack()){}
  6. BMP085_Send_Byte(0xF4);                  
  7. while(BMP085_Wait_Ack()){}
  8. BMP085_Send_Byte(0x2E);      
  9. while(BMP085_Wait_Ack()){}
  10. BMP085_Stop();                  
  11. mdelay(10);
  12. return (long) Multiple_read(0xF6);
  13. }

读取气压的函数为:
  1. long bmp085ReadPressure(void)
  2. {
  3. long pressure = 0;
  4. BMP085_Start();                  
  5. BMP085_Send_Byte(BMP085_SlaveAddress);  
  6. while(BMP085_Wait_Ack()){}
  7. BMP085_Send_Byte(0xF4);                  
  8. while(BMP085_Wait_Ack()){}
  9. BMP085_Send_Byte(0x34);                 
  10. while(BMP085_Wait_Ack()){}
  11. BMP085_Stop();                  
  12. mdelay(10);
  13. pressure = Multiple_read(0xF6);
  14. pressure &= 0x0000FFFF;
  15. return pressure;
  16. }

BMP085的初始化函数为:
  1. void Init_BMP085()
  2. {
  3. ac1 = Multiple_read(0xAA);
  4. ac2 = Multiple_read(0xAC);
  5. ac3 = Multiple_read(0xAE);
  6. ac4 = Multiple_read(0xB0);
  7. ac5 = Multiple_read(0xB2);
  8. ac6 = Multiple_read(0xB4);
  9. b1 =  Multiple_read(0xB6);
  10. b2 =  Multiple_read(0xB8);
  11. mb =  Multiple_read(0xBA);
  12. mc =  Multiple_read(0xBC);
  13. md =  Multiple_read(0xBE);
  14. }

BMP085数值转换函数为:
  1. void bmp085Convert()
  2. {
  3. unsigned int ut;
  4. unsigned long up;
  5. long x1, x2, b5, b6, x3, b3, p;
  6. unsigned long b4, b7;
  7. ut = bmp085ReadTemp();           
  8. up = bmp085ReadPressure();  
  9. x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
  10. x2 = ((long) mc << 11) / (x1 + md);
  11. b5 = x1 + x2;
  12. temperature = ((b5 + 8) >> 4);
  13. b6 = b5 - 4000;
  14. x1 = (b2 * (b6 * b6)>>12)>>11;
  15. x2 = (ac2 * b6)>>11;
  16. x3 = x1 + x2;
  17. b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
  18. x1 = (ac3 * b6)>>13;
  19. x2 = (b1 * ((b6 * b6)>>12))>>16;
  20. x3 = ((x1 + x2) + 2)>>2;
  21. b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;  
  22. b7 = ((unsigned long)(up - b3) * (50000>>OSS));
  23. if (b7 < 0x80000000)
  24. p = (b7<<1)/b4;
  25. else
  26. p = (b7/b4)<<1;   
  27. x1 = (p>>8) * (p>>8);
  28. x1 = (x1 * 3038)>>16;
  29. x2 = (-7357 * p)>>16;
  30. pressure = p+((x1 + x2 + 3791)>>4);
  31. }

实现图示效果的主函数为:
  1. int main(void)
  2. {
  3. InitDebug();
  4. InitDelay();
  5. OLED_Init();
  6. OLED_Clear();
  7. OLED_ShowString(0,0,"AC8711 TEST",16);
  8. OLED_ShowString(0,2,"BMP085",16);
  9. OLED_ShowString(0,4,"t=     C",16);
  10. OLED_ShowString(0,6,"p=       KPa",16);
  11. BMP085_Init();
  12. Init_BMP085();
  13. while(1)
  14. {
  15. bmp085Convert();  
  16. printf("temperature: %d C\r\n", temperature/10);
  17. printf("pressure: %d KPa\r\n", pressure/100);
  18. OLED_ShowNum(24,4,temperature/10,3,16);
  19. OLED_ShowNum(24,6,pressure/100,5,16);
  20. mdelay(1000);
  21. }
  22. }


IMG_20200611_234440_resized_20200611_115410292.jpg
BMP085测量效果

您需要登录后才可以回帖 登录 | 注册

本版积分规则

518

主题

2934

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部