blob: e90cced1302b3b09804db1aa10e496dc01f4fc25 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 Herwig Eichler, www.conmeleon.org
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Herwig Eichler - initial API and implementation and initial documentation
*
* This class represents a 4 channel ADC from Texas Instruments Type ADS1018
* Please refer to the datasheet available at http://www.ti.com for details
* ADS1018 is derived from the CSpiDevice base class which uses the linux kernel spidev device driver.
*
* Remark on SCLK timing:
* According to the timing requirements of the ADS1018 the minimum SCLK period duration is 250ns, which means
* the maximum SCLK frequency is 4MHz.
*
* A SPI device (e.g. ADC) on bus X with chip select line Y will be available as /dev/spidevX.Y
* If you don't see this device in your file system, the spidev kernel module might not be loaded
* SPI devices have a limited userspace API, supporting basic half-duplex
* read() and write() access to SPI slave devices. Using ioctl() requests,
* full duplex transfers and device I/O configuration are also available.
*******************************************************************************/
#ifndef SPI_ADS1018_H_
#define SPI_ADS1018_H_
#include "../spi/spidevice.h"
namespace CONMELEON {
//! sets the conversion mode of the ADS1018
/*! Continuous means that the device will be sampling continuously and the current value will be available
* in the data register, if it is not read it will be overwritten.
* SingleShot means that the device will do a single sample and will be powered down afterwards. The sampling
* needs to be triggered manually by setting the most significant bit (Bit 15) in the configuration register to "1"
*/
enum EConversionMode {
Continuous, /*!< the ADS1018 will start a new conversion, when the last one is finished */
SingleShot /*!< the ADS1018 will sample once if the trigger bit is set in the configuration register and will power down afterwards */
};
//! sets the data rate of the ADS1018
enum EDataRate {
SPS128, /*!< 128 samples per second */
SPS250, /*!< 250 samples per second */
SPS490, /*!< 490 samples per second */
SPS920, /*!< 920 samples per second */
SPS1600, /*!< 1600 samples per second (default setting) */
SPS2400, /*!< 2400 samples per second */
SPS3300 /*!< 3300 samples per second */
};
//! sets the conversion source of the ADS1018
enum EDataSource {
AnalogInput, /*!< an analog input channel will be sampled, according to the channel configuration */
Temperature /*!< the internal temperature sensor will be sampled */
};
//! sets the full scale voltage of the internal gain amplifier of the ADS1018
/*! Please note that the maximum input voltage must not exceed the device supply voltage Vdd + 0,3V.
* If your device is supplied with 3,3V you will have to use a setting of FS4096.
*/
enum EPgaSetting {
FS6144, /*!< full scale voltage is +-6,144V */
FS4096, /*!< full scale voltage is +-4,096V */
FS2048, /*!< full scale voltage is +-2,048V (default setting) */
FS1024, /*!< full scale voltage is +-1,024V */
FS0512, /*!< full scale voltage is +-0,512V */
FS0256 /*!< full scale voltage is +-0,256V */
};
//! sets the input channel configuration of the ADS1018
enum EChannelConfig {
DIF01, /*!< AIN0 and AIN1 of the ADS1018 will be a single channel in differential mode (AIN0 + and AIN1 -, default setting) */
DIF03, /*!< AIN0 and AIN3 of the ADS1018 will be a single channel in differential mode (AIN0 + and AIN3 -) */
DIF13, /*!< AIN1 and AIN3 of the ADS1018 will be a single channel in differential mode (AIN1 + and AIN3 -) */
DIF23, /*!< AIN2 and AIN3 of the ADS1018 will be a single channel in differential mode (AIN2 + and AIN3 -) */
SE0, /*!< AIN0 of the ADS1018 will be in single ended mode mode (AIN0 + and GND -) */
SE1, /*!< AIN1 of the ADS1018 will be in single ended mode mode (AIN1 + and GND -) */
SE2, /*!< AIN2 of the ADS1018 will be in single ended mode mode (AIN2 + and GND -) */
SE3 /*!< AIN0 of the ADS1018 will be in single ended mode mode (AIN3 + and GND -) */
};
/*! \class CAds1018
* \brief CAds1018 represents a 4 channel 12 bit analog to digital converter ADS1018 from Texas Instruments
*
* The datasheet is available at http://www.ti.com/lit/ds/symlink/ads1018.pdf
* The ADS1018 can perform conversions up to a speed of 3300 samples per second and has got a built in programmble gain amplifier
* and a temperature sensor.
* The CAds1018 class is derived from the CSpiDevice base class
*/
class CAds1018 : public CSpiDevice {
public:
/*! \fn CAds1018(const char* sDevice)
* \brief creates an ADS1018 device according to the \a sDevice parameter
* \param sDevice gives the device path e.g. /dev/spidev0.1 in case of the CONMELEON C1 board
*
* The constructor sets the default parameters to m_nBitsPerWord = 8, m_enMode = SPIMODE1 and m_nSpeed to 1 MHz.
*/
explicit CAds1018(const char* sDevice);
/*! \fn CAds1018(const char* sDevice, unsigned int nSpeed, CONMELEON::ESpiMode enMode)
* \brief creates a SPI device according to the \a sDevice parameter
* \param sDevice gives the device path e.g. /dev/spidev0.1
* \param nSpeed gives the bus clock frequency e.g. 1000000 for 1 MHz
* \param enMode gives the SPI bus mode setting e.g. SPIMODE1
*
* The constructor sets the default parameters to m_nBitsPerWord = 8
*/
CAds1018(const char* sDevice, unsigned int nSpeed, CONMELEON::ESpiMode enMode);
/*! \fn EChannelConfig getChannelConfig()
* \brief reads the current channel configuration of the ADS1018
*
* The channel configuration is stored in bits [14:12] in the configuration register.
*/
EChannelConfig getChannelConfig() { return static_cast<EChannelConfig>((m_ConfigRegister[0] & 0b01110000) >> 4); };
/*! \fn EConversionMode getConversionMode()
* \brief reads the current conversion mode setting of the ADS1018
*
* The conversion mode is stored in bit [8] in the configuration register, which is the first bit in the MSB
*/
EConversionMode getConversionMode() { return static_cast<EConversionMode>(m_ConfigRegister[0] & 0b00000001); };
/*! \fn EPgaSetting getPgaSetting()
* \brief reads the current internal programmable gain amplifier setting of the ADS1018
*
* The pga setting is stored in bits [11:9] in the configuration register
*/
EPgaSetting getPgaSetting() { return static_cast<EPgaSetting>((m_ConfigRegister[0] & 0b00001110) >> 1); };
/*! \fn EDataRate getDataRate()
* \brief reads the current data rate of the ADS1018
*
* The data rate speed setting is stored in bits [7:5] in the configuration register
*/
EDataRate getDataRate() { return static_cast<EDataRate>((m_ConfigRegister[1] & 0b11100000) >> 5); };
/*! \fn EDataSource getDataSource()
* \brief reads the current data source of the ADS1018
*
* The data source setting for analog input or temperature readout is stored in bit [4] of the configuration register
*/
EDataSource getDataSource() { return static_cast<EDataSource>((m_ConfigRegister[1] & 0b00010000) >> 4); };
/*! \fn float getReferenceVoltage()
* \brief reads the current reference voltage of the ADS1018
*
* The reference voltage of the ADS1018 normally is the supply voltage (3,3V in case of the CONMELEON C1 board).
*/
double getReferenceVoltage() { return m_ReferenceVoltage; };
/*! \fn float getVoltageDivider()
* \brief reads the current voltage divider factor
*
* The factor gives the voltage divider, which might be installed at the input of the ADS1018.
* The value is 3,0 in case of the CONMELEON C1 board, because the nominal input voltage range is 10V DC and the maximum input voltage at the ADS1018 is 3,3V.
* This value is needed to calculate the input voltage from the integer value read from the ADS1018 data register.
*/
double getVoltageDivider() { return m_VoltageDivider; };
/*! \fn unsigned int getConversionDuration()
* \brief reads the conversion duration in microseconds
*
* The conversion duration is calculated from the data rate automatically.
* If you have configured a data rate of 3300 samples per second, this function will return 303 microseconds.
*/
unsigned int getConversionDuration() { return m_ConversionDuration; };
/*! \fn void setChannelConfig (EChannelConfig enConfig)
* \brief sets the input channel configuration of the ADS1018
* \param enConfig gives the input channel configuration to set
*
* It tells if the channel is differential or single ended and
* and which channel should be selected by the internal multiplexer of the ADS108.
* If not set explicitly, the default value is AIN0 and AIN1 in differential mode.
*/
void setChannelConfig (EChannelConfig enConfig);
/*! \fn void setConversionMode (EConversionMode enMode)
* \brief sets the conversion mode of the ADS1018
* \param enMode gives the conversion mode to set
*
* Sets the conversion mode either to continuous or single shot.
* Default value is single shot for power consumption reasons.
*/
void setConversionMode (EConversionMode enMode);
/*! \fn void setPGA (EPgaSetting enPga)
* \brief sets the internal programmable gain amplifier configuration of the ADS1018
* \param enPga gives the full scale voltage to set
*
* Default value is full scale range at +-2.048V.
* Attention:
* The input voltage level must not exceed the level of the device power supply voltage VDD + 0,3V.
* In case of the CONMELEON C1 board VDD is 3,3V.
*/
void setPGA (EPgaSetting enPga);
/*! \fn void setSampleSpeed (EDataRate enSpeed)
* \brief sets the conversion speed of the ADS1018
* \param enSpeed gives the conversion speed to set
*
* Default value is 1600 samples per second.
*/
void setSampleSpeed (EDataRate enSpeed);
/*! \fn void setDataSource (EDataSource enSrc)
* \brief sets the data source for conversion
* \param enSrc gives the conversion source to set
*
* Sets the data source to sample data from.
* Possible values are a normal voltage input channel or the internal temperature sensor
*/
void setDataSource (EDataSource enSrc);
/*! \fn void setReferenceVoltage (const float fRefVoltage)
* \brief sets the reference voltage of the ADS1018
* \param fRefVoltage gives the reference voltage value to set
*
* Sets the reference voltage, which is needed to calculate the input channel voltage from the received 16bit data register.
* The ADS1018 uses an internal reference voltage, which is the same than the supply voltage applied to the device.
* According to the datasheet of the ADS1018 supply voltage range is between 2.0V and 5.5V, so the same values are tolerated for the reference voltage value.
*/
void setReferenceVoltage (const float fRefVoltage);
/*! \fn void setVoltageDivider (const float fDivider)
* \brief sets the factor of an external voltage divider circuit
* \param fDivider gives the divider factor to set
*
* Sets the value of an external voltage divider, which might be necessary to measure voltages larger then the supply voltage.
* The voltage divider value needs to be > 1.0
*/
void setVoltageDivider (const float fDivider);
/*! \fn int readVoltage(const unsigned int iChannelNr)
* \brief reads the current voltage at the analog input channel given by \a iChannelNr in mV
* \param iChannelNr gives the number of the channel to read from, valid numbers are between 0 and 3
*
* If the conversion mode is set to "Continuous" just the data is read from the conversion register and scaled to a voltage value.
* If the conversion mode is set to "SingleShot" this function sets the MSB in the configuration register
* bit [15] to "1" to trigger a single shot conversion and reads the data afterwards.
* The function will wait for the number of microseconds given in the conversion duration setting to retrieve the data from the configuration register.
* In case of an error (e.g. invalid channel number) the function will return a value of 0,0.
*/
int readVoltage(const unsigned int iChannelNr);
/*! \fn int readTemperature()
* \brief reads the current temperature in 10th of degree celsius from the internal temperature sensor.
*
*/
int readTemperature();
unsigned char* getConfigRegister(void) { return &m_ConfigRegister[0]; }
unsigned char* getDataRegister(void) { return &m_DataRegister[0]; }
private:
// Factor used to calculate temperature readout value, see datasheet of ADS1018
static constexpr double scm_TemperatureFactor = 0.125;
double m_ReferenceVoltage;
double m_VoltageDivider;
unsigned int m_ConversionDuration;
// m_ConfigRegister is used to keep a copy of the current configuration register settings
// according to the ADS1018 datasheet, the default config register setting is 0x058B
unsigned char m_ConfigRegister[2];
unsigned char m_DataRegister[2];
// this function just reads a 16 bit value from the ADS1018 according to the configuration registers
// it makes no difference if it is a voltage from an input or the internal temperature sensor
unsigned int readRawValue();
};
}
#endif /* SPI_ADS1018_H_ */