Skip to content

Commit e30c50b

Browse files
committed
AdvancedADC: Add sample time argument to ADC constructors.
To enable sketches to override the default sample time. Signed-off-by: iabdalkader <[email protected]>
1 parent 2a20a32 commit e30c50b

File tree

4 files changed

+29
-12
lines changed

4 files changed

+29
-12
lines changed

src/AdvancedADC.cpp

+7-5
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,8 @@ DMABuffer<Sample> &AdvancedADC::read() {
129129
return NULLBUF;
130130
}
131131

132-
int AdvancedADC::begin(uint32_t resolution, uint32_t sample_rate, size_t n_samples, size_t n_buffers, bool start) {
132+
int AdvancedADC::begin(uint32_t resolution, uint32_t sample_rate, size_t n_samples,
133+
size_t n_buffers, bool start, adc_sample_time_t sample_time) {
133134

134135
ADCName instance = ADC_NP;
135136
// Sanity checks.
@@ -214,7 +215,7 @@ int AdvancedADC::begin(uint32_t resolution, uint32_t sample_rate, size_t n_sampl
214215
}
215216

216217
// Init and config ADC.
217-
if (hal_adc_config(&descr->adc, ADC_RES_LUT[resolution], descr->tim_trig, adc_pins, n_channels) < 0) {
218+
if (hal_adc_config(&descr->adc, ADC_RES_LUT[resolution], descr->tim_trig, adc_pins, n_channels, sample_time) < 0) {
218219
return 0;
219220
}
220221

@@ -268,18 +269,19 @@ AdvancedADC::~AdvancedADC() {
268269
dac_descr_deinit(descr, true);
269270
}
270271

271-
int AdvancedADCDual::begin(uint32_t resolution, uint32_t sample_rate, size_t n_samples, size_t n_buffers) {
272+
int AdvancedADCDual::begin(uint32_t resolution, uint32_t sample_rate, size_t n_samples,
273+
size_t n_buffers, adc_sample_time_t sample_time) {
272274
// The two ADCs must have the same number of channels.
273275
if (adc1.channels() != adc2.channels()) {
274276
return 0;
275277
}
276278

277279
// Configure the ADCs.
278-
if (!adc1.begin(resolution, sample_rate, n_samples, n_buffers, false)) {
280+
if (!adc1.begin(resolution, sample_rate, n_samples, n_buffers, false, sample_time)) {
279281
return 0;
280282
}
281283

282-
if (!adc2.begin(resolution, sample_rate, n_samples, n_buffers, false)) {
284+
if (!adc2.begin(resolution, sample_rate, n_samples, n_buffers, false, sample_time)) {
283285
adc1.stop();
284286
return 0;
285287
}

src/AdvancedADC.h

+17-4
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,17 @@
2626

2727
struct adc_descr_t;
2828

29+
typedef enum {
30+
AN_ADC_SAMPLETIME_1_5 = ADC_SAMPLETIME_1CYCLE_5,
31+
AN_ADC_SAMPLETIME_2_5 = ADC_SAMPLETIME_2CYCLES_5,
32+
AN_ADC_SAMPLETIME_8_5 = ADC_SAMPLETIME_8CYCLES_5,
33+
AN_ADC_SAMPLETIME_16_5 = ADC_SAMPLETIME_16CYCLES_5,
34+
AN_ADC_SAMPLETIME_32_5 = ADC_SAMPLETIME_32CYCLES_5,
35+
AN_ADC_SAMPLETIME_64_5 = ADC_SAMPLETIME_64CYCLES_5,
36+
AN_ADC_SAMPLETIME_387_5 = ADC_SAMPLETIME_387CYCLES_5,
37+
AN_ADC_SAMPLETIME_810_5 = ADC_SAMPLETIME_810CYCLES_5,
38+
} adc_sample_time_t;
39+
2940
class AdvancedADC {
3041
private:
3142
size_t n_channels;
@@ -49,9 +60,10 @@ class AdvancedADC {
4960
bool available();
5061
SampleBuffer read();
5162
int begin(uint32_t resolution, uint32_t sample_rate, size_t n_samples,
52-
size_t n_buffers, bool start=true);
63+
size_t n_buffers, bool start=true, adc_sample_time_t sample_time=AN_ADC_SAMPLETIME_8_5);
5364
int begin(uint32_t resolution, uint32_t sample_rate, size_t n_samples,
54-
size_t n_buffers, size_t n_pins, pin_size_t *pins, bool start=true) {
65+
size_t n_buffers, size_t n_pins, pin_size_t *pins, bool start=true,
66+
adc_sample_time_t sample_time=AN_ADC_SAMPLETIME_8_5) {
5567
if (n_pins > AN_MAX_ADC_CHANNELS) {
5668
n_pins = AN_MAX_ADC_CHANNELS;
5769
}
@@ -60,7 +72,7 @@ class AdvancedADC {
6072
}
6173

6274
n_channels = n_pins;
63-
return begin(resolution, sample_rate, n_samples, n_buffers, start);
75+
return begin(resolution, sample_rate, n_samples, n_buffers, start, sample_time);
6476
}
6577
int start(uint32_t sample_rate);
6678
int stop();
@@ -79,7 +91,8 @@ class AdvancedADCDual {
7991
n_channels(0), adc1(adc1_in), adc2(adc2_in) {
8092
}
8193
~AdvancedADCDual();
82-
int begin(uint32_t resolution, uint32_t sample_rate, size_t n_samples, size_t n_buffers);
94+
int begin(uint32_t resolution, uint32_t sample_rate, size_t n_samples,
95+
size_t n_buffers, adc_sample_time_t sample_time=AN_ADC_SAMPLETIME_8_5);
8396
int stop();
8497
};
8598

src/HALConfig.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,8 @@ static uint32_t ADC_RANK_LUT[] = {
170170
ADC_REGULAR_RANK_13, ADC_REGULAR_RANK_14, ADC_REGULAR_RANK_15, ADC_REGULAR_RANK_16
171171
};
172172

173-
int hal_adc_config(ADC_HandleTypeDef *adc, uint32_t resolution, uint32_t trigger, PinName *adc_pins, uint32_t n_channels) {
173+
int hal_adc_config(ADC_HandleTypeDef *adc, uint32_t resolution, uint32_t trigger,
174+
PinName *adc_pins, uint32_t n_channels, uint32_t sample_time) {
174175
// Set ADC clock source.
175176
__HAL_RCC_ADC_CONFIG(RCC_ADCCLKSOURCE_CLKP);
176177

@@ -208,7 +209,7 @@ int hal_adc_config(ADC_HandleTypeDef *adc, uint32_t resolution, uint32_t trigger
208209
sConfig.Offset = 0;
209210
sConfig.OffsetNumber = ADC_OFFSET_NONE;
210211
sConfig.SingleDiff = ADC_SINGLE_ENDED;
211-
sConfig.SamplingTime = ADC_SAMPLETIME_8CYCLES_5;
212+
sConfig.SamplingTime = sample_time;
212213

213214
for (size_t rank=0; rank<n_channels; rank++) {
214215
uint32_t function = pinmap_function(adc_pins[rank], PinMap_ADC);

src/HALConfig.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ size_t hal_dma_get_ct(DMA_HandleTypeDef *dma);
2929
void hal_dma_enable_dbm(DMA_HandleTypeDef *dma, void *m0 = nullptr, void *m1 = nullptr);
3030
void hal_dma_update_memory(DMA_HandleTypeDef *dma, void *addr);
3131
int hal_dac_config(DAC_HandleTypeDef *dac, uint32_t channel, uint32_t trigger);
32-
int hal_adc_config(ADC_HandleTypeDef *adc, uint32_t resolution, uint32_t trigger, PinName *adc_pins, uint32_t n_channels);
32+
int hal_adc_config(ADC_HandleTypeDef *adc, uint32_t resolution, uint32_t trigger,
33+
PinName *adc_pins, uint32_t n_channels, uint32_t sample_time);
3334
int hal_adc_enable_dual_mode(bool enable);
3435
int hal_i2s_config(I2S_HandleTypeDef *i2s, uint32_t sample_rate, uint32_t mode, bool mck_enable);
3536

0 commit comments

Comments
 (0)