From 7f0db02066a7554b959fa264fcc200b2a2e4c929 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Sun, 1 Jan 2023 18:03:19 +0100 Subject: Add driver for ADS111x 16-Bit ADC --- src/app/datalogger/main.cc | 13 +++++++++++ src/driver/Kconfig | 4 ++++ src/driver/ads111x.cc | 56 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 src/driver/ads111x.cc (limited to 'src') diff --git a/src/app/datalogger/main.cc b/src/app/datalogger/main.cc index 251d1fa..1d41ee0 100644 --- a/src/app/datalogger/main.cc +++ b/src/app/datalogger/main.cc @@ -13,6 +13,9 @@ #include "driver/soft_i2c.h" #endif +#ifdef CONFIG_driver_ads111x +#include "driver/ads111x.h" +#endif #ifdef CONFIG_driver_lm75 #include "driver/lm75.h" #endif @@ -63,6 +66,12 @@ void loop(void) { +#ifdef CONFIG_driver_ads111x + kout << "Reading: "; + kout.printf_float(ads111x.readVoltage()); + kout << " V" << endl; +#endif + #ifdef CONFIG_driver_lm75 kout << "temperature_celsius: "; kout.printf_float(lm75.getTemp()); @@ -284,6 +293,10 @@ int main(void) kout << "I2C setup OK" << endl; #endif +#ifdef CONFIG_driver_ads111x + ads111x.configure(ADS111x::CONTINUOUS | ADS111x::FSR_4V | ADS111x::SPS_8 | ADS111x::SINGLE_3); +#endif + #ifdef CONFIG_driver_bme280 bme280.intf = BME280_I2C_INTF; bme280.read = bme680_i2c_read; diff --git a/src/driver/Kconfig b/src/driver/Kconfig index 581ef10..163671f 100644 --- a/src/driver/Kconfig +++ b/src/driver/Kconfig @@ -25,6 +25,10 @@ bool menu "Drivers" +config driver_ads111x +bool "ADS111x 16-bit ADC" +depends on meta_driver_i2c + config driver_am2320 bool "AM2320 TH Sensor" depends on meta_driver_i2c diff --git a/src/driver/ads111x.cc b/src/driver/ads111x.cc new file mode 100644 index 0000000..53be2a4 --- /dev/null +++ b/src/driver/ads111x.cc @@ -0,0 +1,56 @@ +/* + * Copyright 2023 Daniel Friesel + * + * SPDX-License-Identifier: BSD-2-Clause + * + * Driver for ADS111x 16-Bit ADCs + */ +#include "driver/ads111x.h" +#if defined(CONFIG_meta_driver_hardware_i2c) +#include "driver/i2c.h" +#elif defined(CONFIG_driver_softi2c) +#include "driver/soft_i2c.h" +#endif + +#include + +void ADS111x::configure(unsigned short config) +{ + txbuf[0] = P_CONFIG; + txbuf[1] = config >> 8; + txbuf[2] = config & 0x00ff; + i2c.xmit(address, 3, txbuf, 0, rxbuf); + + uint8_t pga_config = (config & CONF_PGA_MASK) >> CONF_PGA_OFFSET; + switch (pga_config) { + case 0: + fsr_scale = 24; + break; + case 1: + fsr_scale = 16; + break; + case 2: + fsr_scale = 8; + break; + case 3: + fsr_scale = 4; + break; + case 4: + fsr_scale = 2; + break; + default: + fsr_scale = 1; + } +} + +float ADS111x::readVoltage() +{ + txbuf[0] = P_CONVERSION; + i2c.xmit(address, 1, txbuf, 2, rxbuf); + + int16_t intermediate = ((int8_t)rxbuf[0]) * 256 + (uint8_t) rxbuf[1]; + + return intermediate * 0.256 / 0x7fff * fsr_scale; +} + +ADS111x ads111x(0x48); -- cgit v1.2.3