From f07e878cd23e6e35743358ea306951f2218653a4 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Thu, 16 Jul 2020 20:11:26 -0400 Subject: [PATCH] added sample rate setting --- source/adc.cpp | 34 ++++++++++++++++++++++++++++++++++ source/adc.hpp | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/source/adc.cpp b/source/adc.cpp index 0c58e21..4e68a6e 100644 --- a/source/adc.cpp +++ b/source/adc.cpp @@ -39,6 +39,40 @@ adcsample_t *ADCd::getSamples(adcsample_t *buffer, size_t count) return buffer; } +void ADCd::setSampleRate(ADCdRate rate) +{ + uint32_t val = 0; + + switch (rate) { + case ADCdRate::R2P5: + val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_2P5); + break; + case ADCdRate::R6P5: + val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_6P5); + break; + case ADCdRate::R12P5: + val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_12P5); + break; + case ADCdRate::R24P5: + val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_24P5); + break; + case ADCdRate::R47P5: + val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_47P5); + break; + case ADCdRate::R92P5: + val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_92P5); + break; + case ADCdRate::R247P5: + val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_247P5); + break; + case ADCdRate::R640P5: + val = ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_640P5); + break; + } + + m_adc_group_config.smpr[0] = val; +} + void ADCd::initPins() { palSetPadMode(GPIOA, 0, PAL_MODE_INPUT_ANALOG); diff --git a/source/adc.hpp b/source/adc.hpp index 456e697..9989883 100644 --- a/source/adc.hpp +++ b/source/adc.hpp @@ -21,9 +21,53 @@ struct ADCdConfig : public ADCConfig ADCd *adcdinst; }; +enum class ADCdRate : unsigned int { + R2P5, + R6P5, + R12P5, + R24P5, + R47P5, + R92P5, + R247P5, + R640P5 +}; + class ADCd { public: + constexpr static const unsigned int CLOCK_RATE = 40000000; + constexpr static unsigned int SAMPLES_PER_SECOND(ADCdRate rate) { + unsigned int sps = 0; + switch (rate) { + case ADCdRate::R2P5: + sps = 15; + break; + case ADCdRate::R6P5: + sps = 19; + break; + case ADCdRate::R12P5: + sps = 25; + break; + case ADCdRate::R24P5: + sps = 37; + break; + case ADCdRate::R47P5: + sps = 60; + break; + case ADCdRate::R92P5: + sps = 105; + break; + case ADCdRate::R247P5: + sps = 260; + break; + case ADCdRate::R640P5: + sps = 653; + break; + } + + return static_cast(1.f / (sps / static_cast(CLOCK_RATE))); + } + constexpr explicit ADCd(ADCDriver& adcd, GPTDriver& gptd) : m_adcd(&adcd), m_gptd(&gptd), m_adc_config{}, m_adc_group_config(ADC_GROUP_CONFIG), @@ -31,6 +75,7 @@ public: void start(); adcsample_t *getSamples(adcsample_t *buffer, size_t count); + void setSampleRate(ADCdRate rate); private: static const GPTConfig m_gpt_config; @@ -43,6 +88,8 @@ private: bool m_is_adc_finished; void initPins(); + //void selectPins(bool a0, bool a1); + static void adcEndCallback(ADCDriver *adcd); constexpr static const ADCConversionGroup ADC_GROUP_CONFIG = {