12-Bit, 8-Channel, ADC System Monitor w/ Temp Sensor, Internal/External Reference, & I2C Interface

Dependents:   ADC128D818_HelloWorld

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ADC128D818.h Source File

ADC128D818.h

00001 /**
00002  * @brief ADC128D818 12-Bit, 8-Channel, ADC System Monitor w/ Temp Sensor, Internal/External Reference, & I2C Interfac
00003  * http://www.ti.com/product/adc128d818/
00004  * @date 02/09/2013
00005  * @author F.BLANC LAAS-CNRS
00006  * http://homepages.laas.fr/fblanc/
00007  */
00008 
00009 #ifndef ADC128D818_H
00010 
00011 #define ADC128D818_H
00012 
00013 #include "mbed.h"
00014 
00015 
00016 //Library for the ADC128D818 12 BIT ADC.
00017 enum ADC_MODE {
00018     ADC_MODE_0 = 0x00,
00019     ADC_MODE_1 = 0x01,
00020     ADC_MODE_2 = 0x02,
00021     ADC_MODE_3 = 0x03
00022 };
00023 enum ADC_ADDRESS {
00024     ADC_ADDRESS_LOW_LOW = 0x1D,
00025     ADC_ADDRESS_LOW_MID = 0x1E,
00026     ADC_ADDRESS_LOW_HIGH = 0x1F,
00027     ADC_ADDRESS_MID_LOW = 0x2D,
00028     ADC_ADDRESS_MID_MID = 0x2E,
00029     ADC_ADDRESS_MID_HIGH = 0x2F,
00030     ADC_ADDRESS_HIGH_LOW = 0x35,
00031     ADC_ADDRESS_HIGH_MID = 0x36,
00032     ADC_ADDRESS_HIGH_HIGH = 0x37
00033 };
00034 enum ADC_VREF {
00035     ADC_VREF_INT = 0x00,
00036     ADC_VREF_EXT = 0x01
00037 };
00038 enum ADC_RATE {
00039     ADC_RATE_LOW_POWER = 0x00,
00040     ADC_RATE_CONTINUOUS = 0x01
00041 };
00042 enum ADC_LIMIT {
00043     ADC_LIMIT_HIGH = 0x00,
00044     ADC_LIMIT_LOW = 0x01
00045 };
00046 enum ADC_CHANNEL {
00047     ADC_CHANNEL_IN0 = 0x00,
00048     ADC_CHANNEL_IN1 = 0x01,
00049     ADC_CHANNEL_IN2 = 0x02,
00050     ADC_CHANNEL_IN3 = 0x03,
00051     ADC_CHANNEL_IN4 = 0x04,
00052     ADC_CHANNEL_IN5 = 0x05,
00053     ADC_CHANNEL_IN6 = 0x06,
00054     ADC_CHANNEL_IN7 = 0x07,
00055     ADC_CHANNEL_TEMP = 0x07
00056 };
00057 enum ADC_INT {
00058 
00059     ADC_INT_IN0 = (char)~(0x01 <<0),
00060     ADC_INT_IN1 = (char)~(0x01 <<1),
00061     ADC_INT_IN2 = (char)~(0x01 <<2),
00062     ADC_INT_IN3 = (char)~(0x01 <<3),
00063     ADC_INT_IN4 = (char)~(0x01 <<4),
00064     ADC_INT_IN5 = (char)~(0x01 <<5),
00065     ADC_INT_IN6 = (char)~(0x01 <<6),
00066     ADC_INT_IN7 = (char)~(0x01 <<7),
00067     ADC_INT_TEMP = (char)~(0x01 <<7),
00068     ADC_INT_ALL = 0x00
00069 };
00070 enum ADC_ENABLE {
00071 
00072     ADC_ENABLE_IN0 = (char)~(0x01 <<0),
00073     ADC_ENABLE_IN1 = (char)~(0x01 <<1),
00074     ADC_ENABLE_IN2 = (char)~(0x01 <<2),
00075     ADC_ENABLE_IN3 = (char)~(0x01 <<3),
00076     ADC_ENABLE_IN4 = (char)~(0x01 <<4),
00077     ADC_ENABLE_IN5 = (char)~(0x01 <<5),
00078     ADC_ENABLE_IN6 = (char)~(0x01 <<6),
00079     ADC_ENABLE_IN7 = (char)~(0x01 <<7),
00080     ADC_ENABLE_TEMP = ~(0x01 <<7),
00081     ADC_ENABLE_ALL = 0x00
00082 };
00083 enum ADC_REG {
00084     ADC_REG_Configuration_Register  = 0x00,
00085     ADC_REG_Interrupt_Status_Register = 0x01,
00086     ADC_REG_Interrupt_Mask_Register = 0x03,
00087     ADC_REG_Conversion_Rate_Register = 0x07,
00088     ADC_REG_Channel_Disable_Register = 0x08,
00089     ADC_REG_One_Shot_Register = 0x09,
00090     ADC_REG_Deep_Shutdown_Register = 0x0A,
00091     ADC_REG_Advanced_Configuration_Register = 0x0B,
00092     ADC_REG_Busy_Status_Register = 0x0C,
00093     ADC_REG_Channel_Readings_Registers = 0x20,
00094     ADC_REG_Limit_Registers = 0x2A,
00095     ADC_REG_Manufacturer_ID_Register = 0x3E,
00096     ADC_REG_Revision_ID_Register = 0x3F
00097 };
00098 /** ADC128D818 class.
00099  *  Used for controlling a ADC128D818 adc connected via I2C.
00100  *
00101  * Example:
00102  * @code
00103  * #include "mbed.h"
00104  * #include "ADC128D818.h"
00105  * Serial pc(USBTX, USBRX);
00106  * ADC128D818 adc(p9,p10,p26);
00107  * AnalogOut dac(p18);
00108  * int main()
00109  * {
00110  * dac=0.5;
00111  *     printf("helloword_ADC128D818\r\n");
00112  *     wait_ms(100);
00113  *     int err=adc.init(ADC_ADDRESS_LOW_LOW, ADC_MODE_0, ADC_VREF_INT, ADC_RATE_CONTINUOUS, ADC_ENABLE_TEMP & ADC_ENABLE_IN1, ADC_INT_TEMP);
00114  *    switch (err) {
00115  *        case -1:
00116  *            printf("No Device\r\n");
00117  *            break;
00118  *        case -2:
00119  *             printf("Busy\r\n");
00120  *             break;
00121  *     }
00122  *     adc.init_limit(ADC_CHANNEL_IN0, 0x80, ADC_LIMIT_HIGH);
00123  *     adc.init_limit(ADC_CHANNEL_IN1, 0xA6, ADC_LIMIT_HIGH);
00124  *     adc.init_limit(ADC_CHANNEL_IN2, 0x80, ADC_LIMIT_HIGH);
00125  *     adc.init_limit(ADC_CHANNEL_IN3, 0x80, ADC_LIMIT_HIGH);
00126  *     adc.init_limit(ADC_CHANNEL_IN4, 0x80, ADC_LIMIT_HIGH);
00127  *    adc.init_limit(ADC_CHANNEL_IN5, 0x80, ADC_LIMIT_HIGH);
00128  *    adc.init_limit(ADC_CHANNEL_IN6, 0x80, ADC_LIMIT_HIGH);
00129  *    adc.init_limit(ADC_CHANNEL_TEMP, 30, ADC_LIMIT_HIGH);
00130  *    adc.init_limit(ADC_CHANNEL_TEMP, 29, ADC_LIMIT_LOW);
00131  *    char reg;
00132  *     reg=ADC_REG_Advanced_Configuration_Register;
00133  *     printf("reg %02X=%02X\r\n",reg,adc.read_register(reg));
00134  *     printf("reg %02X=%02X\r\n",0x2C,adc.read_channel(0x0C));
00135  *    adc.start();
00136  *    for(int i=0; i<1000; ++i) {
00137  *      wait(1);
00138  *      printf("ch0:%d : %d\r\n",i,adc.read_channel(ADC_CHANNEL_IN0));
00139  *       for( char c=1; c<7 ;++c)
00140  *       printf("ch%d:%d : %04X\r\n",c,i,adc.read_channel(c));
00141  *
00142  *       printf("temp:%d : %f\r\n",i,(adc.read_channel(ADC_CHANNEL_TEMP)>>7)/2.0);
00143  *        reg=0x01;
00144  *    printf("reg %02X=%02X\r\n",reg,adc.read_register(reg));
00145  *     }
00146  * }
00147  * @endcode
00148  */
00149 class ADC128D818
00150 {
00151 protected:
00152 
00153 
00154     enum Configuration_Register {
00155         Configuration_Register_Start = 1<<0,
00156         Configuration_Register_INT_Enable = 1<<1,
00157         Configuration_Register_INT_Clear = 1<<3,
00158         Configuration_Register_Initialization = 1<<7
00159     };
00160 
00161     enum Busy_Status_Register {
00162         Busy_Status_Register_Busy = 1<<0,
00163         Busy_Status_Register_Not_Ready = 1<<1
00164     };
00165 
00166     enum Advanced_Configuration_Register {
00167         Advanced_Configuration_Register_External_Reference_Enable = 1<<0,
00168         Advanced_Configuration_Register_Mode_Select_0 = 1<<1,
00169         Advanced_Configuration_Register_Mode_Select_1 = 1<<2
00170     };
00171 
00172     enum Conversion_Rate_Register {
00173         Conversion_Rate_Register_Rate_Register = 1<<0
00174     };
00175 
00176 
00177 private:
00178     I2C _i2c;
00179     char _data[2];
00180     char _address;
00181     char _mode;
00182 
00183 public:
00184     /**
00185      * @brief Constructor.
00186      *
00187      * @param sda I2C
00188      * @param scl I2C
00189      * @param adc_int
00190      */
00191     ADC128D818(PinName sda, PinName scl, PinName adc_int );
00192     /**
00193     * @brief Destructor.
00194     */
00195     ~ADC128D818();
00196 
00197     InterruptIn _Adc_Int;
00198     /**
00199     * @brief read_channel
00200     * @param channel
00201     * @return u32_data
00202     * @date 02/09/2013
00203     */
00204     int read_channel(char channel);
00205     /**
00206     * @brief read_register
00207     * @param Register
00208     * @return u8_data
00209     * @date 02/09/2013
00210     */
00211     char read_register(char Register);
00212     /**
00213     * @brief init
00214     *
00215     * @param address I2C (7bits)
00216         ADC_ADDRESS_LOW_LOW
00217         ADC_ADDRESS_LOW_MID
00218         ADC_ADDRESS_LOW_HIGH
00219         ADC_ADDRESS_MID_LOW
00220         ADC_ADDRESS_MID_MID
00221         ADC_ADDRESS_MID_HIGH
00222         ADC_ADDRESS_HIGH_LOW
00223         ADC_ADDRESS_HIGH_MID
00224         ADC_ADDRESS_HIGH_HIGH
00225     * @param mode :
00226         ADC_MODE_0
00227         ADC_MODE_1
00228         ADC_MODE_2
00229         ADC_MODE_3
00230     * @param vref
00231         ADC_VREF_INT
00232         ADC_VREF_EXT
00233     * @param rate
00234         ADC_RATE_LOW_POWER
00235         ADC_RATE_CONTINUOUS
00236     * @param mask_channel
00237     * @param mask_int
00238     * @return error 0 OK, -1 NO DEVICE, -2 ADC is BUSY
00239     * @date 02/09/2013
00240     */
00241     int init(char address, char mode, char vref, char rate, char mask_channel, char mask_int);
00242     /**
00243     * @brief init_limit
00244     *
00245     * @param limit
00246     * @param high_low
00247         ADC_LIMIT_HIGH
00248         ADC_LIMIT_LOW
00249     * @return error 0 OK
00250     * @date 02/09/2013
00251     */
00252     int init_limit(char channel, char limit, char high_low);
00253     /**
00254     * @brief start
00255     * @date 02/09/2013
00256     */
00257     void start();
00258     /**
00259     * @brief stop
00260     * @date 02/09/2013
00261     */
00262     void stop();
00263 };
00264 
00265 #endif
00266