SAADC library and drivers for nrf52832.

Dependents:   acd52832_SAADC_Differential_input_EPD acd52832_Car_battery_ch acd52832_Car_battery_ch_2

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers acd_nrf52_saadc.cpp Source File

acd_nrf52_saadc.cpp

00001 /*
00002  * Made by Jurica Resetar and Karlo Milicevic @ aconno, 2017
00003  * jurica_resetar@yahoo.com
00004  * aconno.de  
00005  * All rights reserved 
00006  *
00007  */
00008   
00009 #include "acd_nrf52_saadc.h"
00010 
00011 uint8_t NRF52_SAADC::channelCounter = 0;
00012 int16_t NRF52_SAADC::data[sizeof(int16_t)*NUM_OF_CHANNELS] = {0};
00013 
00014 NRF52_SAADC::NRF52_SAADC(uint8_t analogIn): channel(channelCounter){
00015     if(!channelCounter){
00016         // Do this for the first object only
00017         NRF_SAADC->ENABLE = 1;
00018         NRF_SAADC->RESULT.PTR =(uint32_t)data;  // Pass pointer to results buffer
00019         NRF_SAADC->RESOLUTION = 3;
00020         calibrate();
00021     }
00022     if(channelCounter < 8){
00023         NRF_SAADC->CH[channel].PSELP = analogIn + 1;     
00024         NRF_SAADC->CH[channel].CONFIG = 0x00021000; // reset
00025         channelCounter++;
00026         NRF_SAADC->RESULT.MAXCNT = channelCounter;
00027     }
00028 }
00029 
00030 NRF52_SAADC::NRF52_SAADC(uint8_t pPin, uint8_t nPin): channel(channelCounter){
00031     if(!channelCounter){
00032         // Do this for the first object only
00033         NRF_SAADC->ENABLE = 1;
00034         NRF_SAADC->RESULT.PTR =(uint32_t)data;  // Pass pointer to results buffer
00035         NRF_SAADC->RESOLUTION = 3;
00036         calibrate();
00037     }
00038     if(channelCounter < 8){
00039         NRF_SAADC->CH[channel].PSELP = pPin + 1;     
00040         NRF_SAADC->CH[channel].PSELN = nPin + 1;     
00041         NRF_SAADC->CH[channel].CONFIG = 0x00121200; // differential  input, Gain 1
00042         channelCounter++;
00043         NRF_SAADC->RESULT.MAXCNT = channelCounter;
00044     }
00045 }
00046 
00047 NRF52_SAADC::~NRF52_SAADC(){
00048     NRF_SAADC->ENABLE = 0;
00049 }
00050 
00051 int16_t NRF52_SAADC::read(){
00052     updateData();
00053     return data[channel];
00054 }
00055 
00056 void NRF52_SAADC::updateData(){
00057     NRF_SAADC->TASKS_START = 1;
00058     while(!NRF_SAADC->EVENTS_STARTED);
00059     NRF_SAADC->TASKS_SAMPLE = 1;
00060     for(uint8_t i = 0; i < channelCounter; ++i){
00061         while(!NRF_SAADC->EVENTS_RESULTDONE);
00062         while(!NRF_SAADC->EVENTS_DONE);
00063         while(!NRF_SAADC->EVENTS_END);
00064         while(NRF_SAADC->STATUS == 1); // while conversion is is progress
00065     }
00066     NRF_SAADC->TASKS_STOP = 1;
00067     while(!NRF_SAADC->EVENTS_STOPPED);
00068 }
00069 
00070 void NRF52_SAADC::calibrate(){
00071     NRF_SAADC->TASKS_CALIBRATEOFFSET = 1;
00072     while(!NRF_SAADC->EVENTS_CALIBRATEDONE);
00073 }