Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit179413a

Browse files
committed
atmel-samd: Support multiple ADC channels at once.
Fixesadafruit#61
1 parentd239dbd commit179413a

File tree

2 files changed

+38
-20
lines changed

2 files changed

+38
-20
lines changed

‎atmel-samd/common-hal/nativeio/AnalogIn.c‎

Lines changed: 37 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
#include<string.h>
2828

29+
#include"py/gc.h"
2930
#include"py/nlr.h"
3031
#include"py/runtime.h"
3132
#include"py/binary.h"
@@ -35,6 +36,10 @@
3536
#include"asf/sam0/drivers/adc/adc.h"
3637
#include"samd21_pins.h"
3738

39+
// Number of active ADC channels.
40+
volatileuint8_tactive_channel_count;
41+
structadc_module*adc_instance=NULL;
42+
3843
voidcommon_hal_nativeio_analogin_construct(nativeio_analogin_obj_t*self,
3944
constmcu_pin_obj_t*pin) {
4045
if (!pin->has_adc) {
@@ -44,42 +49,55 @@ void common_hal_nativeio_analogin_construct(nativeio_analogin_obj_t* self,
4449

4550
self->pin=pin;
4651

47-
structadc_configconfig_adc;
48-
adc_get_config_defaults(&config_adc);
52+
if (adc_instance==NULL) {
53+
structadc_configconfig_adc;
54+
adc_get_config_defaults(&config_adc);
55+
56+
config_adc.reference=ADC_REFERENCE_INTVCC1;
57+
config_adc.gain_factor=ADC_GAIN_FACTOR_DIV2;
58+
config_adc.positive_input=self->pin->adc_input;
59+
config_adc.resolution=ADC_RESOLUTION_16BIT;
60+
config_adc.clock_prescaler=ADC_CLOCK_PRESCALER_DIV128;
61+
62+
// Allocate the instance on the heap so we only use the memory when we
63+
// need it.
64+
adc_instance=gc_alloc(sizeof(structadc_module), false);
4965

50-
config_adc.reference=ADC_REFERENCE_INTVCC1;
51-
config_adc.gain_factor=ADC_GAIN_FACTOR_DIV2;
52-
config_adc.positive_input=self->pin->adc_input;
53-
config_adc.resolution=ADC_RESOLUTION_16BIT;
54-
config_adc.clock_prescaler=ADC_CLOCK_PRESCALER_DIV128;
66+
adc_init(adc_instance,ADC,&config_adc);
67+
}
5568

56-
adc_init(&self->adc_instance,ADC,&config_adc);
69+
self->adc_instance=adc_instance;
70+
active_channel_count++;
5771
}
5872

5973
voidcommon_hal_nativeio_analogin_deinit(nativeio_analogin_obj_t*self) {
60-
// TODO(tannewt): Count how many pins are in use and only reset the ADC when
61-
// none are used.
62-
adc_reset(&self->adc_instance);
74+
active_channel_count--;
75+
if (active_channel_count==0) {
76+
adc_reset(adc_instance);
77+
gc_free(adc_instance);
78+
// Set our reference to NULL so the GC doesn't mistakenly see the
79+
// pointer in memory.
80+
adc_instance=NULL;
81+
}
6382
reset_pin(self->pin->pin);
6483
}
6584

66-
// TODO(tannewt): Don't turn it all on just for one read. This simplifies
67-
// handling of reading multiple inputs and surviving sleep though so for now its
68-
// ok.
6985
uint16_tcommon_hal_nativeio_analogin_get_value(nativeio_analogin_obj_t*self) {
70-
adc_enable(&self->adc_instance);
71-
adc_start_conversion(&self->adc_instance);
86+
adc_set_positive_input(adc_instance,self->pin->adc_input);
87+
88+
adc_enable(adc_instance);
89+
adc_start_conversion(adc_instance);
7290

7391
uint16_tdata;
74-
enumstatus_codestatus=adc_read(&self->adc_instance,&data);
92+
enumstatus_codestatus=adc_read(adc_instance,&data);
7593
while (status==STATUS_BUSY) {
76-
status=adc_read(&self->adc_instance,&data);
94+
status=adc_read(adc_instance,&data);
7795
}
7896
if (status==STATUS_ERR_OVERFLOW) {
7997
// TODO(tannewt): Throw an error.
8098
}
8199

82-
adc_disable(&self->adc_instance);
100+
adc_disable(adc_instance);
83101
returndata;
84102
}
85103

‎atmel-samd/common-hal/nativeio/types.h‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
typedefstruct {
5656
mp_obj_base_tbase;
5757
constmcu_pin_obj_t*pin;
58-
structadc_moduleadc_instance;
58+
structadc_module*adc_instance;
5959
}nativeio_analogin_obj_t;
6060

6161
typedefstruct {

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp