12-Bit, 8-Channel, ADC System Monitor w/ Temp Sensor, Internal/External Reference, & I2C Interface
Dependents: ADC128D818_HelloWorld
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
Generated on Mon Jul 18 2022 15:31:51 by 1.7.2