diff options
Diffstat (limited to 'firmware')
| -rw-r--r-- | firmware/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | 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 <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; |
