GY-63_MS5611/libraries/ADS1x15/README.md

292 lines
10 KiB
Markdown
Raw Normal View History

2021-01-29 06:31:58 -05:00
[![Arduino CI](https://github.com/RobTillaart/ADS1X15/workflows/Arduino%20CI/badge.svg)](https://github.com/marketplace/actions/arduino_ci)
[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/RobTillaart/ADS1X15/blob/master/LICENSE)
[![GitHub release](https://img.shields.io/github/release/RobTillaart/ADS1X15.svg?maxAge=3600)](https://github.com/RobTillaart/ADS1X15/releases)
# ADS1X15
Arduino library for I2C ADC ADS1015, ADS1115,
2021-07-14 04:59:33 -04:00
2021-01-29 06:31:58 -05:00
## Description
This library should work for the devices mentioned below,
although not all sensors support all functionality.
2021-07-14 04:59:33 -04:00
| Device | Channels | Resolution | Max sps | Comparator | ProgGainAMP | Notes |
|:-------:|:--------:|:----------:|:-------:|:----------:|:-----------:|:-------|
| ADS1013 | 1 | 12 | 3300 | N | N | |
| ADS1014 | 1 | 12 | 3300 | Y | Y | |
| ADS1015 | 4 | 12 | 3300 | Y | Y | |
| ADS1113 | 1 | 16 | 860 | N | N | |
| ADS1114 | 1 | 16 | 860 | Y | Y | |
| ADS1115 | 4 | 16 | 860 | Y | Y | Tested |
2021-01-29 06:31:58 -05:00
As the 1015 and the 1115 are both 4 channels these are the most
interesting from functionality point of view as these can also do
differential measurement.
2021-07-14 04:59:33 -04:00
2021-01-29 06:31:58 -05:00
#### Note
This readme file is work in progress.
## Interface
The address of the ADS1113/4/5 is determined by to which pin the ADDR
is connected to:
2021-07-14 04:59:33 -04:00
| ADDR pin connected to | Address | Notes |
|:---------------------:|:-------:|:-------:|
| GND | 0x48 | default |
| VDD | 0x49 | |
| SDA | 0x4A | |
| SCL | 0x4B | |
2021-01-29 06:31:58 -05:00
- **ADS1x15()** constructor, should not be used.
2021-04-07 07:31:22 -04:00
- **ADS1013(address, TwoWire \*wire = &Wire)** Constructor with device address,
and optional the Wire interface as parameter.
- **ADS1014(address, TwoWire \*wire = &Wire)** Constructor with device address,
and optional the Wire interface as parameter.
- **ADS1015(address, TwoWire \*wire = &Wire)** Constructor with device address,
and optional the Wire interface as parameter.
- **ADS1113(address, TwoWire \*wire = &Wire)** Constructor with device address,
and optional the Wire interface as parameter.
- **ADS1114(address, TwoWire \*wire = &Wire)** Constructor with device address,
and optional the Wire interface as parameter.
- **ADS1115(address, TwoWire \*wire = &Wire)** Constructor with device address,
and optional the Wire interface as parameter.
2021-01-29 06:31:58 -05:00
2021-07-14 04:59:33 -04:00
The function **setWireClock(uint32_t speed)** is used to set the clock speed of the used
2021-04-25 13:56:44 -04:00
I2C interface.
The function **getWireClock()** is a prototype. It returns the value set by setWireClock().
2021-07-14 04:59:33 -04:00
This is not necessary the actual value. When no value is set **getWireClock()** returns 0.
2021-04-25 13:56:44 -04:00
Need to implement a read / calculate from low level I2C code (e.g. TWBR on AVR).
2021-01-29 06:31:58 -05:00
After construction the **ADS.begin()** need to be called. This will return false
if an invalid address is used.
The function **isConnected()** can be used to verify the reading of the ADS.
2021-04-25 13:56:44 -04:00
The function **reset()** is sets the parameters to their initial value as
in the constructor.
2021-01-29 06:31:58 -05:00
#### Programmable Gain
- **setGain(gain)** set the gain value, indicating the maxVoltage that can be measured
Adjusting the gain allows one to make more precise measurements.
See table below.
- **getGain()** returns the gain value (index).
2021-07-14 04:59:33 -04:00
| PGA value | Max Voltage | Notes |
|:---------:|:-----------:|:-------:|
| 0 | ±6.144V | default |
| 1 | ±4.096V | |
| 2 | ±2.048V | |
| 4 | ±1.024V | |
| 8 | ±0.512V | |
| 16 | ±0.256V | |
2021-01-29 06:31:58 -05:00
- **getMaxVoltage()** returns the max voltage with the current gain.
- **toVoltage(raw = 1)** converts a raw measurement to a voltage.
Can be used for normal and differential measurements.
The default value of 1 returns the conversion factor for any raw number.
The voltage factor can also be used to set HIGH and LOW threshold registers
with a voltage in the comparator mode.
Check the examples.
```cpp
float f = ADS.toVoltage();
ADS.setComparatorThresholdLow( 3.0 / f );
ADS.setComparatorThresholdLow( 4.3 / f );
```
#### Operational mode
The ADS sensor can operate in single shot or continuous mode.
Depending on how often one needs a conversion one can tune the mode.
- **setMode(mode)** 0 = CONTINUOUS, 1 = SINGLE (default)
- **getMode()** returns current mode 0 or 1, or ADS1X15_INVALID_MODE = 0xFE.
2021-07-14 04:59:33 -04:00
#### Data rate
2021-01-29 06:31:58 -05:00
2021-07-14 04:59:33 -04:00
- **setDataRate(dataRate)** Data rate depends on type of device.
2021-01-29 06:31:58 -05:00
For all devices the index 0..7 can be used, see table below.
Values above 7 ==> will be set to the default 4.
2021-07-14 04:59:33 -04:00
- **getDataRate()** returns the current data rate (index).
2021-01-29 06:31:58 -05:00
The library has no means to convert this index to the actual numbers
as that would take 32 bytes.
2021-07-14 04:59:33 -04:00
Data rate in samples per second, based on datasheet numbers.
2021-01-29 06:31:58 -05:00
2021-07-14 04:59:33 -04:00
| data rate | ADS101x | ADS 111x | Notes |
|:---------:|--------:|---------:|:-------:|
| 0 | 128 | 8 | slowest |
| 1 | 250 | 16 | |
| 2 | 490 | 32 | |
| 3 | 920 | 64 | |
| 4 | 1600 | 128 | default |
| 5 | 2400 | 250 | |
| 6 | 3300 | 475 | |
| 7 | 3300 | 860 | fastest |
2021-01-29 06:31:58 -05:00
#### ReadADC Single mode
Reading the ADC is very straightforward, the **readADC()** function handles
2021-07-14 04:59:33 -04:00
all in one call. Under the hood it uses the asynchronous calls.
2021-01-29 06:31:58 -05:00
- **int16_t readADC(pin)** normal ADC functionality, pin = 0..3.
2021-07-14 04:59:33 -04:00
If the pin number is out of range, this function will return 0.
2021-01-29 06:31:58 -05:00
2021-07-14 04:59:33 -04:00
To read the ADC in an asynchronous way (e.g. to minimize blocking) one has to use three calls:
2021-01-29 06:31:58 -05:00
- **requestADC(pin)** Start the conversion. pin = 0..3.
- **isBusy()** Is the conversion not ready?
- **isReady()** Is the conversion ready? (= wrapper around **isBusy()** )
- **getValue()** Read the result of the conversion.
in terms of code
```cpp
void setup()
{
// other setup things here
ADS.requestADC(pin);
}
void loop()
{
if (ADS.isReady())
{
val = ADS.getValue();
ADS.requestADC(pin); // request new conversion
}
// do other things here
}
```
See examples
## ReadADC Differential
For reading the ADC in a differential way there are 4 calls possible.
- **readADC_Differential_0_1()** returns the difference between 2 ADC pins.
- **readADC_Differential_0_3()** ADS1x15 only
- **readADC_Differential_1_3()** ADS1x15 only
- **readADC_Differential_2_3()** ADS1x15 only
- **readADC_Differential_0_2()** ADS1x15 only - in software (no async equivalent)
- **readADC_Differential_1_2()** ADS1x15 only - in software (no async equivalent)
2021-07-14 04:59:33 -04:00
The differential reading of the ADC can also be done with asynchronous calls.
2021-01-29 06:31:58 -05:00
- **requestADC_Differential_0_1()** starts conversion for differential reading
- **requestADC_Differential_0_3()** ADS1x15 only
- **requestADC_Differential_1_3()** ADS1x15 only
- **requestADC_Differential_2_3()** ADS1x15 only
After one of these calls one need to call
- **isBusy()** Is the conversion ready?
- **getValue()** Read the result of the conversion.
#### ReadADC continuous mode
To use the continuous mode one need three calls
- **setMode(0)** 0 = CONTINUOUS, 1 = SINGLE (default)
- **readADC()** or **requestADC()** to get the continuous mode started.
- **getValue()** to return the last value read by the device.
Calling this over and over again can give the same value multiple times.
By using **isBusy()** or **isReady()** one can wait until new data is available.
2021-07-14 04:59:33 -04:00
Or one can use the **ALERT/RDY** pin to trigger via hardware the readiness of the conversion.
2021-01-29 06:31:58 -05:00
See examples.
2021-04-25 13:56:44 -04:00
2021-01-29 06:31:58 -05:00
#### Threshold registers ==> mode RDY pin
If the thresholdHigh is set to 0x0100 and the thresholdLow to 0x0000
the **ALERT/RDY** pin is triggered when a conversion is ready.
- **setComparatorThresholdLow(0x0000)**
- **setComparatorThresholdHigh(0x0100)**
See examples.
2021-04-25 13:56:44 -04:00
2021-01-29 06:31:58 -05:00
## Comparator
Please read Page 15 of the datasheet as the behavior of the
comparator is not trivial.
2021-04-25 13:56:44 -04:00
2021-01-29 06:31:58 -05:00
#### Comparator Mode
When configured as a **TRADITIONAL** comparator, the **ALERT/RDY** pin asserts
(active low by default) when conversion data exceed the limit set in the
2021-07-14 04:59:33 -04:00
high threshold register. The comparator then de-asserts when the input
2021-01-29 06:31:58 -05:00
signal falls below the low threshold register value.
If the comparator **LATCH** is set, the **ALERT/RDY** pin asserts and it will be
reset after reading the sensor (conversion register) again.
*An SMB alert command (00011001) on the I2C bus will also reset the alert state.*
*Not implemented in the library (yet)*
In **WINDOW** comparator mode, the **ALERT/RDY** pin asserts if conversion data exceeds
the high threshold register or falls below the low threshold register.
In this mode the alert is held if the **LATCH** is set. This is similar as above.
2021-04-25 13:56:44 -04:00
2021-01-29 06:31:58 -05:00
#### Polarity
Default state of the **ALERT/RDY** pin is **LOW**, can be to set **HIGH**.
2021-04-25 13:56:44 -04:00
2021-01-29 06:31:58 -05:00
#### Latch
Holds the **ALERT/RDY** to **HIGH** (or **LOW** depending on polarity) after triggered
even if actual value has been 'restored to normal' value.
2021-04-25 13:56:44 -04:00
2021-01-29 06:31:58 -05:00
#### QueConvert
Set the number of conversions before trigger activates.
The **setComparatorQueConvert(uint8_t mode)** is used to set the number of
conversions that exceed the threshold before the **ALERT/RDY** pin is set **HIGH**.
A value of 3 (or above) effectively disables the comparator. See table below.
2021-07-14 04:59:33 -04:00
| value | meaning | Notes |
|:-----:|:----------------------------------|:--------|
| 0 | trigger alert after 1 conversion | |
| 1 | trigger alert after 2 conversions | |
| 2 | trigger alert after 4 conversions | |
| 3 | Disable comparator | default |
2021-01-29 06:31:58 -05:00
2021-04-25 13:56:44 -04:00
2021-01-29 06:31:58 -05:00
#### Threshold registers comparator mode
Depending on the comparator mode **TRADITIONAL** or **WINDOW** the thresholds registers
mean something different see - Comparator Mode above or datasheet.
- **setComparatorThresholdLow(lo)** set the low threshold; take care the hi >= lo
- **setComparatorThresholdHigh(hi)** set the high threshold; take care the hi >= lo
- **getComparatorThresholdLow()** returns set value
- **getComparatorThresholdHigh()** returns set value
## Future ideas & improvements
- Improve documentation
- more examples?
- SMB alert command (00011001) on I2C bus?
- implement missing Differential reads in software.
- testing....
2021-04-25 13:56:44 -04:00
2021-01-29 06:31:58 -05:00
## Operation
See examples