]> code.bitgloo.com Git - clyne/stmdsp.git/commitdiff
added sample rate setting 1/head
authorClyne Sullivan <clyne@bitgloo.com>
Fri, 17 Jul 2020 00:11:26 +0000 (20:11 -0400)
committerClyne Sullivan <clyne@bitgloo.com>
Fri, 17 Jul 2020 00:11:26 +0000 (20:11 -0400)
source/adc.cpp
source/adc.hpp

index 0c58e21d5404d0f0d912cb6af9a312ba530b37b4..4e68a6e742050e1c29c84dbe4b296bdcb77dfc53 100644 (file)
@@ -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);
index 456e697a948e9a7c09eecd9fc30f9e171d55ca9c..99898838bd27a94735ec0be2e67606e881f1d27a 100644 (file)
@@ -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<unsigned int>(1.f / (sps / static_cast<float>(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 = {