aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--firmware/CMakeLists.txt1
-rw-r--r--firmware/src/adc.hpp59
2 files changed, 9 insertions, 51 deletions
diff --git a/firmware/CMakeLists.txt b/firmware/CMakeLists.txt
index 3cd65fc..3c4c106 100644
--- a/firmware/CMakeLists.txt
+++ b/firmware/CMakeLists.txt
@@ -46,6 +46,7 @@ target_include_directories(firmware PRIVATE
# Add any user requested libraries
target_link_libraries(firmware
hardware_i2c
+ hardware_adc
)
pico_add_extra_outputs(firmware)
diff --git a/firmware/src/adc.hpp b/firmware/src/adc.hpp
index ef596bc..d7842aa 100644
--- a/firmware/src/adc.hpp
+++ b/firmware/src/adc.hpp
@@ -1,50 +1,10 @@
+#pragma once
#include <array>
+#include "hardware/adc.h"
#include <cstdint>
namespace
{
-
-constexpr std::uint32_t base_address = 0x4004'c000u;
-std::uint32_t volatile * const control_status_addr = reinterpret_cast<std::uint32_t*>(base_address + 0x0u);
-std::uint32_t volatile * const result_addr = reinterpret_cast<std::uint32_t*>(base_address + 0x4u);
-
-void
-select_input(std::uint32_t index)
-{
- constexpr std::uint32_t ainsel = 0x111u;
- *control_status_addr = (*control_status_addr & ~(ainsel << 12)) | ((index & ainsel) << 12);
-}
-
-bool
-ready()
-{
- return (*control_status_addr & 1u << 8) != 0u;
-}
-
-bool
-error()
-{
- return (*control_status_addr & 1u << 9) != 0u;
-}
-
-void
-start_once()
-{
- *control_status_addr |= (1u << 2);
-}
-
-void
-enable(bool en)
-{
- *control_status_addr |= en ? (1u << 2) : 0u;
-}
-
-std::uint32_t
-result()
-{
- return *result_addr & 0x0000'0fffu;
-}
-
std::array<std::uint32_t, 2> previous_samples { 0xffff'ffffu, 0xffff'ffffu };
}
@@ -61,26 +21,23 @@ struct Sample
void
init()
{
- enable(true);
+ adc_init();
+ adc_gpio_init(26);
+ adc_gpio_init(27);
}
std::array<Sample, 2>
get_samples()
{
- while (!ready());
-
std::array<Sample, 2> samples {};
for (std::size_t i = 0; i < samples.size(); i++)
{
- select_input(i);
- start_once();
-
- while (!ready());
+ adc_select_input(i);
- std::uint32_t const measurement = result();
+ std::uint16_t const measurement = adc_read();
samples[i].changed = measurement != previous_samples[i];
previous_samples[i] = measurement;
- samples[i].value = measurement * 127u / 4095u; // TODO add hysteresis
+ samples[i].value = static_cast<uint8_t>(measurement * 127u / 4095u); // TODO add hysteresis
}
return samples;