I played around with the SAADC sampling A4 pin. When I connect to GND, I see negative values sometimes. If I connect to 3.3V I see value 235/236 which is, what I expect.
Further I see a high negative value at first sample.
Since I set the ADC to 8 Bit, I expect a 8 Bit value, -128....127 or 0...255.
Is there an error in my declaration?
What can I do to avoid the strange value of sample 0?
Code:
/**
* Test of analog Input capabilities
* infocenter.nordicsemi.com/index.jsp
*
*/
int ANALOG_SENSE_PIN = A4; // select the input pin for the battery sense point
unsigned long PAUSE_TIME = 100; // sleep time between reads (seconds * 1000 milliseconds)
uint16_t counter=0;
int16_t sampleval=0;
int16_t anaVal()
{
// Serial.println("Inside hwCPUVoltage function.");
#if defined(NRF_SAADC)
// NRF52:
// Settings: 8Bit, AnalogInput4, 3us Time, internal ref., 1/6 gain, no oversample
// Serial.println("This is an NRF_SAADC.");
int32_t sample;
NRF_SAADC->ENABLE = SAADC_ENABLE_ENABLE_Enabled << SAADC_ENABLE_ENABLE_Pos;
NRF_SAADC->RESOLUTION = SAADC_RESOLUTION_VAL_8bit << SAADC_RESOLUTION_VAL_Pos;
NRF_SAADC->CH[0].PSELP = SAADC_CH_PSELP_PSELP_AnalogInput4 << SAADC_CH_PSELP_PSELP_Pos;
NRF_SAADC->CH[0].PSELN = SAADC_CH_PSELN_PSELN_NC << SAADC_CH_PSELN_PSELN_Pos;
NRF_SAADC->CH[0].CONFIG = (SAADC_CH_CONFIG_BURST_Disabled << SAADC_CH_CONFIG_BURST_Pos) |
(SAADC_CH_CONFIG_MODE_SE << SAADC_CH_CONFIG_MODE_Pos) |
(SAADC_CH_CONFIG_TACQ_3us << SAADC_CH_CONFIG_TACQ_Pos) |
(SAADC_CH_CONFIG_REFSEL_Internal << SAADC_CH_CONFIG_REFSEL_Pos) |
(SAADC_CH_CONFIG_GAIN_Gain1_6 << SAADC_CH_CONFIG_GAIN_Pos) |
(SAADC_CH_CONFIG_RESN_Bypass << SAADC_CH_CONFIG_RESN_Pos) |
(SAADC_CH_CONFIG_RESP_Bypass << SAADC_CH_CONFIG_RESP_Pos);
NRF_SAADC->OVERSAMPLE = SAADC_OVERSAMPLE_OVERSAMPLE_Bypass << SAADC_OVERSAMPLE_OVERSAMPLE_Pos;
NRF_SAADC->SAMPLERATE = SAADC_SAMPLERATE_MODE_Task << SAADC_SAMPLERATE_MODE_Pos;
NRF_SAADC->RESULT.MAXCNT = 1;
NRF_SAADC->EVENTS_STARTED = 0;
NRF_SAADC->TASKS_START = 1;
while (!NRF_SAADC->EVENTS_STARTED);
NRF_SAADC->EVENTS_STARTED = 0;
NRF_SAADC->EVENTS_END = 0;
NRF_SAADC->TASKS_SAMPLE = 1;
while (!NRF_SAADC->EVENTS_END);
NRF_SAADC->EVENTS_END = 0;
NRF_SAADC->EVENTS_STOPPED = 0;
NRF_SAADC->TASKS_STOP = 1;
while (!NRF_SAADC->EVENTS_STOPPED);
NRF_SAADC->EVENTS_STOPPED = 1;
NRF_SAADC->RESULT.PTR = (int32_t)&sample;
// NRF_SAADC->ENABLE = (SAADC_ENABLE_ENABLE_Disabled << SAADC_ENABLE_ENABLE_Pos);
return sample;
#else
Serial.println("Unknown MCU!!");
// unknown MCU
return 0;
#endif
}
void setup()
{
Serial.begin(115200);
Serial.println("Setup procedure beginning.");
}
void loop() {
while (true) {
sampleval=anaVal();
Serial.print("Sample:");
Serial.print(counter++);
Serial.print(" value:");
Serial.println(sampleval);
delay(PAUSE_TIME);
}
}
Output:
18:16:40.944 -> Setup procedure beginning.
18:16:40.944 -> Sample:0 value:-23131
18:16:41.045 -> Sample:1 value:0
18:16:41.145 -> Sample:2 value:0
18:16:41.245 -> Sample:3 value:0
18:16:41.346 -> Sample:4 value:0
18:16:41.446 -> Sample:5 value:0
18:16:41.546 -> Sample:6 value:0
18:16:41.647 -> Sample:7 value:0
18:16:41.747 -> Sample:8 value:0
18:16:41.847 -> Sample:9 value:-1
18:16:41.948 -> Sample:10 value:-1
18:16:42.048 -> Sample:11 value:0
18:16:42.148 -> Sample:12 value:0
18:16:42.249 -> Sample:13 value:0
18:16:42.349 -> Sample:14 value:0
18:16:42.449 -> Sample:15 value:0
18:16:42.550 -> Sample:16 value:0
18:16:42.650 -> Sample:17 value:0
18:16:42.750 -> Sample:18 value:0
18:16:42.850 -> Sample:19 value:0
18:16:42.951 -> Sample:20 value:0
18:16:43.051 -> Sample:21 value:0
18:16:43.151 -> Sample:22 value:-1
18:16:43.252 -> Sample:23 value:0
18:16:43.352 -> Sample:24 value:0
18:16:43.452 -> Sample:25 value:0
18:16:43.552 -> Sample:26 value:-1
18:16:43.653 -> Sample:27 value:0
18:16:43.753 -> Sample:28 value:0
18:16:43.853 -> Sample:29 value:-1