/** * @file adc.hpp * @brief Wrapper for ChibiOS's ADCDriver. * * Copyright (C) 2020 Clyne Sullivan * * Distributed under the GNU GPL v3 or later. You should have received a copy of * the GNU General Public License along with this program. * If not, see . */ #ifndef STMDSP_ADC_HPP_ #define STMDSP_ADC_HPP_ #include "hal.h" class ADCd; 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), m_is_adc_finished(false) {} void start(); adcsample_t *getSamples(adcsample_t *buffer, size_t count); void setSampleRate(ADCdRate rate); private: static const GPTConfig m_gpt_config; ADCDriver *m_adcd; GPTDriver *m_gptd; ADCdConfig m_adc_config; ADCConversionGroup m_adc_group_config; 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 = { .circular = false, .num_channels = 1, .end_cb = ADCd::adcEndCallback, .error_cb = nullptr, .cfgr = ADC_CFGR_EXTEN_RISING | ADC_CFGR_EXTSEL_SRC(12), /* TIM4_TRGO */ .cfgr2 = 0, .tr1 = ADC_TR(0, 4095), .smpr = { ADC_SMPR1_SMP_AN5(ADC_SMPR_SMP_247P5), 0 }, .sqr = { ADC_SQR1_SQ1_N(ADC_CHANNEL_IN5), 0, 0, 0 } }; }; #endif // STMDSP_ADC_HPP_