CN0396 (4-Wire Electrochemical Dual Toxic Gas Sensing System)
Dependencies: AD5270 AD7798 ADT7310
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@0:ef85449aa57f, 2016-11-07 (annotated)
- 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?
User | Revision | Line number | New 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 |