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@2:8d2d32e76157, 2016-11-08 (annotated)
- Committer:
- adisuciu
- Date:
- Tue Nov 08 09:51:15 2016 +0000
- Revision:
- 2:8d2d32e76157
- Parent:
- 1:024253f170c3
Fix for mbed online compiler (array initialization not allowed within class declaration)
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 | 1:024253f170c3 | 11 | |
adisuciu | 0:ef85449aa57f | 12 | class CN0396 |
adisuciu | 0:ef85449aa57f | 13 | { |
adisuciu | 0:ef85449aa57f | 14 | public: |
adisuciu | 0:ef85449aa57f | 15 | |
adisuciu | 0:ef85449aa57f | 16 | #define V_REF 1.200 // [V] |
adisuciu | 0:ef85449aa57f | 17 | #define _2_16 65535.0 // 2^16 |
adisuciu | 0:ef85449aa57f | 18 | #define _2_15 32767.0 // 2^16 |
adisuciu | 0:ef85449aa57f | 19 | #define COMPENSATION_TABLE_SIZE 9 |
adisuciu | 0:ef85449aa57f | 20 | |
adisuciu | 0:ef85449aa57f | 21 | typedef enum { |
adisuciu | 0:ef85449aa57f | 22 | CO_SENSOR, |
adisuciu | 0:ef85449aa57f | 23 | H2S_SENSOR |
adisuciu | 0:ef85449aa57f | 24 | } sensor_type_t; |
adisuciu | 0:ef85449aa57f | 25 | |
adisuciu | 0:ef85449aa57f | 26 | typedef struct { |
adisuciu | 0:ef85449aa57f | 27 | int8_t temp; |
adisuciu | 0:ef85449aa57f | 28 | float CO_percent; |
adisuciu | 0:ef85449aa57f | 29 | float H2S_percent; |
adisuciu | 0:ef85449aa57f | 30 | } ppm_compensation_t; |
adisuciu | 0:ef85449aa57f | 31 | |
adisuciu | 0:ef85449aa57f | 32 | /** |
adisuciu | 0:ef85449aa57f | 33 | * @brief compensation look-up table |
adisuciu | 0:ef85449aa57f | 34 | */ |
adisuciu | 1:024253f170c3 | 35 | ppm_compensation_t ppm_compensation[COMPENSATION_TABLE_SIZE]; |
adisuciu | 0:ef85449aa57f | 36 | |
adisuciu | 0:ef85449aa57f | 37 | /** |
adisuciu | 0:ef85449aa57f | 38 | * @brief CN0396 class constructor |
adisuciu | 0:ef85449aa57f | 39 | * @param csad - chipselect pin of the ADC |
adisuciu | 0:ef85449aa57f | 40 | * @param csrdac - chipselect pin of the RDAC |
adisuciu | 0:ef85449aa57f | 41 | * @param cstemp - chipselect pin of the temperature sensor |
adisuciu | 0:ef85449aa57f | 42 | */ |
adisuciu | 0:ef85449aa57f | 43 | CN0396(PinName csad, PinName csrdac, PinName cstemp); |
adisuciu | 0:ef85449aa57f | 44 | /** |
adisuciu | 0:ef85449aa57f | 45 | * @brief Initializes the board |
adisuciu | 0:ef85449aa57f | 46 | */ |
adisuciu | 0:ef85449aa57f | 47 | void init(); |
adisuciu | 0:ef85449aa57f | 48 | |
adisuciu | 0:ef85449aa57f | 49 | /** |
adisuciu | 0:ef85449aa57f | 50 | * @brief - Reads the sensor and computes the PPM values |
adisuciu | 0:ef85449aa57f | 51 | */ |
adisuciu | 0:ef85449aa57f | 52 | void read(); |
adisuciu | 0:ef85449aa57f | 53 | |
adisuciu | 0:ef85449aa57f | 54 | /** |
adisuciu | 0:ef85449aa57f | 55 | * @brief computes the feedback resistor value for the sensor |
adisuciu | 0:ef85449aa57f | 56 | * @param sensitivity - sensor sensitivity |
adisuciu | 0:ef85449aa57f | 57 | * @param range - sensor range |
adisuciu | 0:ef85449aa57f | 58 | * @return resistor value |
adisuciu | 0:ef85449aa57f | 59 | */ |
adisuciu | 0:ef85449aa57f | 60 | float get_feedback_resistor_value(float sensitivity, float range); |
adisuciu | 0:ef85449aa57f | 61 | |
adisuciu | 0:ef85449aa57f | 62 | /** |
adisuciu | 0:ef85449aa57f | 63 | * @brief configures the RDACs with the resistance values |
adisuciu | 0:ef85449aa57f | 64 | * @param resistance1 - resistance of RDAC1 |
adisuciu | 0:ef85449aa57f | 65 | * @param resistance2 - resistance of RDAC2 |
adisuciu | 0:ef85449aa57f | 66 | * @return |
adisuciu | 0:ef85449aa57f | 67 | */ |
adisuciu | 0:ef85449aa57f | 68 | void configure_feedback_resistors(float resistance1, float resistance2); |
adisuciu | 0:ef85449aa57f | 69 | |
adisuciu | 0:ef85449aa57f | 70 | /** |
adisuciu | 0:ef85449aa57f | 71 | * @brief computes ADC counts-to-voltage in unipolar configuration |
adisuciu | 0:ef85449aa57f | 72 | * @param adcValue - value in counts |
adisuciu | 0:ef85449aa57f | 73 | * @param voltage - voltage value returned by the method |
adisuciu | 0:ef85449aa57f | 74 | * @param gain_adc - the gain of the adc |
adisuciu | 0:ef85449aa57f | 75 | */ |
adisuciu | 0:ef85449aa57f | 76 | void data_to_voltage(uint16_t adcValue, float *voltage, int gain_adc = 1); |
adisuciu | 0:ef85449aa57f | 77 | |
adisuciu | 0:ef85449aa57f | 78 | /** |
adisuciu | 0:ef85449aa57f | 79 | * @brief computes ADC counts-to-voltage in bipolar configuration |
adisuciu | 0:ef85449aa57f | 80 | * @param adcValue - value in counts |
adisuciu | 0:ef85449aa57f | 81 | * @param voltage - voltage value returned by the method |
adisuciu | 0:ef85449aa57f | 82 | * @param gain_adc - the gain of the adc |
adisuciu | 0:ef85449aa57f | 83 | */ |
adisuciu | 0:ef85449aa57f | 84 | void data_to_voltage_bipolar(uint16_t adcValue, float *voltage, int gain_adc = 1); |
adisuciu | 0:ef85449aa57f | 85 | |
adisuciu | 0:ef85449aa57f | 86 | /** |
adisuciu | 0:ef85449aa57f | 87 | * @brief compensates ppm value based on temperature reading |
adisuciu | 0:ef85449aa57f | 88 | * @param result - ppm value before compensation |
adisuciu | 0:ef85449aa57f | 89 | * @param temp - temperature used in compensation |
adisuciu | 0:ef85449aa57f | 90 | * @param sensor - sensor id |
adisuciu | 0:ef85449aa57f | 91 | * @return compensated value |
adisuciu | 0:ef85449aa57f | 92 | */ |
adisuciu | 0:ef85449aa57f | 93 | float compensate_ppm(float result, float temp, sensor_type_t sensor); |
adisuciu | 0:ef85449aa57f | 94 | DigitalOut csad, csrdac, cstemp; |
adisuciu | 0:ef85449aa57f | 95 | AD7798 ad; |
adisuciu | 0:ef85449aa57f | 96 | AD5270 rdac; |
adisuciu | 0:ef85449aa57f | 97 | ADT7310 temp; |
adisuciu | 0:ef85449aa57f | 98 | float resistance0, resistance1; |
adisuciu | 0:ef85449aa57f | 99 | private: |
adisuciu | 0:ef85449aa57f | 100 | |
adisuciu | 0:ef85449aa57f | 101 | |
adisuciu | 0:ef85449aa57f | 102 | }; |
adisuciu | 0:ef85449aa57f | 103 | #endif |