From 6a9433c1ef495cd3f992fb3fd586677f4cc18b7c Mon Sep 17 00:00:00 2001 From: Andreea Radoescu Date: Sun, 25 Oct 2026 18:38:41 +0100 Subject: fixed adc driver --- firmware/CMakeLists.txt | 1 + firmware/src/adc.hpp | 59 +++++++------------------------------------------ 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 +#include "hardware/adc.h" #include namespace { - -constexpr std::uint32_t base_address = 0x4004'c000u; -std::uint32_t volatile * const control_status_addr = reinterpret_cast(base_address + 0x0u); -std::uint32_t volatile * const result_addr = reinterpret_cast(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 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 get_samples() { - while (!ready()); - std::array 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(measurement * 127u / 4095u); // TODO add hysteresis } return samples; -- cgit v1.2.3