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

Committer:
adisuciu
Date:
Mon Nov 07 15:56:24 2016 +0000
Revision:
0:ef85449aa57f
Child:
1:024253f170c3
Initial revision

Who changed what in which revision?

UserRevisionLine numberNew contents of line
adisuciu 0:ef85449aa57f 1 #ifndef _CN0396_H_
adisuciu 0:ef85449aa57f 2 #define _CN0396_H_
adisuciu 0:ef85449aa57f 3 #include <mbed.h>
adisuciu 0:ef85449aa57f 4 #include "AD7798.h"
adisuciu 0:ef85449aa57f 5 #include "AD5270.h"
adisuciu 0:ef85449aa57f 6 #include "ADT7310.h"
adisuciu 0:ef85449aa57f 7
adisuciu 0:ef85449aa57f 8 /**
adisuciu 0:ef85449aa57f 9 * @brief The CN0396 class
adisuciu 0:ef85449aa57f 10 */
adisuciu 0:ef85449aa57f 11 class CN0396
adisuciu 0:ef85449aa57f 12 {
adisuciu 0:ef85449aa57f 13 public:
adisuciu 0:ef85449aa57f 14
adisuciu 0:ef85449aa57f 15 #define V_REF 1.200 // [V]
adisuciu 0:ef85449aa57f 16 #define _2_16 65535.0 // 2^16
adisuciu 0:ef85449aa57f 17 #define _2_15 32767.0 // 2^16
adisuciu 0:ef85449aa57f 18 #define COMPENSATION_TABLE_SIZE 9
adisuciu 0:ef85449aa57f 19
adisuciu 0:ef85449aa57f 20 typedef enum {
adisuciu 0:ef85449aa57f 21 CO_SENSOR,
adisuciu 0:ef85449aa57f 22 H2S_SENSOR
adisuciu 0:ef85449aa57f 23 } sensor_type_t;
adisuciu 0:ef85449aa57f 24
adisuciu 0:ef85449aa57f 25 typedef struct {
adisuciu 0:ef85449aa57f 26 int8_t temp;
adisuciu 0:ef85449aa57f 27 float CO_percent;
adisuciu 0:ef85449aa57f 28 float H2S_percent;
adisuciu 0:ef85449aa57f 29 } ppm_compensation_t;
adisuciu 0:ef85449aa57f 30
adisuciu 0:ef85449aa57f 31 /**
adisuciu 0:ef85449aa57f 32 * @brief compensation look-up table
adisuciu 0:ef85449aa57f 33 */
adisuciu 0:ef85449aa57f 34 const ppm_compensation_t ppm_compensation[COMPENSATION_TABLE_SIZE] = {
adisuciu 0:ef85449aa57f 35 { -30 , 29.9 , 82.3 },
adisuciu 0:ef85449aa57f 36 { -20 , 38.8 , 84.6 },
adisuciu 0:ef85449aa57f 37 { -10 , 53.7 , 88.6 },
adisuciu 0:ef85449aa57f 38 {0 , 69.6 , 92.2 },
adisuciu 0:ef85449aa57f 39 {10 , 84.9 , 96.2 },
adisuciu 0:ef85449aa57f 40 {20 , 100.0 , 100.0},
adisuciu 0:ef85449aa57f 41 {30 , 112.7 , 103.1},
adisuciu 0:ef85449aa57f 42 {40 , 123.7 , 105.6},
adisuciu 0:ef85449aa57f 43 {50 , 133.1 , 107.4}
adisuciu 0:ef85449aa57f 44 };
adisuciu 0:ef85449aa57f 45
adisuciu 0:ef85449aa57f 46
adisuciu 0:ef85449aa57f 47 /**
adisuciu 0:ef85449aa57f 48 * @brief CN0396 class constructor
adisuciu 0:ef85449aa57f 49 * @param csad - chipselect pin of the ADC
adisuciu 0:ef85449aa57f 50 * @param csrdac - chipselect pin of the RDAC
adisuciu 0:ef85449aa57f 51 * @param cstemp - chipselect pin of the temperature sensor
adisuciu 0:ef85449aa57f 52 */
adisuciu 0:ef85449aa57f 53 CN0396(PinName csad, PinName csrdac, PinName cstemp);
adisuciu 0:ef85449aa57f 54 /**
adisuciu 0:ef85449aa57f 55 * @brief Initializes the board
adisuciu 0:ef85449aa57f 56 */
adisuciu 0:ef85449aa57f 57 void init();
adisuciu 0:ef85449aa57f 58
adisuciu 0:ef85449aa57f 59 /**
adisuciu 0:ef85449aa57f 60 * @brief - Reads the sensor and computes the PPM values
adisuciu 0:ef85449aa57f 61 */
adisuciu 0:ef85449aa57f 62 void read();
adisuciu 0:ef85449aa57f 63
adisuciu 0:ef85449aa57f 64 /**
adisuciu 0:ef85449aa57f 65 * @brief computes the feedback resistor value for the sensor
adisuciu 0:ef85449aa57f 66 * @param sensitivity - sensor sensitivity
adisuciu 0:ef85449aa57f 67 * @param range - sensor range
adisuciu 0:ef85449aa57f 68 * @return resistor value
adisuciu 0:ef85449aa57f 69 */
adisuciu 0:ef85449aa57f 70 float get_feedback_resistor_value(float sensitivity, float range);
adisuciu 0:ef85449aa57f 71
adisuciu 0:ef85449aa57f 72 /**
adisuciu 0:ef85449aa57f 73 * @brief configures the RDACs with the resistance values
adisuciu 0:ef85449aa57f 74 * @param resistance1 - resistance of RDAC1
adisuciu 0:ef85449aa57f 75 * @param resistance2 - resistance of RDAC2
adisuciu 0:ef85449aa57f 76 * @return
adisuciu 0:ef85449aa57f 77 */
adisuciu 0:ef85449aa57f 78 void configure_feedback_resistors(float resistance1, float resistance2);
adisuciu 0:ef85449aa57f 79
adisuciu 0:ef85449aa57f 80 /**
adisuciu 0:ef85449aa57f 81 * @brief computes ADC counts-to-voltage in unipolar configuration
adisuciu 0:ef85449aa57f 82 * @param adcValue - value in counts
adisuciu 0:ef85449aa57f 83 * @param voltage - voltage value returned by the method
adisuciu 0:ef85449aa57f 84 * @param gain_adc - the gain of the adc
adisuciu 0:ef85449aa57f 85 */
adisuciu 0:ef85449aa57f 86 void data_to_voltage(uint16_t adcValue, float *voltage, int gain_adc = 1);
adisuciu 0:ef85449aa57f 87
adisuciu 0:ef85449aa57f 88 /**
adisuciu 0:ef85449aa57f 89 * @brief computes ADC counts-to-voltage in bipolar configuration
adisuciu 0:ef85449aa57f 90 * @param adcValue - value in counts
adisuciu 0:ef85449aa57f 91 * @param voltage - voltage value returned by the method
adisuciu 0:ef85449aa57f 92 * @param gain_adc - the gain of the adc
adisuciu 0:ef85449aa57f 93 */
adisuciu 0:ef85449aa57f 94 void data_to_voltage_bipolar(uint16_t adcValue, float *voltage, int gain_adc = 1);
adisuciu 0:ef85449aa57f 95
adisuciu 0:ef85449aa57f 96 /**
adisuciu 0:ef85449aa57f 97 * @brief compensates ppm value based on temperature reading
adisuciu 0:ef85449aa57f 98 * @param result - ppm value before compensation
adisuciu 0:ef85449aa57f 99 * @param temp - temperature used in compensation
adisuciu 0:ef85449aa57f 100 * @param sensor - sensor id
adisuciu 0:ef85449aa57f 101 * @return compensated value
adisuciu 0:ef85449aa57f 102 */
adisuciu 0:ef85449aa57f 103 float compensate_ppm(float result, float temp, sensor_type_t sensor);
adisuciu 0:ef85449aa57f 104 DigitalOut csad, csrdac, cstemp;
adisuciu 0:ef85449aa57f 105 AD7798 ad;
adisuciu 0:ef85449aa57f 106 AD5270 rdac;
adisuciu 0:ef85449aa57f 107 ADT7310 temp;
adisuciu 0:ef85449aa57f 108 float resistance0, resistance1;
adisuciu 0:ef85449aa57f 109 private:
adisuciu 0:ef85449aa57f 110
adisuciu 0:ef85449aa57f 111
adisuciu 0:ef85449aa57f 112 };
adisuciu 0:ef85449aa57f 113 #endif