Skip to content

Commit 8c8d643

Browse files
committed
Added analog oversampling
Implemented analog oversampling which allows any analog pin to be automatically sampled muliple times (upto 256) when analogRead() is used. An average of the samples is then returned.
1 parent d718112 commit 8c8d643

File tree

2 files changed

+53
-1
lines changed

2 files changed

+53
-1
lines changed

cores/nRF5/wiring_analog.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,13 @@ typedef enum _eAnalogReference
6161
*/
6262
extern void analogReference( eAnalogReference ulMode ) ;
6363

64+
/*
65+
* \brief Configures the oversampling amount used to sample analog input.
66+
*
67+
* \param ulOversampling Should be set to 1, 2, 4, 8, 16, 32, 64, 128 or 256.
68+
*/
69+
extern void analogOversampling( uint32_t ulOversampling );
70+
6471
/*
6572
* \brief Writes an analog value (PWM wave) to a pin.
6673
*

cores/nRF5/wiring_analog_nRF52.c

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ extern "C" {
3131
static uint32_t saadcReference = SAADC_CH_CONFIG_REFSEL_Internal;
3232
static uint32_t saadcGain = SAADC_CH_CONFIG_GAIN_Gain1_6;
3333

34+
static uint32_t saadcOversampling = SAADC_OVERSAMPLE_OVERSAMPLE_Bypass;
35+
static bool saadcBurst = SAADC_CH_CONFIG_BURST_Disabled;
36+
3437
#if 0 // Note: Adafruit use seperated HardwarePWM class
3538
#define PWM_COUNT 3
3639

@@ -124,6 +127,47 @@ void analogReference( eAnalogReference ulMode )
124127
}
125128
}
126129

130+
void analogOversampling( uint32_t ulOversampling )
131+
{
132+
if(ulOversampling > 0) saadcBurst = SAADC_CH_CONFIG_BURST_Enabled; // burst mode has to be enable to use oversampling
133+
else saadcBurst = SAADC_CH_CONFIG_BURST_Disabled;
134+
135+
switch (ulOversampling) {
136+
case 0:
137+
case 1:
138+
saadcBurst = SAADC_CH_CONFIG_BURST_Disabled;
139+
NRF_SAADC->OVERSAMPLE = SAADC_OVERSAMPLE_OVERSAMPLE_Bypass;
140+
return;
141+
break;
142+
case 2:
143+
NRF_SAADC->OVERSAMPLE = SAADC_OVERSAMPLE_OVERSAMPLE_Over2x;
144+
break;
145+
case 4:
146+
NRF_SAADC->OVERSAMPLE = SAADC_OVERSAMPLE_OVERSAMPLE_Over4x;
147+
break;
148+
case 8:
149+
NRF_SAADC->OVERSAMPLE = SAADC_OVERSAMPLE_OVERSAMPLE_Over8x;
150+
break;
151+
case 16:
152+
NRF_SAADC->OVERSAMPLE = SAADC_OVERSAMPLE_OVERSAMPLE_Over16x;
153+
break;
154+
case 32:
155+
NRF_SAADC->OVERSAMPLE = SAADC_OVERSAMPLE_OVERSAMPLE_Over32x;
156+
break;
157+
case 64:
158+
NRF_SAADC->OVERSAMPLE = SAADC_OVERSAMPLE_OVERSAMPLE_Over64x;
159+
break;
160+
case 128:
161+
NRF_SAADC->OVERSAMPLE = SAADC_OVERSAMPLE_OVERSAMPLE_Over128x;
162+
break;
163+
case 256:
164+
NRF_SAADC->OVERSAMPLE = SAADC_OVERSAMPLE_OVERSAMPLE_Over256x;
165+
break;
166+
}
167+
168+
saadcBurst = SAADC_CH_CONFIG_BURST_Enabled;
169+
}
170+
127171
uint32_t analogRead( uint32_t ulPin )
128172
{
129173
uint32_t pin = SAADC_CH_PSELP_PSELP_NC;
@@ -200,7 +244,8 @@ uint32_t analogRead( uint32_t ulPin )
200244
| ((saadcGain << SAADC_CH_CONFIG_GAIN_Pos) & SAADC_CH_CONFIG_GAIN_Msk)
201245
| ((saadcReference << SAADC_CH_CONFIG_REFSEL_Pos) & SAADC_CH_CONFIG_REFSEL_Msk)
202246
| ((SAADC_CH_CONFIG_TACQ_3us << SAADC_CH_CONFIG_TACQ_Pos) & SAADC_CH_CONFIG_TACQ_Msk)
203-
| ((SAADC_CH_CONFIG_MODE_SE << SAADC_CH_CONFIG_MODE_Pos) & SAADC_CH_CONFIG_MODE_Msk);
247+
| ((SAADC_CH_CONFIG_MODE_SE << SAADC_CH_CONFIG_MODE_Pos) & SAADC_CH_CONFIG_MODE_Msk)
248+
| ((saadcBurst << SAADC_CH_CONFIG_BURST_Pos) & SAADC_CH_CONFIG_BURST_Msk);
204249
NRF_SAADC->CH[0].PSELN = pin;
205250
NRF_SAADC->CH[0].PSELP = pin;
206251

0 commit comments

Comments
 (0)