Skip to content

Commit 166b43b

Browse files
superdutyladyada
authored andcommitted
Update wiring_analog.c and wiring_analog.h (arduino#74)
* Update wiring_analog.c and wiring_analog.h * Correct typos in comments so voltages are correctly identified
1 parent 2fed3d2 commit 166b43b

File tree

2 files changed

+77
-22
lines changed

2 files changed

+77
-22
lines changed

cores/arduino/wiring_analog.c

Lines changed: 68 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -140,38 +140,87 @@ void analogReference(eAnalogReference mode)
140140
//TODO: fix gains
141141
switch (mode)
142142
{
143-
case AR_INTERNAL:
144-
case AR_INTERNAL2V23:
143+
case AR_INTERNAL1V0:
144+
//ADC0->GAINCORR.reg = ADC_GAINCORR_GAINCORR(); // Gain Factor Selection
145+
SUPC->VREF.bit.SEL = SUPC_VREF_SEL_1V0_Val; // select 1.0V
146+
SUPC->VREF.bit.VREFOE = 1; // Turn on for use with ADC
147+
ADC0->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTREF_Val; // Use SUPC.VREF
148+
ADC1->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTREF_Val; //
149+
break;
150+
151+
case AR_INTERNAL1V1:
145152
//ADC0->GAINCORR.reg = ADC_GAINCORR_GAINCORR(); // Gain Factor Selection
146-
ADC0->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTVCC0_Val; // 1/1.48 VDDANA = 1/1.48* 3V3 = 2.2297
147-
ADC1->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTVCC0_Val; // 1/1.48 VDDANA = 1/1.48* 3V3 = 2.2297
153+
SUPC->VREF.bit.SEL = SUPC_VREF_SEL_1V1_Val; // select 1.1V
154+
SUPC->VREF.bit.VREFOE = 1; // Turn on for use with ADC
155+
ADC0->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTREF_Val; // Use SUPC.VREF
156+
ADC1->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTREF_Val; //
157+
break;
158+
159+
case AR_INTERNAL1V2:
160+
//ADC0->GAINCORR.reg = ADC_GAINCORR_GAINCORR(); // Gain Factor Selection
161+
SUPC->VREF.bit.SEL = SUPC_VREF_SEL_1V2_Val; // select 1V2
162+
SUPC->VREF.bit.VREFOE = 1; // Turn on for use with ADC
163+
ADC0->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTREF_Val; // Use SUPC.VREF
164+
ADC1->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTREF_Val; //
148165
break;
149166

167+
case AR_INTERNAL1V25:
168+
//ADC0->GAINCORR.reg = ADC_GAINCORR_GAINCORR(); // Gain Factor Selection
169+
SUPC->VREF.bit.SEL = SUPC_VREF_SEL_1V25_Val; // select 1.25V
170+
SUPC->VREF.bit.VREFOE = 1; // Turn on for use with ADC
171+
ADC0->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTREF_Val; // Use SUPC.VREF
172+
ADC1->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTREF_Val; //
173+
break;
174+
175+
case AR_INTERNAL2V0:
176+
//ADC0->GAINCORR.reg = ADC_GAINCORR_GAINCORR(); // Gain Factor Selection
177+
SUPC->VREF.bit.SEL = SUPC_VREF_SEL_2V0_Val; // select 2.0V
178+
SUPC->VREF.bit.VREFOE = 1; // Turn on for use with ADC
179+
ADC0->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTREF_Val; // Use SUPC.VREF
180+
ADC1->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTREF_Val; //
181+
break;
182+
183+
case AR_INTERNAL2V2:
184+
//ADC0->GAINCORR.reg = ADC_GAINCORR_GAINCORR(); // Gain Factor Selection
185+
SUPC->VREF.bit.SEL = SUPC_VREF_SEL_2V2_Val; // select 2.2V
186+
SUPC->VREF.bit.VREFOE = 1; // Turn on for use with ADC
187+
ADC0->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTREF_Val; // Use SUPC.VREF
188+
ADC1->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTREF_Val; //
189+
break;
190+
191+
case AR_INTERNAL2V4:
192+
//ADC0->GAINCORR.reg = ADC_GAINCORR_GAINCORR(); // Gain Factor Selection
193+
SUPC->VREF.bit.SEL = SUPC_VREF_SEL_2V4_Val; // select 2.4V
194+
SUPC->VREF.bit.VREFOE = 1; // Turn on for use with ADC
195+
ADC0->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTREF_Val; // Use SUPC.VREF
196+
ADC1->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTREF_Val; //
197+
break;
198+
199+
case AR_INTERNAL2V5:
200+
//ADC0->GAINCORR.reg = ADC_GAINCORR_GAINCORR(); // Gain Factor Selection
201+
SUPC->VREF.bit.SEL = SUPC_VREF_SEL_2V5_Val; // select 2.5V
202+
SUPC->VREF.bit.VREFOE = 1; // Turn on for use with ADC
203+
ADC0->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTREF_Val; // Use SUPC.VREF
204+
ADC1->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTREF_Val; //
205+
break;
206+
150207
case AR_EXTERNAL:
151208
//ADC0->INPUTCTRL.bit.GAIN = ADC_INPUTCTRL_GAIN_1X_Val; // Gain Factor Selection
152-
ADC0->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_AREFA_Val;
209+
ADC0->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_AREFA_Val; // AREF is jumpered to VCC, so 3.3V
153210
ADC1->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_AREFA_Val;
154211
break;
155212

156-
/* Don't think this works on SAMD51
157-
case AR_INTERNAL1V0:
158-
//ADC0->INPUTCTRL.bit.GAIN = ADC_INPUTCTRL_GAIN_1X_Val; // Gain Factor Selection
159-
ADC0->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INT1V_Val; // 1.0V voltage reference
160-
break;
161-
*/
162-
163213
case AR_INTERNAL1V65:
164-
//ADC0->INPUTCTRL.bit.GAIN = ADC_INPUTCTRL_GAIN_1X_Val; // Gain Factor Selection
165-
ADC0->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTVCC1_Val; // 1/2 VDDANA = 0.5* 3V3 = 1.65V
166-
ADC1->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTVCC1_Val; // 1/2 VDDANA = 0.5* 3V3 = 1.65V
214+
//ADC0->INPUTCTRL.bit.GAIN = ADC_INPUTCTRL_GAIN_DIV2_Val;
215+
ADC0->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTVCC0_Val; // 1/2 VDDANA = 1.65
216+
ADC1->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTVCC0_Val; //
167217
break;
168-
218+
169219
case AR_DEFAULT:
170220
default:
171221
//ADC0->INPUTCTRL.bit.GAIN = ADC_INPUTCTRL_GAIN_DIV2_Val;
172-
ADC0->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTVCC1_Val; // 1/2 VDDANA = 0.5* 3V3 = 1.65V
173-
ADC1->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTVCC1_Val; // 1/2 VDDANA = 0.5* 3V3 = 1.65V
174-
222+
ADC0->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTVCC1_Val; // VDDANA = 3V3
223+
ADC1->REFCTRL.bit.REFSEL = ADC_REFCTRL_REFSEL_INTVCC1_Val; //
175224
break;
176225
}
177226

cores/arduino/wiring_analog.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,20 @@ extern "C" {
2727
/*
2828
* \brief SAMD products have only one reference for ADC
2929
*/
30+
// add internal voltages for ATSAMD51 SUPC VREF register
3031
typedef enum _eAnalogReference
3132
{
3233
AR_DEFAULT,
33-
AR_INTERNAL,
34-
AR_EXTERNAL,
3534
AR_INTERNAL1V0,
35+
AR_INTERNAL1V1,
36+
AR_INTERNAL1V2,
37+
AR_INTERNAL1V25,
38+
AR_INTERNAL2V0,
39+
AR_INTERNAL2V2,
40+
AR_INTERNAL2V4,
41+
AR_INTERNAL2V5,
3642
AR_INTERNAL1V65,
37-
AR_INTERNAL2V23
43+
AR_EXTERNAL
3844
} eAnalogReference ;
3945

4046

0 commit comments

Comments
 (0)