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:
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?

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 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