搜索
bottom↓
回复: 6

MS5611 数值偏差比较大,但是变化趋势是有的,为何?

[复制链接]

出0入0汤圆

发表于 2018-4-14 01:15:59 | 显示全部楼层 |阅读模式
最近在写一个PX4飞控板的MS5611测试程序,可是读出来的温度数值都在32度左右,气压在50402.(实际温度在18度,气压在100009这个级别才是)。测试了好多SPI的程序。就是不正确。不知道原因了?看气压曲线,我用手在1.6m上下动,曲线到时对的,温度用嘴吹吹也能上升?可这么大的偏差是咋回事?

void Baro_Init(void)
{
  Baro_Cmd_Reset();
        Baro_Read_Coe();
}



float Baro_Get_Alt3(void)
{
       
  int64_t OFF2=0;
        int64_t SENS2=0;
        float altitude;
//        uint8_t n_crc; // crc value of the prom
       
//        cmd_reset(); // reset the module after powerup
       
        //        uint8_t n_crc; // crc value of the prom
//        cmd_reset(); // reset the module after powerup
       
        for (uint8_t i = 0; i < 8; i++){
                C[i] = Baro_Cmd_Prom(i);
        }
        // read calibration coefficients

        D1=Baro_Adc(CMD_ADC_D1+CMD_ADC_4096); // read uncompensated pressure
        D2=Baro_Adc(CMD_ADC_D2+CMD_ADC_4096); // read uncompensated temperature
        // calcualte 1st order pressure and temperature (MS5607 1st order algorithm)
//        C[1] = 40127;
//        C[2] = 36924;
//        C[3] = 23317;
//        C[4] = 23282;
//        C[5] = 33464;
//        C[6] = 28312;
//        D1 = 9085466;
//        D2 = 8569150;
       
        dT = D2 - (uint32_t)C[5] * 256;
        OFF = (int64_t)C[2] * 65536 + (int64_t)C[4] * dT / 128;
  SENS = (int64_t)C[1] * 32768 + (int64_t)C[3] * dT / 256;
       
  TEMP = 2000 + ((int64_t) dT * C[6]) / 8388608;
        //printf("TEMP is :%ld  ",TEMP);
       
        OFF2 = 0;
        SENS2 = 0;
       
        if (TEMP < 2000)
        {
            OFF2 = 5 * ((TEMP - 2000) * (TEMP - 2000)) / 2;
            SENS2 = 5 * ((TEMP - 2000) * (TEMP - 2000)) / 4;
        }

        if (TEMP < -1500)
        {
            OFF2 = OFF2 + 7 * ((TEMP + 1500) * (TEMP + 1500));
            SENS2 = SENS2 + 11 * ((TEMP + 1500) * (TEMP + 1500)) / 2;
        }

        OFF = OFF - OFF2;
        SENS = SENS - SENS2;


  P = (D1 * SENS / 2097152 - OFF) / 32768;
        //printf("P is :%ld \r\n  ",P);
        printf("%ld\r\n",P);
        //altitude = (((pow((P / p1), (-(A * RR) / g))) * T1) - T1) / A;
        //printf("altitude is :%f\r\n",altitude);
        return altitude;
       
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2018-4-14 22:00:36 | 显示全部楼层
问题解决了。原来控制板上面的芯片不是MS5611,而是MS5607。而这两个芯片在算OFF和SENS值的时候,公式是有点区别的。导致询问商家才知道,他们有一批贴片混贴了。 坑爹呀!

出0入0汤圆

发表于 2018-4-14 07:01:03 | 显示全部楼层
1,楼主图片上纵轴坐标单位是什么,是否需要乘以0.012
2,楼主的温度是否读取正确,建议先把温度做好,再看气压
3,楼主的 if (TEMP < 2000)和 if (TEMP < -1500)是否有意为之,因为-2000这个数据会被两个if执行

出0入0汤圆

 楼主| 发表于 2018-4-14 13:33:22 | 显示全部楼层
bj232 发表于 2018-4-14 07:01
1,楼主图片上纵轴坐标单位是什么,是否需要乘以0.012
2,楼主的温度是否读取正确,建议先把温度做好,再看气 ...

1.纵坐标就是算出来的P值。这个数值除以100就是mba单位。
2.这个温度我也感到奇怪。spi总线上挂在了mpu6000,这个芯片正常读取。应该SPI通信也没错。
  计算的公式官网程序copy的。也没问题,那只能是传感器读出来的数据问题了。不知道什么了

出0入0汤圆

发表于 2018-4-14 01:16:00 | 显示全部楼层
估计是计算的过程出错了,建议楼主再仔细检查一下

出0入0汤圆

发表于 2018-4-14 18:58:03 | 显示全部楼层
这个传感器就这样吧,太精确还是别想了

出0入475汤圆

发表于 2018-12-31 12:15:00 | 显示全部楼层
正好我也个东西也出现了类似的两种器件的情况,但是不是不知道,是知道的情况下怎么处理,目前通过配置参数人工选择器件型号,很累还不安全

就是说,有没有人指点一下如何通过软件区分 MS5607还是MS5611这两种器件,因为这两个器件的地址啊什么的完全一样,温度都一样,除了气压算法不一样
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 05:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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