SPL06-001 气压计计算与读取

手册地址 
https://download.csdn.net/download/zhangxuechao_/10548473 
寄存器 
1 
计算方法 
1 
举例

//气压测量速率(sample/sec),Background 模式使用
#define  PM_RATE_1          (0<<4)      //1 measurements pr. sec.
#define  PM_RATE_2          (1<<4)      //2 measurements pr. sec.
#define  PM_RATE_4          (2<<4)      //4 measurements pr. sec.           
#define  PM_RATE_8          (3<<4)      //8 measurements pr. sec.
#define  PM_RATE_16         (4<<4)      //16 measurements pr. sec.
#define  PM_RATE_32         (5<<4)      //32 measurements pr. sec.
#define  PM_RATE_64         (6<<4)      //64 measurements pr. sec.
#define  PM_RATE_128        (7<<4)      //128 measurements pr. sec.

//气压重采样速率(times),Background 模式使用
#define PM_PRC_1            0       //Sigle         kP=524288   ,3.6ms
#define PM_PRC_2            1       //2 times       kP=1572864  ,5.2ms
#define PM_PRC_4            2       //4 times       kP=3670016  ,8.4ms
#define PM_PRC_8            3       //8 times       kP=7864320  ,14.8ms
#define PM_PRC_16           4       //16 times      kP=253952   ,27.6ms
#define PM_PRC_32           5       //32 times      kP=516096   ,53.2ms
#define PM_PRC_64           6       //64 times      kP=1040384  ,104.4ms
#define PM_PRC_128          7       //128 times     kP=2088960  ,206.8ms

//温度测量速率(sample/sec),Background 模式使用
#define  TMP_RATE_1         (0<<4)      //1 measurements pr. sec.
#define  TMP_RATE_2         (1<<4)      //2 measurements pr. sec.
#define  TMP_RATE_4         (2<<4)      //4 measurements pr. sec.           
#define  TMP_RATE_8         (3<<4)      //8 measurements pr. sec.
#define  TMP_RATE_16        (4<<4)      //16 measurements pr. sec.
#define  TMP_RATE_32        (5<<4)      //32 measurements pr. sec.
#define  TMP_RATE_64        (6<<4)      //64 measurements pr. sec.
#define  TMP_RATE_128       (7<<4)      //128 measurements pr. sec.

//温度重采样速率(times),Background 模式使用
#define TMP_PRC_1           0       //Sigle
#define TMP_PRC_2           1       //2 times
#define TMP_PRC_4           2       //4 times
#define TMP_PRC_8           3       //8 times
#define TMP_PRC_16          4       //16 times
#define TMP_PRC_32          5       //32 times
#define TMP_PRC_64          6       //64 times
#define TMP_PRC_128         7       //128 times

//SPL06_MEAS_CFG
#define MEAS_COEF_RDY       0x80
#define MEAS_SENSOR_RDY     0x40        //传感器初始化完成
#define MEAS_TMP_RDY        0x20        //有新的温度数据
#define MEAS_PRS_RDY        0x10        //有新的气压数据

#define MEAS_CTRL_Standby               0x00    //空闲模式
#define MEAS_CTRL_PressMeasure          0x01    //单次气压测量
#define MEAS_CTRL_TempMeasure           0x02    //单次温度测量
#define MEAS_CTRL_ContinuousPress       0x05    //连续气压测量
#define MEAS_CTRL_ContinuousTemp        0x06    //连续温度测量
#define MEAS_CTRL_ContinuousPressTemp   0x07    //连续气压温度测量

//FIFO_STS
#define SPL06_FIFO_FULL     0x02
#define SPL06_FIFO_EMPTY    0x01

//INT_STS
#define SPL06_INT_FIFO_FULL     0x04
#define SPL06_INT_TMP           0x02
#define SPL06_INT_PRS           0x01

//CFG_REG
#define SPL06_CFG_T_SHIFT   0x08    //oversampling times>8时必须使用
#define SPL06_CFG_P_SHIFT   0x04

#define SP06_PSR_B2     0x00        //气压值
#define SP06_PSR_B1     0x01
#define SP06_PSR_B0     0x02
#define SP06_TMP_B2     0x03        //温度值
#define SP06_TMP_B1     0x04
#define SP06_TMP_B0     0x05

#define SP06_PSR_CFG    0x06        //气压测量配置
#define SP06_TMP_CFG    0x07        //温度测量配置
#define SP06_MEAS_CFG   0x08        //测量模式配置

#define SP06_CFG_REG    0x09
#define SP06_INT_STS    0x0A
#define SP06_FIFO_STS   0x0B

#define SP06_RESET      0x0C
#define SP06_ID         0x0D

#define SP06_COEF       0x10        //-0x21
#define SP06_COEF_SRCE  0x28

static float _kT,_kP;
static float _Temp,_Press;

uint8_t spl06_init(void)
{
    uint8_t coef[18];
    uint8_t id;

    if(spl06_write_reg(SP06_RESET,0x89))
    {
        puts("spl06 reset  fail\r\n");
        return 1;
    }

    id = spl06_read_reg(SP06_ID);
    if(id != 0x10)
    {
        puts("sol06 id error !!!\r\n");
    }

    //delay_ms(200);        //复位后系数准备好需要至少40ms

    spl06_read_buffer(SP06_COEF,coef,18);
    _C0 = ((int16_t)coef[0]<<4 ) + ((coef[1]&0xF0)>>4);
    _C0 = (_C0&0x0800)?(0xF000|_C0):_C0;
    _C1 = ((int16_t)(coef[1]&0x0F)<<8 ) + coef[2];
    _C1 = (_C1&0x0800)?(0xF000|_C1):_C1;
    _C00 = ((int32_t)coef[3]<<12 ) + ((uint32_t)coef[4]<<4 ) + (coef[5]>>4);
    _C10 = ((int32_t)(coef[5]&0x0F)<<16 ) + ((uint32_t)coef[6]<<8 ) + coef[7];
    _C00 = (_C00&0x080000)?(0xFFF00000|_C00):_C00;
    _C10 = (_C10&0x080000)?(0xFFF00000|_C10):_C10;
    _C01 = ((int16_t)coef[8]<<8 ) + coef[9];
    _C11 = ((int16_t)coef[10]<<8 ) + coef[11];
    _C11 = (_C11&0x0800)?(0xF000|_C11):_C11;
    _C20 = ((int16_t)coef[12]<<8 ) + coef[13];
    _C20 = (_C20&0x0800)?(0xF000|_C20):_C20;
    _C21 = ((int16_t)coef[14]<<8 ) + coef[15];
    _C21 = (_C21&0x0800)?(0xF000|_C21):_C21;
    _C30 = ((int16_t)coef[16]<<8 ) + coef[17];
    _C30 = (_C30&0x0800)?(0xF000|_C30):_C30;

    spl06_config_pressure(PM_RATE_128,PM_PRC_64);
    spl06_config_temperature(PM_RATE_8,TMP_PRC_8);

    spl06_start(MEAS_CTRL_ContinuousPressTemp); //启动连续的气压温度测量
    delay_ms(20);

    return 0;
}

void spl06_start(uint8_t mode)
{
    spl06_write_reg(SP06_MEAS_CFG, mode);
}

void spl06_config_temperature(uint8_t rate,uint8_t oversampling)
{
    switch(oversampling)
    {
        case TMP_PRC_1:
            _kT = 524288;
            break;
        case TMP_PRC_2:
            _kT = 1572864;
            break;
        case TMP_PRC_4:
            _kT = 3670016;
            break;
        case TMP_PRC_8:
            _kT = 7864320;
            break;
        case TMP_PRC_16:
            _kT = 253952;
            break;
        case TMP_PRC_32:
            _kT = 516096;
            break;
        case TMP_PRC_64:
            _kT = 1040384;
            break;
        case TMP_PRC_128:
            _kT = 2088960;
            break;
    }

    spl06_write_reg(SP06_TMP_CFG,rate|oversampling|0x80);   //温度每秒128次测量一次
    if(oversampling > TMP_PRC_8)
    {
        uint8_t temp = spl06_read_reg(SP06_CFG_REG);
        spl06_write_reg(SP06_CFG_REG,temp|SPL06_CFG_T_SHIFT);
    }
}

void spl06_config_pressure(uint8_t rate,uint8_t oversampling)
{
    switch(oversampling)
    {
        case PM_PRC_1:
            _kP = 524288;
            break;
        case PM_PRC_2:
            _kP = 1572864;
            break;
        case PM_PRC_4:
            _kP = 3670016;
            break;
        case PM_PRC_8:
            _kP = 7864320;
            break;
        case PM_PRC_16:
            _kP = 253952;
            break;
        case PM_PRC_32:
            _kP = 516096;
            break;
        case PM_PRC_64:
            _kP = 1040384;
            break;
        case PM_PRC_128:
            _kP = 2088960;
            break;
    }

    spl06_write_reg(SP06_PSR_CFG,rate|oversampling);
    if(oversampling > PM_PRC_8)
    {
        uint8_t temp = spl06_read_reg(SP06_CFG_REG);
        spl06_write_reg(SP06_CFG_REG,temp|SPL06_CFG_P_SHIFT);
    }
}

int32_t spl06_get_pressure_adc()
{
    uint8_t buf[3];
    int32_t adc;

    spl06_read_buffer(SP06_PSR_B2,buf,3);
    adc = (int32_t)(buf[0]<<16) + (buf[1]<<8) + buf[2];
    adc = (adc&0x800000)?(0xFF000000|adc):adc;

    return adc;
}

int32_t spl06_get_temperature_adc()
{
    uint8_t buf[3];
    int32_t adc;

    spl06_read_buffer(SP06_TMP_B2,buf,3);
    adc = (int32_t)(buf[0]<<16) + (buf[1]<<8) + buf[2];

    return adc;
}

void spl06_update_pressure()
{
    float Traw_src, Praw_src;
    float qua2, qua3;

    Traw_src = _kT * _raw_temp;
    Praw_src = _kP * _raw_press;

    //计算温度
    _Temp = 0.5f*_C0 + Traw_src * _C1;

    //计算气压
    qua2 = _C10 + Praw_src * (_C20 + Praw_src* _C30);
    qua3 = Traw_src * Praw_src * (_C11 + Praw_src * _C21);
    _Press = _C00 + Praw_src * qua2 + Traw_src * _C01 + qua3;
}

void spl06_update()
{
    _raw_temp = spl06_get_temperature_adc();
    _raw_press = spl06_get_pressure_adc();
    spl06_update_pressure();
}

float spl06_get_temperature()
{
    return _Temp;
}

float spl06_get_pressure()
{
    return _Press;
}

uint8_t spi2_write_reg(uint8_t reg_addr,uint8_t reg_val)
{
    spi2_read_write_byte(reg_addr&0x7f);
    spi2_read_write_byte(reg_val);

    return 0;
}

uint8_t spi2_read_reg(uint8_t reg_addr)
{
    spi2_read_write_byte(reg_addr|0x80);
    return spi2_read_write_byte(0xff);
}
uint8_t spi2_read_reg_buffer(uint8_t reg_addr,void *buffer,uint16_t len)
{
    uint8_t *p = buffer;
    uint16_t i;

    spi2_read_write_byte(reg_addr|0x80);
    for(i=0;i<len;i++)
    {
        *p++= spi2_read_write_byte(0xff);
    }

    return 0;
}
### SPL06-001气压计的高度计算方法 SPL06-001 是一款高精度的数字气压传感器,能够测量环境压力并用于推导海拔高度。通过大气压力海拔之间的关系可以实现高度的间接测量。以下是基于该设备进行高度计算的具体说明。 #### 基本原理 高度可以通过以下公式从气压数据中得出: \[ h = \frac{(P_0 / P)^{1/5.257} - 1}{0.0065} \] 其中: - \( h \) 表示高度(单位:米)[^1], - \( P_0 \) 表示海平面标准大气压(通常取值为 1013.25 hPa 或者可以根据具体位置调整)[^2], - \( P \) 表示当前测得的大气压力(单位:hPa),由 SPL06-001 提供的数据转换而来[^3]。 此公式的依据来源于国际标准大气模型中的假设条件以及理想气体定律的应用。 #### Python 实现代码示例 下面是一个简单的 Python 函数来演示如何利用上述公式完成高度计算: ```python def calculate_altitude(pressure, sea_level_pressure=1013.25): """ 使用给定的压力和海平面上的标准气压计算相对高度 参数: pressure (float): 当前实际测量到的大气压力(hPa) sea_level_pressure (float): 海平面处的标准大气压力,默认为1013.25 hPa 返回: float: 对应于输入参数所表示的高度(meters) """ altitude = ((sea_level_pressure / pressure)**(1/5.257) - 1) / 0.0065 return round(altitude, 2) # 示例调用 current_pressure = 980.0 # 替换为你自己的读数 height = calculate_altitude(current_pressure) print(f"Current Altitude is {height} meters.") ``` 以上函数 `calculate_altitude` 接受两个参数——实时气压值和可选的海平面气压值,并返回对应的高度数值。 #### 考虑温度影响的因素 需要注意的是,在某些情况下可能还需要考虑气温的影响以提高精确度。如果已知绝对零度以上的摄氏温差 T,则修正后的方程如下所示: \[ h = \left(\left[\frac{T_{base}}{T}\right]\cdot(P_0/P)\right)^{\frac{1}{k}}-\textit{offset} \] 这里 k 取决于具体的地理区域特性常量;而 offset 则取决于初始设定点的位置偏差校准情况[^4]。 #### 数据采集注意事项 为了获得更准确的结果,请确保 SPL06-001 的工作状态良好并且远离热源干扰等因素造成的误差来源。此外还应该定期重新标定其内部寄存器设置以便适应不同应用场景下的需求变化。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值