OpenEdv-开源电子网

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

请问STM32F407中MS5611的问题

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2019-12-23
在线时间
3 小时
发表于 2019-12-26 16:37:54 | 显示全部楼层 |阅读模式
1金钱
我用自己的模拟IIC协议对MS5611进行通信,但是获取到的气压不对都跑到13000+了,是根据他给的公式来获取的数值,不知道哪里出现了问题

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

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2019-12-23
在线时间
3 小时
 楼主| 发表于 2019-12-26 16:39:57 | 显示全部楼层
#include "5611.h"
extern uint16_t c[6];

extern uint8_t c_team[12];//C1-C6
extern uint8_t ad_team[3];


extern int64_t preesure;

extern int32_t  temp;

extern int64_t TEMP2,T2,OFF2,SENS2;
void ms5611_reset(void)
{
        uint8_t check;
        iic_start();
        sent_byte_iic(0xEE);//send device address
        check = iic_check_ack();
        if(check == 0)
        {
                return;
        }
        sent_byte_iic(0x1E);//send reset command
        check = iic_check_ack();
        if(check == 0)
        {
                return;
        }
        iic_stop();
}

void ms5611_read_prom(void)
{
        uint8_t check;
        uint8_t i;
        /*page 2*/
        for(i = 1;i <= 6;i++)
        {
                iic_start();
                sent_byte_iic(0xEE);//发送写命令
                check = iic_check_ack();
                if(check == 0)
                {
                return;
                }
                sent_byte_iic(0xA0+(i*2));//目标寄存器地址
                check = iic_check_ack();
                if(check == 0)
                {
                        return;
                }
                iic_stop();
                delay_us(5);
                //开始读
                iic_start();
                sent_byte_iic(0xEF);
                delay_us(1);
                check = iic_check_ack();
                if(check == 0)
                {
                        return;
                }
                c_team[((i-1)*2)] = recv_byte_iic();//01放c1以此类推
                iic_ack();//发送读取成功
                delay_us(1);
                c_team[((i-1)*2)+1] = recv_byte_iic();
                iic_nack();
                iic_stop();
        }
        for(i = 0;i < 6 ;i++)//获取C1-C6的具体数值
        {
                c[i] = (((uint16_t)(c_team[i])<< 8) + (uint16_t)(c_team[i+1]));
                printf("c%d:%lu\r\n",i,c[i]);
        }
}

uint32_t get_coversion(uint32_t reg)
{
        uint8_t check;
        uint32_t conversation;
        //发送AD转换命令
        iic_start();
        sent_byte_iic(0xEE);
        check = iic_check_ack();
        if(check == 0)
        {
                printf("d0\r\n");
        }
        sent_byte_iic(reg);
        check = iic_check_ack();
        if(check == 0)
        {
                printf("a1\r\n");
        }
        iic_stop();
        delay_ms(10);
       
        //step2 发送读取AD寄存器数据的命令
        iic_start();
        sent_byte_iic(0xEE);
        check = iic_check_ack();
        if(check == 0)
        {
                printf("a1\r\n");
        }
        sent_byte_iic(0);
        check = iic_check_ack();
        if(check == 0)
        {
                printf("b2\r\n");
        }
        iic_stop();

        //开始读取AD数据
        iic_start();
        sent_byte_iic(0xEF);
        check = iic_check_ack();
        if(check == 0)
        {
                printf("c3\r\n");
        }
        ad_team[0] = recv_byte_iic();
        iic_ack();
        ad_team[1] = recv_byte_iic();
        iic_ack();
        ad_team[2] = recv_byte_iic();
        iic_nack();
        iic_stop();
                                                                                        //65536                                                        256                                       
        conversation = (((uint32_t)(ad_team[0]) << 16)+((uint32_t)(ad_team[1]) << 8)+((uint32_t)ad_team[2]));
        printf("ad0:%d,ad1:%d,ad2:%d,conversation:%lu\r\n",ad_team[0],ad_team[1],ad_team[2],conversation);
        return conversation;
}

int32_t get_dT(void)
{
        int32_t dT;
        dT= (int32_t)get_coversion(0x58)-((int32_t)(c[4]) << 8);
       
        temp = (((int32_t)dT*(int32_t)c[5])>>23)+ (int32_t)2000 ;
        printf("当前温度temp:%ld,dT:%ld\r\n",temp,dT);
        return dT;
}

void get_pressure(void)
{
        int32_t dT;
        uint32_t d1;
        uint8_t i;
        int64_t sens;
        int64_t off;
       
        dT = get_dT();//获取温度补偿
        delay_ms(100);
        printf("dT:%ld\r\n",dT);
       
        d1 = get_coversion(0x48);//获取气压AD值
        delay_ms(100);
       
        /*for(i = 0;i < 6;i++)
        {
                printf("c%d:%d\r\n",i,c[i]);
        }*/
       
        sens = ((int64_t)c[0] << 15)+(((int64_t)c[2]*dT)>>8);
        printf("sens:%lld",sens);
        off =  ((int64_t)c[1] << 16)+(((int64_t)c[3]*dT)>>7);
        printf("off:%lld",off);
        if(temp < 2000)
        {
                printf("temp<2000\r\n");
                /*extern int64_t preesure;

                extern int32_t  temp;

                extern int64_t TEMP2,T2,OFF2,SENS2;*/
               
               
                T2 = ((int64_t)dT*(int64_t)dT) >> 31;
                OFF2 = 5*((int64_t)temp-2000)*((int64_t)temp-2000)/2;
                printf("OFF2:%lld\r\n",OFF2);
                SENS2 = 5*((int64_t)temp-2000)*((int64_t)temp-2000)/4;
                printf("SENS2:%lld\r\n",SENS2);
                if(temp < -1500)
                {
                        OFF2 = OFF2 +7*(temp+1500)*(temp+1500);
                        SENS2 = SENS2 + 11*(temp+1500)*(temp+1500)/2;
                }
                temp = temp- (int32_t)T2;
                off = off - OFF2;
                sens = sens - SENS2;
                printf("offa:%lld\r\n",off);
                printf("sensa:%lld\r\n",sens);
        }
        preesure = ((((int64_t)d1*sens) >> 21) - off) >> 15;
        printf("pressure:%lld",preesure);
}

void ms5611_init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_Init(GPIOE,&GPIO_InitStructure);
        PEout(12) = 1;
        PEout(11) = 0;

        ms5611_reset();
        delay_ms(100);
        ms5611_read_prom();
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-12-27 02:20:11 | 显示全部楼层
论坛搜索,参考下其他人的例程
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-21 01:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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