altb_pmic / HP206C

Dependents:   Grove-Barometric_Pressure_Sensor_Example

HP206C.h

Committer:
pmic
Date:
2019-06-26
Revision:
6:470f31efa042
Parent:
4:a2b79f08ad14

File content as of revision 6:470f31efa042:

// source: https://os.mbed.com/users/ElectronicsSanta/code/HP206C_barometer/file/0a071ea90726/main.cpp/

#ifndef _HP206C
#define _HP206C

#include "mbed.h"

#define I2C_BAROMETER_ADDRESS 0x76 << 1 // 0xEC, device adress

#define HP20X_SOFT_RST        0x06 // for initializing, takes longer than next
#define HP20X_ANA_CAL         0x28 // recalibrate analog internal circuitries, for unstable environment

#define HP20X_WR_CONVERT_CMD  0x40

#define HP20X_READ_PT         0x10 // read pressure and altitude command
#define HP20X_READ_A          0x31 // read altitude command

#define HP20X_WR_REG_MODE     0xC0
#define HP20X_RD_REG_MODE     0x80

#define HP20X_OK_DEV          0X80 // successfully initialized
#define HP20X_REG_PARA        0X0F // status register

#define HP20X_CONVERT_OSR4096 0 << 2
#define HP20X_CONVERT_OSR2048 1 << 2
#define HP20X_CONVERT_OSR1024 2 << 2
#define HP20X_CONVERT_OSR512  3 << 2
#define HP20X_CONVERT_OSR256  4 << 2
#define HP20X_CONVERT_OSR128  5 << 2
/* 
    ADC is parametrizised through OSR_CFG 
        HP20X_CONVERT_OSR128  -> OSR_ConvertTime =   5; //   4.1 ms -> ~200 Hz for control loop
        HP20X_CONVERT_OSR256  -> OSR_ConvertTime =   9; //   8.2 ms -> ~100 Hz
        HP20X_CONVERT_OSR512  -> OSR_ConvertTime =  17; //  16.4 ms -> ~ 50 Hz
        HP20X_CONVERT_OSR1024 -> OSR_ConvertTime =  34; //  32.8 ms -> ~ 20 Hz
        HP20X_CONVERT_OSR2048 -> OSR_ConvertTime =  67; //  65.6 ms -> ~ 10 Hz
        HP20X_CONVERT_OSR4096 -> OSR_ConvertTime = 132; // 131.1 ms -> ~  5 Hz
*/
#define OSR_CFG HP20X_CONVERT_OSR1024

class HP206C
{
public:

    HP206C(PinName p_sda, PinName p_scl);
    
    float operator()() {
        return readAltitude();
    }
    
    virtual ~HP206C();
    
    void     reset();
    float    readAltitude();

private:

    I2C i2c;

    float         altitude;
    bool          baro_found;
    uint8_t       OSR_ConvertTime; 
    
    void          setConversionTime();
    unsigned char readRegister(unsigned char reg);
    void          writeRegister(unsigned char reg, unsigned char data);
    void          enableCompensation();
    void          disableCompensation();
    void          softReset();
    void          recalibrate();
    uint32_t      readData3Bytes();
    void          readTemperatureAndPressure();
    void          updateAltitude();

};

#endif