Aruna
ADS101x.cpp
Go to the documentation of this file.
1 //
2 // Created by noeel on 17-08-20.
3 //
4 #include <math.h>
5 #include <cstdio>
6 #include "aruna/driver/ADS101x.h"
7 
8 using namespace aruna;
9 using namespace aruna::driver;
10 
11 
12 err_t ADS101x::_read(int32_t &raw) {
13  err_t err = err_t::OK;
14  int16_t conversion = 0;
15  uint16_t config = (int) ADS101x::OS::W_START_A_SINGLE_CONVERSION |
16  (int) compare |
17  (int) ADS101x::PGA::DEFAULT |
19  (int) ADS101x::DR::DEFAULT |
24 
25  uint8_t data[2];
26  uint8_t config_array[2]={ static_cast<uint8_t>(config & 0xff), static_cast<uint8_t>(config >> 8) };
27 // write config
28  err = i2c_bus->write(i2c_address, (uint8_t) register_address_pointer::CONFIG, config_array, 2);
29  if ((bool) err)
30  return err;
31 // set Conversion register to read and read conversion register
33 // printf("read: 0x%X%X\n", data[0], data[1]);
34  conversion = (int16_t) (data[0] << 8 | (data[1] & 0xFF));
35  conversion = conversion >> 4;
36 // TODO use function from Actuator.h
37 // raw = ((conversion * (4096 - 0)) / 2047) + 0;
38 
39  double input, inputLow, inputHigh, outputHigh, outputLow;
40  input = conversion;
41  inputLow = -2048;
42  inputHigh = 2047;
43  outputHigh = INT32_MAX;
44  outputLow = INT32_MIN;
45 // TODO make convert_range function and replace Actuator::convert_range with this
46 // TODO range converting should be done by the ADC parent.
47 // https://gamedev.stackexchange.com/questions/33441/how-to-convert-a-number-from-one-min-max-set-to-another-min-max-set
48  raw = ((input - inputLow) / (inputHigh - inputLow)) * (outputHigh - outputLow) + outputLow;
49  return err;
50 }
51 
52 
53 ADS101x::ADS101x(ADS101x::MUX compare, I2C_master *i2c_bus, uint8_t address) : compare(compare), i2c_bus(i2c_bus),
54  i2c_address(address) {
55  set_reference(3300);
56  set_resolution(12);
57 
58 }
Definition: comm.cpp:14
err_t read(uint8_t address, uint8_t reg, uint8_t *buffer, size_t buffer_size)
Read data from I²C slave.
Definition: I2C_master.cpp:7
ADS101x(MUX compare, I2C_master *i2c_bus, uint8_t address=default_address)
ADS101x I²C 12 bit ADC with four channels.
Definition: ADS101x.cpp:53
MUX
Input multiplexer configuration (ADS1015 only) These bits configure the input multiplexer.
Definition: ADS101x.h:19
uint8_t const i2c_address
Definition: ADS101x.h:173
err_t write(uint8_t address, uint8_t reg, uint8_t *data, size_t data_size)
Write data to the I²C bus.
Definition: I2C_master.cpp:15
err_t set_reference(uint16_t mV)
set reference voltage, used to convert raw data to voltage.
Definition: ADC.cpp:18
err_t set_resolution(size_t bits)
Set resolution of ADC.
Definition: ADC.cpp:13
err_t _read(int32_t &raw) override
Read analogue value and convert to 32bit signed resolution.
Definition: ADS101x.cpp:12
I2C_master * i2c_bus
Definition: ADS101x.h:172