From ae0949895354340f6592113ce3bd15d2b1112fcd Mon Sep 17 00:00:00 2001 From: ZodiusInfuser Date: Wed, 18 Aug 2021 12:16:51 +0100 Subject: [PATCH] Added analog class for plasma current reading --- drivers/CMakeLists.txt | 1 + drivers/analog/CMakeLists.txt | 1 + drivers/analog/analog.cmake | 11 +++++++++++ drivers/analog/analog.cpp | 18 ++++++++++++++++++ drivers/analog/analog.hpp | 31 +++++++++++++++++++++++++++++++ 5 files changed, 62 insertions(+) create mode 100644 drivers/analog/CMakeLists.txt create mode 100644 drivers/analog/analog.cmake create mode 100644 drivers/analog/analog.cpp create mode 100644 drivers/analog/analog.hpp diff --git a/drivers/CMakeLists.txt b/drivers/CMakeLists.txt index 58a2bbd3..88d0b099 100644 --- a/drivers/CMakeLists.txt +++ b/drivers/CMakeLists.txt @@ -1,3 +1,4 @@ +add_subdirectory(analog) add_subdirectory(esp32spi) add_subdirectory(ioexpander) add_subdirectory(ltp305) diff --git a/drivers/analog/CMakeLists.txt b/drivers/analog/CMakeLists.txt new file mode 100644 index 00000000..06d94443 --- /dev/null +++ b/drivers/analog/CMakeLists.txt @@ -0,0 +1 @@ +include(analog.cmake) \ No newline at end of file diff --git a/drivers/analog/analog.cmake b/drivers/analog/analog.cmake new file mode 100644 index 00000000..69caf0a6 --- /dev/null +++ b/drivers/analog/analog.cmake @@ -0,0 +1,11 @@ +set(DRIVER_NAME analog) +add_library(${DRIVER_NAME} INTERFACE) + +target_sources(${DRIVER_NAME} INTERFACE + ${CMAKE_CURRENT_LIST_DIR}/${DRIVER_NAME}.cpp +) + +target_include_directories(${DRIVER_NAME} INTERFACE ${CMAKE_CURRENT_LIST_DIR}) + +# Pull in pico libraries that we need +target_link_libraries(${DRIVER_NAME} INTERFACE pico_stdlib hardware_adc) \ No newline at end of file diff --git a/drivers/analog/analog.cpp b/drivers/analog/analog.cpp new file mode 100644 index 00000000..f3179a7e --- /dev/null +++ b/drivers/analog/analog.cpp @@ -0,0 +1,18 @@ +#include "analog.hpp" + +namespace pimoroni { + uint16_t Analog::read_raw() { + return adc_read(); + } + + float Analog::read_voltage() { + return ((float)adc_read() * 3.3f) / (1 << 12) / amplifier_gain; + } + + float Analog::read_current() { + if(resistor > 0.0f) + return read_voltage() / resistor; + else + return read_voltage(); + } +}; \ No newline at end of file diff --git a/drivers/analog/analog.hpp b/drivers/analog/analog.hpp new file mode 100644 index 00000000..cad26e46 --- /dev/null +++ b/drivers/analog/analog.hpp @@ -0,0 +1,31 @@ +#pragma once + +#include +#include "pico/stdlib.h" +#include "hardware/adc.h" +#include "common/pimoroni_common.hpp" + +namespace pimoroni { + + class Analog { + public: + Analog(uint pin, float amplifier_gain = 1.0f, float resistor = 0.0f) : + pin(pin), amplifier_gain(amplifier_gain), resistor(resistor) { + adc_init(); + + //Make sure GPIO is high-impedance, no pullups etc + adc_gpio_init(pin); + + //Select ADC input 0 (GPIO26) + adc_select_input(pin - 26); + }; + uint16_t read_raw(); + float read_voltage(); + float read_current(); + private: + uint pin; + float amplifier_gain; + float resistor; + }; + +} \ No newline at end of file