forked from denkitronik/ADS1118
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ADS1118.h
154 lines (132 loc) · 8 KB
/
ADS1118.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#ifndef ADS1118_h
#define ADS1118_h
#include "Arduino.h"
#include <SPI.h>
/**
* Union representing the "config register" in 3 ways:
* bits, word (16 bits) and nibbles (4 bits)
* (See the datasheet [1] for more information)
*/
///Union configuration register
union Config {
///Structure of the config register of the ADS1118. (See datasheet [1])
struct {
uint8_t reserved:1; ///< "Reserved" bit
uint8_t noOperation:2; ///< "NOP" bits
uint8_t pullUp:1; ///< "PULL_UP_EN" bit
uint8_t sensorMode:1; ///< "TS_MODE" bit
uint8_t rate:3; ///< "DR" bits
uint8_t operatingMode:1;///< "MODE" bit
uint8_t pga:3; ///< "PGA" bits
uint8_t mux:3; ///< "MUX" bits
uint8_t singleStart:1; ///< "SS" bit
} bits;
uint16_t word; ///< Representation in word (16-bits) format
struct {
uint8_t lsb; ///< Byte LSB
uint8_t msb; ///< Byte MSB
} byte; ///< Representation in bytes (8-bits) format
};
/**
* Class representing the ADS1118 sensor chip
* @author Alvaro Salazar <[email protected]>
*/
class ADS1118 {
public:
ADS1118(uint8_t io_pin_cs); ///< Constructor
void begin(); ///< This method initialize the SPI port and the config register
double getTemperature(); ///< Getting the temperature in degrees celsius from the internal sensor of the ADS1118
uint16_t getADCValue(uint8_t inputs); ///< Getting a sample from the specified input
double getMilliVolts(uint8_t inputs); ///< Getting the millivolts from the specified inputs
double getMilliVolts(); ///< Getting the millivolts from the settled inputs
void decodeConfigRegister(union Config configRegister); ///< Decoding a configRegister structure and then print it out to the Serial port
void setSampligRate(uint8_t samplingRate); ///< Setting the sampling rate specified in the config register
void setFullScaleRange(uint8_t fsr);///< Setting the full scale range in the config register
void setContinuousMode(); ///< Setting to continuous adquisition mode
void setSingleShotMode(); ///< Setting to single shot adquisition and power down mode
void disablePullup(); ///< Disabling the internal pull-up resistor of the DOUT pin
void enablePullup(); ///< Enabling the internal pull-up resistor of the DOUT pin
void setInputSelected(uint8_t input);///< Setting the inputs to be adquired in the config register.
//Input multiplexer configuration selection for bits "MUX"
//Differential inputs
const uint8_t DIFF_0_1 = 0b000; ///< Differential input: Vin=A0-A1
const uint8_t DIFF_0_3 = 0b001; ///< Differential input: Vin=A0-A3
const uint8_t DIFF_1_3 = 0b010; ///< Differential input: Vin=A1-A3
const uint8_t DIFF_2_3 = 0b011; ///< Differential input: Vin=A2-A3
//Single ended inputs
const uint8_t AIN_0 = 0b100; ///< Single ended input: Vin=A0
const uint8_t AIN_1 = 0b101; ///< Single ended input: Vin=A1
const uint8_t AIN_2 = 0b110; ///< Single ended input: Vin=A2
const uint8_t AIN_3 = 0b111; ///< Single ended input: Vin=A3
union Config configRegister; ///< Config register
//Bit constants
const uint16_t SCLK = 2000000;///< ADS1118 SCLK frequency: 4000000 Hz Maximum for ADS1118
// Used by "SS" bit
const uint8_t START_NOW = 1; ///< Start of conversion in single-shot mode
// Used by "TS_MODE" bit
const uint8_t ADC_MODE = 0; ///< External (inputs) voltage reading mode
const uint8_t TEMP_MODE = 1; ///< Internal temperature sensor reading mode
// Used by "MODE" bit
const uint8_t CONTINUOUS = 0; ///< Continuous conversion mode
const uint8_t SINGLE_SHOT = 1; ///< Single-shot conversion and power down mode
// Used by "PULL_UP_EN" bit
const uint8_t PULLUP = 1; ///< Internal pull-up resistor enabled for DOUT ***DEFAULT
const uint8_t NO_PULLUP = 0; ///< Internal pull-up resistor disabled
// Used by "NOP" bits
const uint8_t VALID_CFG = 0b01; ///< Data will be written to Config register
const uint8_t NO_VALID_CFG= 0b00; ///< Data won't be written to Config register
// Used by "Reserved" bit
const uint8_t RESERVED = 1; ///< Its value is always 1, reserved
/*Full scale range (FSR) selection by "PGA" bits.
[Warning: this could increase the noise and the effective number of bits (ENOB). See tables above]*/
const uint8_t FSR_6144 = 0b000; ///< Range: ±6.144 v. LSB SIZE = 187.5μV
const uint8_t FSR_4096 = 0b001; ///< Range: ±4.096 v. LSB SIZE = 125μV
const uint8_t FSR_2048 = 0b010; ///< Range: ±2.048 v. LSB SIZE = 62.5μV ***DEFAULT
const uint8_t FSR_1024 = 0b011; ///< Range: ±1.024 v. LSB SIZE = 31.25μV
const uint8_t FSR_0512 = 0b100; ///< Range: ±0.512 v. LSB SIZE = 15.625μV
const uint8_t FSR_0256 = 0b111; ///< Range: ±0.256 v. LSB SIZE = 7.8125μV
/*Sampling rate selection by "DR" bits.
[Warning: this could increase the noise and the effective number of bits (ENOB). See tables above]*/
const uint8_t RATE_8SPS = 0b000; ///< 8 samples/s, Tconv=125ms
const uint8_t RATE_16SPS = 0b001; ///< 16 samples/s, Tconv=62.5ms
const uint8_t RATE_32SPS = 0b010; ///< 32 samples/s, Tconv=31.25ms
const uint8_t RATE_64SPS = 0b011; ///< 64 samples/s, Tconv=15.625ms
const uint8_t RATE_128SPS = 0b100; ///< 128 samples/s, Tconv=7.8125ms
const uint8_t RATE_250SPS = 0b101; ///< 250 samples/s, Tconv=4ms
const uint8_t RATE_475SPS = 0b110; ///< 475 samples/s, Tconv=2.105ms
const uint8_t RATE_860SPS = 0b111; ///< 860 samples/s, Tconv=1.163ms
private:
uint8_t lastSensorMode=3; ///< Last sensor mode selected (ADC_MODE or TEMP_MODE or none)
uint8_t cs; ///< Chip select pin (choose one)
const float pgaFSR[8] = {6.144, 4.096, 2.048, 1.024, 0.512, 0.256, 0.256, 0.256};
const uint8_t CONV_TIME[8]={125, 63, 32, 16, 8, 4, 3, 2}; ///< Array containing the conversions time in ms
/*
Table 1. Noise in μVRMS (μVPP) at VDD = 3.3 V [1]
DATA RATE FSR (Full-Scale Range)
(SPS) ±6.144 V ±4.096 V ±2.048 V ±1.024 V ±0.512 V ±0.256 V
8 187.5 (187.5) 125 (125) 62.5 (62.5) 31.25 (31.25) 15.62 (15.62) 7.81 (7.81)
16 187.5 (187.5) 125 (125) 62.5 (62.5) 31.25 (31.25) 15.62 (15.62) 7.81 (7.81)
32 187.5 (187.5) 125 (125) 62.5 (62.5) 31.25 (31.25) 15.62 (15.62) 7.81 (7.81)
64 187.5 (187.5) 125 (125) 62.5 (62.5) 31.25 (31.25) 15.62 (15.62) 7.81 (7.81)
128 187.5 (187.5) 125 (125) 62.5 (62.5) 31.25 (31.25) 15.62 (15.62) 7.81 (12.35)
250 187.5 (252.09) 125 (148.28) 62.5 (84.03) 31.25 (39.54) 15.62 (16.06) 7.81 (18.53)
475 187.5 (266.92) 125 (227.38) 62.5 (79.08) 31.25 (56.84) 15.62 (32.13) 7.81 (25.95)
860 187.5 (430.06) 125 (266.93) 62.5 (118.63) 31.25 (64.26) 15.62 (40.78) 7.81 (35.83)
Table 2. ENOB from RMS Noise (Noise-Free Bits from Peak-to-Peak Noise) at VDD = 3.3 V
DATA RATE FSR (Full-Scale Range)
(SPS) ±6.144 V ±4.096 V ±2.048 V ±1.024 V ±0.512 V ±0.256 V
8 16 (16) 16 (16) 16 (16) 16 (16) 16 (16) 16 (16)
16 16 (16) 16 (16) 16 (16) 16 (16) 16 (16) 16 (16)
32 16 (16) 16 (16) 16 (16) 16 (16) 16 (16) 16 (16)
64 16 (16) 16 (16) 16 (16) 16 (16) 16 (16) 16 (16)
128 16 (16) 16 (16) 16 (16) 16 (16) 16 (16) 16 (15.33)
250 16 (15.57) 16 (15.75) 16 (15.57) 16 (15.66) 16 (15.96) 16 (14.75)
475 16 (15.49) 16 (15.13) 16 (15.66) 16 (15.13) 16 (14.95) 16 (14.26)
860 16 (14.8) 16 (14.9) 16 (15.07) 16 (14.95) 16 (14.61) 16 (13.8)
[1] Texas Instruments, "ADS1118 Ultrasmall, Low-Power, SPI™-Compatible, 16-Bit Analog-to-Digital
Converter with Internal Reference and Temperature Sensor", ADS1118 datasheet, SBAS457E [OCTOBER 2010–REVISED OCTOBER 2015].
Note: This information is taken from http://www.ti.com
Copyright © 2010–2015, Texas Instruments Incorporated
*/
};
#endif