SAADC library and drivers for nrf52832.
Dependents: acd52832_SAADC_Differential_input_EPD acd52832_Car_battery_ch acd52832_Car_battery_ch_2
Library to use aconno drivers for Nordic Semiconductor nrf52832 SAADC.
acd_nrf52_saadc.cpp
- Committer:
- jurica238814
- Date:
- 2017-10-04
- Revision:
- 10:b763d9cfc063
- Parent:
- 9:a1eacc3f0cbb
File content as of revision 10:b763d9cfc063:
/*
* Made by Jurica Resetar and Karlo Milicevic @ aconno, 2017
* jurica_resetar@yahoo.com
* aconno.de
* All rights reserved
*
*/
#include "acd_nrf52_saadc.h"
uint8_t NRF52_SAADC::channelCounter = 0;
int16_t NRF52_SAADC::data[sizeof(int16_t)*NUM_OF_CHANNELS] = {0};
NRF52_SAADC::NRF52_SAADC(uint8_t analogIn): channel(channelCounter){
if(!channelCounter){
// Do this for the first object only
NRF_SAADC->ENABLE = 1;
NRF_SAADC->RESULT.PTR =(uint32_t)data; // Pass pointer to results buffer
NRF_SAADC->RESOLUTION = 3;
calibrate();
}
if(channelCounter < 8){
NRF_SAADC->CH[channel].PSELP = analogIn + 1;
NRF_SAADC->CH[channel].CONFIG = 0x00021000; // reset
channelCounter++;
NRF_SAADC->RESULT.MAXCNT = channelCounter;
}
}
NRF52_SAADC::NRF52_SAADC(uint8_t pPin, uint8_t nPin): channel(channelCounter){
if(!channelCounter){
// Do this for the first object only
NRF_SAADC->ENABLE = 1;
NRF_SAADC->RESULT.PTR =(uint32_t)data; // Pass pointer to results buffer
NRF_SAADC->RESOLUTION = 3;
calibrate();
}
if(channelCounter < 8){
NRF_SAADC->CH[channel].PSELP = pPin + 1;
NRF_SAADC->CH[channel].PSELN = nPin + 1;
NRF_SAADC->CH[channel].CONFIG = 0x00121200; // differential input, Gain 1
channelCounter++;
NRF_SAADC->RESULT.MAXCNT = channelCounter;
}
}
NRF52_SAADC::~NRF52_SAADC(){
NRF_SAADC->ENABLE = 0;
}
int16_t NRF52_SAADC::read(){
updateData();
return data[channel];
}
void NRF52_SAADC::updateData(){
NRF_SAADC->TASKS_START = 1;
while(!NRF_SAADC->EVENTS_STARTED);
NRF_SAADC->TASKS_SAMPLE = 1;
for(uint8_t i = 0; i < channelCounter; ++i){
while(!NRF_SAADC->EVENTS_RESULTDONE);
while(!NRF_SAADC->EVENTS_DONE);
while(!NRF_SAADC->EVENTS_END);
while(NRF_SAADC->STATUS == 1); // while conversion is is progress
}
NRF_SAADC->TASKS_STOP = 1;
while(!NRF_SAADC->EVENTS_STOPPED);
}
void NRF52_SAADC::calibrate(){
NRF_SAADC->TASKS_CALIBRATEOFFSET = 1;
while(!NRF_SAADC->EVENTS_CALIBRATEDONE);
}