OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4477|回复: 3

用IO模拟IIC读取BMP180,读到的UT是0,UP是65535,校准系数能够读出来,求解求解。

[复制链接]

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2017-9-30
在线时间
20 小时
发表于 2017-10-25 01:56:56 | 显示全部楼层 |阅读模式
1金钱
用原子大大的mpu6050例程的模拟IIC读取BMP180,读到的UT是0,UP是65535,校准系数能够读出来,求解求解。代码贴出来,求大神解答啊,硬件什么的应该没问题。
[mw_shl_code=c,true]#include "bmp180.h"
#include "delay.h"
#include "mpuiic.h"
#include "sys.h"
#include "math.h"
#include "usart.h"
//***BMP085ê1óÃ
long  result_UT=0;
long  result_UP=0;

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;

//*********************************************************
//¶á3öBMP085Äú2¿êy¾Y,á¬Døὸö
//*********************************************************
u16 Multiple_read(u8 ST_Address)
{   
        u8 msb, lsb;
        u16 _data;
    MPU_IIC_Start();                          //Æeê¼DÅoÅ
    MPU_IIC_Send_Byte(BMP180_SlaveAddress);    //·¢Ëíé豸μØÖ·+D′DÅoÅ
        while(MPU_IIC_Wait_Ack());
    MPU_IIC_Send_Byte(ST_Address);             //·¢Ëí′æ′¢μ¥ÔaμØÖ·
        while(MPU_IIC_Wait_Ack());                                 
    MPU_IIC_Start();                          //Æeê¼DÅoÅ
    MPU_IIC_Send_Byte(BMP180_SlaveAddress+1);         //·¢Ëíé豸μØÖ·+¶áDÅoÅ
        while(MPU_IIC_Wait_Ack());                                       

    msb = MPU_IIC_Read_Byte(1);                 //BUF[0]′æ′¢               
    lsb = MPU_IIC_Read_Byte(0);                //×îoóò»¸öêy¾YDèòa»ØNOACK

    MPU_IIC_Stop();                           //í£Ö1DÅoÅ
    delay_ms(5);
    _data = msb << 8;
        _data |= lsb;       
        return _data;
}
//********************************************************************
u16 bmp180ReadTemp(void)
{

    MPU_IIC_Start();                  //&#198;eê&#188;D&#197;o&#197;
    MPU_IIC_Send_Byte(BMP180_SlaveAddress);   //·¢&#203;íéè±&#184;μ&#216;&#214;·+D′D&#197;o&#197;   BMP180_SlaveAddress  0xee        &#198;&#248;&#209;1′&#171;&#184;D&#198;÷&#198;÷&#188;tμ&#216;&#214;·
        while(MPU_IIC_Wait_Ack());
    MPU_IIC_Send_Byte(0xF4);        // write register address
    while(MPU_IIC_Wait_Ack());
        MPU_IIC_Send_Byte(0x2E);               // write register data for temp
    while(MPU_IIC_Wait_Ack());
        MPU_IIC_Stop();                   //·¢&#203;íí£&#214;1D&#197;o&#197;
        delay_ms(50);        // max time is 4.5ms
        return Multiple_read(0xF6);
}
//*************************************************************
u16 bmp180ReadPressure(void)
{
        //u16 pressure = 0;

    MPU_IIC_Start();                   //&#198;eê&#188;D&#197;o&#197;
    MPU_IIC_Send_Byte(BMP180_SlaveAddress);   //·¢&#203;íéè±&#184;μ&#216;&#214;·+D′D&#197;o&#197;
    while(MPU_IIC_Wait_Ack());
        MPU_IIC_Send_Byte(0xF4);                  // write register address
    while(MPU_IIC_Wait_Ack());
        MPU_IIC_Send_Byte(0x34);                 // write register data for pressure
    while(MPU_IIC_Wait_Ack());
        MPU_IIC_Stop();                    //·¢&#203;íí£&#214;1D&#197;o&#197;
        delay_ms(50);                              // max time is 4.5ms
       
        //pressure = Multiple_read(0xF6);
        //pressure &= 0x0FFFF;
       
        return Multiple_read(0xF6);//pressure;       
}

//**************************************************************

//3&#245;ê&#188;&#187;ˉBMP085£&#172;&#184;ù&#190;YDèòa&#199;&#235;2&#206;&#191;&#188;pdf&#189;&#248;DDDT&#184;&#196;**************
void Init_BMP180()
{
        MPU_IIC_Init();
        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);
        printf("ac1:%d \r\n",ac1);
        printf("ac2:%d \r\n",ac2);
        printf("ac3:%d \r\n",ac3);
        printf("ac4:%d \r\n",ac4);
        printf("ac5:%d \r\n",ac5);
        printf("ac6:%d \r\n",ac6);
        printf("b1:%d \r\n",b1);
        printf("b2:%d \r\n",b2);
        printf("mb:%d \r\n",mb);
        printf("mc:%d \r\n",mc);
        printf("md:%d \r\n",md);
}
//***********************************************************************
void bmp180Convert()
{
        unsigned int ut=0;
        unsigned long up=0;
        long x1, x2, b5, b6, x3, b3, p;
        unsigned long b4, b7;

        ut = bmp180ReadTemp();           // &#182;áè&#161;&#206;&#194;&#182;è
        up = bmp180ReadPressure();  // &#182;áè&#161;&#209;1&#199;&#191;    return pressure;
  printf("up:%ld \r\n",up);       
        printf("ut:%d \r\n",ut);
        //*************
        x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
        x2 = ((long) mc << 11) / (x1 + md);
        b5 = x1 + x2;
        result_UT = ((b5 + 8) >> 4);
        //*************               
        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;
        result_UP = p+((x1 + x2 + 3791)>>4);
       
}


/****************************************************************
&#161;&#161;&#161;&#161;&#161;&#161;oˉêy&#195;&#251;3&#198;£oBMP085_Get_Altitude                            
&#161;&#161;&#161;&#161;&#161;&#161;oˉêy1|&#196;ü£o&#187;&#241;è&#161;o£°&#206;&#184;&#223;&#182;è&#214;μ
&#161;&#161;&#161;&#161;&#161;&#161;è&#235;&#191;ú2&#206;êy£o&#206;T
&#161;&#161;&#161;&#161;&#161;&#161;3&#246;&#191;ú2&#206;êy£oaltitude //intDí  2×&#214;&#189;ú£&#172;μ±&#199;°o£°&#206;&#184;&#223;&#182;è&#214;μ
&#161;&#161;&#161;&#161;&#161;&#161;±&#184; ×¢£o         ·μ&#187;&#216;μ&#196;&#184;&#223;&#182;è&#214;μμ¥&#206;&#187;&#206;aà&#229;&#195;×£&#172;μ÷ó&#195;ê±&#212;ù&#187;&#187;&#203;&#227;3é′&#248;D&#161;êyμ&#196;ò&#212;&#195;×&#206;aμ¥&#206;&#187;μ&#196;&#184;&#223;&#182;è&#214;μ
*****************************************************************/

double BMP180_Get_Altitude(long p)
{
        double  altitude;
        p=(float)p;                                //&#187;&#241;è&#161;&#198;&#248;&#209;1&#214;μ
        altitude=44330.0*(1-pow((double)p/101325,1/5.255));          //&#184;ù&#190;YD&#190;&#198;&#172;ê&#214;2áìá1&#169;μ&#196;1&#171;ê&#189;&#188;&#198;&#203;&#227;o£°&#206;&#184;&#223;&#182;è
        altitude*=100;                         //×a&#187;&#187;3éà&#229;&#195;×μ¥&#206;&#187;μ&#196;&#184;&#223;&#182;è&#214;μ£&#172;μ÷ó&#195;ê±&#212;ù&#187;&#187;&#203;&#227;3é′&#248;D&#161;êyμ&#196;&#184;&#223;&#182;è&#214;μ£&#172;ìá&#184;&#223;&#190;&#171;&#182;è
        return altitude;
}
[/mw_shl_code]



[mw_shl_code=c,true]#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "mpu6050.h"
#include "usmart.h"
#include "mpuiic.h"
#include "bmp180.h"



//′&#174;&#191;ú1·¢&#203;í1&#184;&#246;×&#214;·&#251;
//c:òa·¢&#203;íμ&#196;×&#214;·&#251;
void usart1_send_char(u8 c)
{          
        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); //&#209;-&#187;··¢&#203;í,&#214;±μ&#189;·¢&#203;ííê±&#207;   
        USART_SendData(USART1,c);  
}

int main(void)
{         
       
   long  result_UT;
   long  result_UP;
         int BMP180_ID;
         double Altitude;
         
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //éè&#214;&#195;NVIC&#214;D&#182;&#207;·&#214;×é2:2&#206;&#187;&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;£&#172;2&#206;&#187;&#207;ìó|ó&#197;&#207;è&#188;&#182;
        uart_init(9600);                 //′&#174;&#191;ú3&#245;ê&#188;&#187;ˉ&#206;a500000
        delay_init();        //&#209;óê±3&#245;ê&#188;&#187;ˉ
        usmart_dev.init(72);                //3&#245;ê&#188;&#187;ˉUSMART
         Init_BMP180();
       
        while(1)
  {
                 BMP180_ID = MPU_Read_Byte(0xd0);      //&#182;áè&#161;IDμ&#216;&#214;·
                 printf("BMP180_ID:0x%x \r\n",BMP180_ID);
                 bmp180Convert();         
     Altitude=BMP180_Get_Altitude(result_UP);               
                 printf("Press:%.ld Pa \r\n",result_UP);         
     printf("Altitude:%lf m \r\n",Altitude);
     printf("Temperature:%ld \r\n",result_UT);       
               
                 delay_ms(1000);
        }
}
[/mw_shl_code]


求解答……

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2017-9-30
在线时间
20 小时
 楼主| 发表于 2017-10-25 02:01:28 | 显示全部楼层
压强和温度都是0,而高度就乱七八糟了。
回复

使用道具 举报

129

主题

397

帖子

0

精华

高级会员

Rank: 4

积分
831
金钱
831
注册时间
2017-7-12
在线时间
150 小时
发表于 2017-12-26 21:59:54 | 显示全部楼层
我也是
回复

使用道具 举报

8

主题

72

帖子

0

精华

高级会员

Rank: 4

积分
669
金钱
669
注册时间
2014-1-14
在线时间
108 小时
发表于 2018-6-12 14:16:13 | 显示全部楼层
顶,也是一样的问题
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-26 06:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表