CN0396 (4-Wire Electrochemical Dual Toxic Gas Sensing System)

Dependencies:   AD5270 AD7798 ADT7310

Dependents:   cn0396-helloworld

For additional information check out the mbed page of the Analog Devices wiki: https://wiki.analog.com/resources/tools-software/mbed-drivers-all

CN0396.h

Committer:
adisuciu
Date:
2016-11-08
Revision:
2:8d2d32e76157
Parent:
1:024253f170c3

File content as of revision 2:8d2d32e76157:

#ifndef _CN0396_H_
#define _CN0396_H_
#include <mbed.h>
#include "AD7798.h"
#include "AD5270.h"
#include "ADT7310.h"

/**
 * @brief The CN0396 class
 */
 
class CN0396
{
public:

#define V_REF                1.200    // [V]
#define _2_16                65535.0   // 2^16
#define _2_15                32767.0   // 2^16
#define COMPENSATION_TABLE_SIZE 9

    typedef enum {
        CO_SENSOR,
        H2S_SENSOR
    } sensor_type_t;

    typedef struct {
        int8_t temp;
        float CO_percent;
        float H2S_percent;
    } ppm_compensation_t;

	/**
	 *  @brief compensation look-up table
	 */
    ppm_compensation_t ppm_compensation[COMPENSATION_TABLE_SIZE];

    /**
     * @brief CN0396 class constructor
     * @param csad  - chipselect pin of the ADC
     * @param csrdac - chipselect pin of the RDAC
     * @param cstemp - chipselect pin of the temperature sensor
     */
    CN0396(PinName csad, PinName csrdac, PinName cstemp);
    /**
     * @brief Initializes the board
     */
    void init();

    /**
     * @brief - Reads the sensor and computes the PPM values
     */
    void read();

    /**
     * @brief computes the feedback resistor value for the sensor
     * @param sensitivity - sensor sensitivity
     * @param range - sensor range
     * @return resistor value
     */
    float get_feedback_resistor_value(float sensitivity, float range);

    /**
     * @brief configures the RDACs with the resistance values
     * @param resistance1 - resistance of RDAC1
     * @param resistance2 - resistance of RDAC2
     * @return
     */
    void configure_feedback_resistors(float resistance1, float resistance2);

    /**
    * @brief computes ADC counts-to-voltage in unipolar configuration
    * @param adcValue - value in counts
    * @param voltage - voltage value returned by the method
    * @param gain_adc - the gain of the adc
    */
    void data_to_voltage(uint16_t adcValue, float *voltage, int gain_adc = 1);

    /**
     * @brief computes ADC counts-to-voltage in bipolar configuration
     * @param adcValue - value in counts
     * @param voltage - voltage value returned by the method
     * @param gain_adc - the gain of the adc
     */
    void data_to_voltage_bipolar(uint16_t adcValue, float *voltage, int gain_adc = 1);

    /**
     * @brief compensates ppm value based on temperature reading
     * @param result - ppm value before compensation
     * @param temp - temperature used in compensation
     * @param sensor - sensor id
     * @return compensated value
     */
    float compensate_ppm(float result, float temp, sensor_type_t sensor);
    DigitalOut csad, csrdac, cstemp;
    AD7798 ad;
    AD5270 rdac;
    ADT7310 temp;
    float resistance0, resistance1;
private:


};
#endif