Library for NXP (Philips) PCF8591 I2C 4 Channel, 8bit Analog to Digital converter and a 1 Channel, 8bit Digital to Analog converter.
Dependents: 812_hello PCF8591_test_LAAS
PCF8591.h
- Committer:
- wim
- Date:
- 2013-09-21
- Revision:
- 0:1116b0d151fc
File content as of revision 0:1116b0d151fc:
/* PCF8591 - I2C 8 bit, 4 channel A/D and 8 bit, 1 channel D/A converter * Copyright (c) 2013 Wim Huiskamp * * Released under the MIT License: http://mbed.org/license/mit * * version 0.2 Initial Release */ #ifndef _PCF8591_H #define _PCF8591_H /** Driver for PCF8591 I2C I2C A/D and D/A converter * * @code * #include "mbed.h" * #include "PCF8591.h" * * // I2C Communication * I2C i2c_adcdac(p28,p27); // SDA, SCL for LPC1768 * //I2C i2c_adcdac(P0_10,P0_11); // SDA, SCL for LPC812 * * //Declare a composite ADC and DAC device that may be used through public methods * PCF8591 adc_dac(&i2c_adcdac); // I2C bus, Default PCF8591 Slaveaddress * * //Declare independent ADC and DAC objects that may be used similar to mbed AnalogIn and AnalogOut pins * //PCF8591_AnalogOut anaOut(&i2c_bus); * // * //PCF8591_AnalogIn anaIn(&i2c_bus, PCF8591_ADC0); * * * int main() { * uint8_t count = 0; * uint8_t analog; * * while(1) { * wait(0.2); * count++; * * // Composite device methods * adc_dac.write(count); // write D/A value * analog = adc_dac.read(PCF8591_ADC0); // read A/D value for Channel 0 * * // mbed pin type methods * //anaOut = (float)count / 255.0; // write D/A value using range 0.0f .. 1.0f * //analog = anaIn * 33.0; // read A/D value for Channel 0 in (Volts*10) * } * * } * @endcode */ //Address Defines for PCF8591 #define PCF8591_SA0 0x90 #define PCF8591_SA1 0x92 #define PCF8591_SA2 0x94 #define PCF8591_SA3 0x96 #define PCF8591_SA4 0x98 #define PCF8591_SA5 0x9A #define PCF8591_SA6 0x9C #define PCF8591_SA7 0x9E //Register Defines for PCF8591 #define PCF8591_CTRL 0x00 #define PCF8591_ADR0 0x01 #define PCF8591_ADR1 0x02 #define PCF8591_ADR2 0x03 #define PCF8591_ADR3 0x04 #define PCF8591_DAR 0x01 //Control Register Defines for PCF8591 //AD Channels #define PCF8591_ADC0 0x00 #define PCF8591_ADC1 0x01 #define PCF8591_ADC2 0x02 #define PCF8591_ADC3 0x03 //AD Channel Mask #define PCF8591_CHMSK 0x03 //Auto Increment flag (0=disable, 1=enable) #define PCF8591_AIF 0x04 //AD Channels Input modes //4 Single Channels (Chan0=AIN0, Chan1=AIN0, Chan2=AIN0, Chan3=AIN0) #define PCF8591_4S 0x00 //3 Diff Channels (Chan0=AIN0-AIN3, Chan1=AIN1-AIN3, Chan2=AIN2-AIN3) #define PCF8591_3D 0x10 //2 Single Channels (Chan0=AIN0, Chan1=AIN1) //1 Diff Channel (Chan2=AIN2-AIN3) #define PCF8591_2S_1D 0x20 //2 Diff Channels (Chan0=AIN0-AIN1, Chan1=AIN2-AIN3) #define PCF8591_2D 0x30 //ChannelMode Mask #define PCF8591_CHMDMSK 0x30 //Analog Output enable flag (0=disable, 1=enable) #define PCF8591_AOUT 0x40 //Default Mode: ADC0, AutoIncr Off, 4 Single Chan, AnalogOut On #define PCF8591_CTRL_DEF (PCF8591_ADC0 | PCF8591_4S | PCF8591_AOUT) /** Create a PCF8591 object connected to the specified I2C bus and deviceAddress * */ class PCF8591 { public: /** Create a PCF8591 AD and DA object using a specified I2C bus and slaveaddress * * @param I2C &i2c the I2C port to connect to * @param char deviceAddress the address of the PCF8591 */ PCF8591(I2C *i2c, uint8_t deviceAddress = PCF8591_SA0); #if(0) //These methods are disabled since they interfere with normal expected behaviour for mbed type Analog I/O // /** Set ADC mode * * @param adc_mode ADC Channel mode, valid Range (PCF8591_4S, PCF8591_3D, PCF8591_2S_1D, PCF8591_2D) */ void setADCMode(uint8_t mode); /** Set DAC mode * * @param dac_mode DAC Channel mode, valid Range (false=disable, true=enable) */ void setDACMode(bool mode); #endif /** Write Analog Output * * @param analogOut output value (0..255) */ void write(uint8_t analogOut); /** Read Analog Channel * * @param Channel ADC channel, valid range PCF8591_ADC0, PCF8591_ADC1, PCF8591_ADC2 or PCF8591_ADC3 * @return value uint8_t AD converted value (0..255, representing 0V..Vcc) */ uint8_t read(uint8_t channel); protected: I2C *_i2c; //I2C bus reference uint8_t _slaveAddress; //I2C Slave address of device uint8_t _mode; //Device mode /** Initialise AD and DA driver * */ void _init(); }; /** Create a PCF8591 AnalogOut object connected to the specified I2C bus and deviceAddress * */ class PCF8591_AnalogOut { public: /** Create a PCF8591 Analogout object using a specified I2C bus and slaveaddress * * @param I2C &i2c the I2C port to connect to * @param char deviceAddress the address of the PCF8591 */ PCF8591_AnalogOut(I2C *i2c, uint8_t deviceAddress = PCF8591_SA0); void write(float value); #ifdef MBED_OPERATORS /** An operator shorthand for write() */ PCF8591_AnalogOut& operator= (float value); #endif protected: I2C *_i2c; //I2C bus reference uint8_t _slaveAddress; //I2C Slave address of device uint8_t _mode; //Device mode /** Initialise DAC driver * */ void _init(); }; /** Create a PCF8591 AnalogIn object connected to the specified I2C bus and deviceAddress * */ class PCF8591_AnalogIn { public: /** Create a PCF8591 AnalogIn object using a specified I2C bus and slaveaddress * * @param I2C &i2c the I2C port to connect to * @param channel ADC channel of the PCF8591 * @param char deviceAddress the address of the PCF8591 */ PCF8591_AnalogIn(I2C *i2c, uint8_t channel, uint8_t deviceAddress = PCF8591_SA0); float read(); #ifdef MBED_OPERATORS /** An operator shorthand for read() */ operator float(); #endif protected: I2C *_i2c; //I2C bus reference uint8_t _slaveAddress; //I2C Slave address of device uint8_t _mode; //Device mode uint8_t _channel; //Channel /** Initialise DAC driver * */ void _init(); }; #endif