12-Bit, 8-Channel, ADC System Monitor w/ Temp Sensor, Internal/External Reference, & I2C Interface
Dependents: ADC128D818_HelloWorld
ADC128D818.h
- Committer:
- fblanc
- Date:
- 2013-09-06
- Revision:
- 3:816284ff2a09
- Parent:
- 2:f9a0518b352a
File content as of revision 3:816284ff2a09:
/** * @brief ADC128D818 12-Bit, 8-Channel, ADC System Monitor w/ Temp Sensor, Internal/External Reference, & I2C Interfac * http://www.ti.com/product/adc128d818/ * @date 02/09/2013 * @author F.BLANC LAAS-CNRS * http://homepages.laas.fr/fblanc/ */ #ifndef ADC128D818_H #define ADC128D818_H #include "mbed.h" //Library for the ADC128D818 12 BIT ADC. enum ADC_MODE { ADC_MODE_0 = 0x00, ADC_MODE_1 = 0x01, ADC_MODE_2 = 0x02, ADC_MODE_3 = 0x03 }; enum ADC_ADDRESS { ADC_ADDRESS_LOW_LOW = 0x1D, ADC_ADDRESS_LOW_MID = 0x1E, ADC_ADDRESS_LOW_HIGH = 0x1F, ADC_ADDRESS_MID_LOW = 0x2D, ADC_ADDRESS_MID_MID = 0x2E, ADC_ADDRESS_MID_HIGH = 0x2F, ADC_ADDRESS_HIGH_LOW = 0x35, ADC_ADDRESS_HIGH_MID = 0x36, ADC_ADDRESS_HIGH_HIGH = 0x37 }; enum ADC_VREF { ADC_VREF_INT = 0x00, ADC_VREF_EXT = 0x01 }; enum ADC_RATE { ADC_RATE_LOW_POWER = 0x00, ADC_RATE_CONTINUOUS = 0x01 }; enum ADC_LIMIT { ADC_LIMIT_HIGH = 0x00, ADC_LIMIT_LOW = 0x01 }; enum ADC_CHANNEL { ADC_CHANNEL_IN0 = 0x00, ADC_CHANNEL_IN1 = 0x01, ADC_CHANNEL_IN2 = 0x02, ADC_CHANNEL_IN3 = 0x03, ADC_CHANNEL_IN4 = 0x04, ADC_CHANNEL_IN5 = 0x05, ADC_CHANNEL_IN6 = 0x06, ADC_CHANNEL_IN7 = 0x07, ADC_CHANNEL_TEMP = 0x07 }; enum ADC_INT { ADC_INT_IN0 = (char)~(0x01 <<0), ADC_INT_IN1 = (char)~(0x01 <<1), ADC_INT_IN2 = (char)~(0x01 <<2), ADC_INT_IN3 = (char)~(0x01 <<3), ADC_INT_IN4 = (char)~(0x01 <<4), ADC_INT_IN5 = (char)~(0x01 <<5), ADC_INT_IN6 = (char)~(0x01 <<6), ADC_INT_IN7 = (char)~(0x01 <<7), ADC_INT_TEMP = (char)~(0x01 <<7), ADC_INT_ALL = 0x00 }; enum ADC_ENABLE { ADC_ENABLE_IN0 = (char)~(0x01 <<0), ADC_ENABLE_IN1 = (char)~(0x01 <<1), ADC_ENABLE_IN2 = (char)~(0x01 <<2), ADC_ENABLE_IN3 = (char)~(0x01 <<3), ADC_ENABLE_IN4 = (char)~(0x01 <<4), ADC_ENABLE_IN5 = (char)~(0x01 <<5), ADC_ENABLE_IN6 = (char)~(0x01 <<6), ADC_ENABLE_IN7 = (char)~(0x01 <<7), ADC_ENABLE_TEMP = ~(0x01 <<7), ADC_ENABLE_ALL = 0x00 }; enum ADC_REG { ADC_REG_Configuration_Register = 0x00, ADC_REG_Interrupt_Status_Register = 0x01, ADC_REG_Interrupt_Mask_Register = 0x03, ADC_REG_Conversion_Rate_Register = 0x07, ADC_REG_Channel_Disable_Register = 0x08, ADC_REG_One_Shot_Register = 0x09, ADC_REG_Deep_Shutdown_Register = 0x0A, ADC_REG_Advanced_Configuration_Register = 0x0B, ADC_REG_Busy_Status_Register = 0x0C, ADC_REG_Channel_Readings_Registers = 0x20, ADC_REG_Limit_Registers = 0x2A, ADC_REG_Manufacturer_ID_Register = 0x3E, ADC_REG_Revision_ID_Register = 0x3F }; /** ADC128D818 class. * Used for controlling a ADC128D818 adc connected via I2C. * * Example: * @code * #include "mbed.h" * #include "ADC128D818.h" * Serial pc(USBTX, USBRX); * ADC128D818 adc(p9,p10,p26); * AnalogOut dac(p18); * int main() * { * dac=0.5; * printf("helloword_ADC128D818\r\n"); * wait_ms(100); * 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); * switch (err) { * case -1: * printf("No Device\r\n"); * break; * case -2: * printf("Busy\r\n"); * break; * } * adc.init_limit(ADC_CHANNEL_IN0, 0x80, ADC_LIMIT_HIGH); * adc.init_limit(ADC_CHANNEL_IN1, 0xA6, ADC_LIMIT_HIGH); * adc.init_limit(ADC_CHANNEL_IN2, 0x80, ADC_LIMIT_HIGH); * adc.init_limit(ADC_CHANNEL_IN3, 0x80, ADC_LIMIT_HIGH); * adc.init_limit(ADC_CHANNEL_IN4, 0x80, ADC_LIMIT_HIGH); * adc.init_limit(ADC_CHANNEL_IN5, 0x80, ADC_LIMIT_HIGH); * adc.init_limit(ADC_CHANNEL_IN6, 0x80, ADC_LIMIT_HIGH); * adc.init_limit(ADC_CHANNEL_TEMP, 30, ADC_LIMIT_HIGH); * adc.init_limit(ADC_CHANNEL_TEMP, 29, ADC_LIMIT_LOW); * char reg; * reg=ADC_REG_Advanced_Configuration_Register; * printf("reg %02X=%02X\r\n",reg,adc.read_register(reg)); * printf("reg %02X=%02X\r\n",0x2C,adc.read_channel(0x0C)); * adc.start(); * for(int i=0; i<1000; ++i) { * wait(1); * printf("ch0:%d : %d\r\n",i,adc.read_channel(ADC_CHANNEL_IN0)); * for( char c=1; c<7 ;++c) * printf("ch%d:%d : %04X\r\n",c,i,adc.read_channel(c)); * * printf("temp:%d : %f\r\n",i,(adc.read_channel(ADC_CHANNEL_TEMP)>>7)/2.0); * reg=0x01; * printf("reg %02X=%02X\r\n",reg,adc.read_register(reg)); * } * } * @endcode */ class ADC128D818 { protected: enum Configuration_Register { Configuration_Register_Start = 1<<0, Configuration_Register_INT_Enable = 1<<1, Configuration_Register_INT_Clear = 1<<3, Configuration_Register_Initialization = 1<<7 }; enum Busy_Status_Register { Busy_Status_Register_Busy = 1<<0, Busy_Status_Register_Not_Ready = 1<<1 }; enum Advanced_Configuration_Register { Advanced_Configuration_Register_External_Reference_Enable = 1<<0, Advanced_Configuration_Register_Mode_Select_0 = 1<<1, Advanced_Configuration_Register_Mode_Select_1 = 1<<2 }; enum Conversion_Rate_Register { Conversion_Rate_Register_Rate_Register = 1<<0 }; private: I2C _i2c; char _data[2]; char _address; char _mode; public: /** * @brief Constructor. * * @param sda I2C * @param scl I2C * @param adc_int */ ADC128D818(PinName sda, PinName scl, PinName adc_int ); /** * @brief Destructor. */ ~ADC128D818(); InterruptIn _Adc_Int; /** * @brief read_channel * @param channel * @return u32_data * @date 02/09/2013 */ int read_channel(char channel); /** * @brief read_register * @param Register * @return u8_data * @date 02/09/2013 */ char read_register(char Register); /** * @brief init * * @param address I2C (7bits) ADC_ADDRESS_LOW_LOW ADC_ADDRESS_LOW_MID ADC_ADDRESS_LOW_HIGH ADC_ADDRESS_MID_LOW ADC_ADDRESS_MID_MID ADC_ADDRESS_MID_HIGH ADC_ADDRESS_HIGH_LOW ADC_ADDRESS_HIGH_MID ADC_ADDRESS_HIGH_HIGH * @param mode : ADC_MODE_0 ADC_MODE_1 ADC_MODE_2 ADC_MODE_3 * @param vref ADC_VREF_INT ADC_VREF_EXT * @param rate ADC_RATE_LOW_POWER ADC_RATE_CONTINUOUS * @param mask_channel * @param mask_int * @return error 0 OK, -1 NO DEVICE, -2 ADC is BUSY * @date 02/09/2013 */ int init(char address, char mode, char vref, char rate, char mask_channel, char mask_int); /** * @brief init_limit * * @param limit * @param high_low ADC_LIMIT_HIGH ADC_LIMIT_LOW * @return error 0 OK * @date 02/09/2013 */ int init_limit(char channel, char limit, char high_low); /** * @brief start * @date 02/09/2013 */ void start(); /** * @brief stop * @date 02/09/2013 */ void stop(); }; #endif