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.

Committer:
jurica238814
Date:
Wed Oct 04 08:01:51 2017 +0000
Revision:
10:b763d9cfc063
Parent:
9:a1eacc3f0cbb
Resolution and input range hardcoded.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jurica238814 8:b4afe08821f5 1 /*
jurica238814 8:b4afe08821f5 2 * Made by Jurica Resetar and Karlo Milicevic @ aconno, 2017
jurica238814 8:b4afe08821f5 3 * jurica_resetar@yahoo.com
jurica238814 8:b4afe08821f5 4 * aconno.de
jurica238814 8:b4afe08821f5 5 * All rights reserved
jurica238814 8:b4afe08821f5 6 *
jurica238814 8:b4afe08821f5 7 */
jurica238814 8:b4afe08821f5 8
Dautor 1:2d6e904c6843 9 #include "acd_nrf52_saadc.h"
Dautor 1:2d6e904c6843 10
jurica238814 8:b4afe08821f5 11 uint8_t NRF52_SAADC::channelCounter = 0;
jurica238814 8:b4afe08821f5 12 int16_t NRF52_SAADC::data[sizeof(int16_t)*NUM_OF_CHANNELS] = {0};
Dautor 1:2d6e904c6843 13
jurica238814 8:b4afe08821f5 14 NRF52_SAADC::NRF52_SAADC(uint8_t analogIn): channel(channelCounter){
jurica238814 8:b4afe08821f5 15 if(!channelCounter){
jurica238814 8:b4afe08821f5 16 // Do this for the first object only
jurica238814 8:b4afe08821f5 17 NRF_SAADC->ENABLE = 1;
jurica238814 8:b4afe08821f5 18 NRF_SAADC->RESULT.PTR =(uint32_t)data; // Pass pointer to results buffer
jurica238814 10:b763d9cfc063 19 NRF_SAADC->RESOLUTION = 3;
jurica238814 9:a1eacc3f0cbb 20 calibrate();
jurica238814 8:b4afe08821f5 21 }
jurica238814 8:b4afe08821f5 22 if(channelCounter < 8){
jurica238814 9:a1eacc3f0cbb 23 NRF_SAADC->CH[channel].PSELP = analogIn + 1;
jurica238814 10:b763d9cfc063 24 NRF_SAADC->CH[channel].CONFIG = 0x00021000; // reset
jurica238814 8:b4afe08821f5 25 channelCounter++;
jurica238814 8:b4afe08821f5 26 NRF_SAADC->RESULT.MAXCNT = channelCounter;
jurica238814 8:b4afe08821f5 27 }
jurica238814 8:b4afe08821f5 28 }
jurica238814 8:b4afe08821f5 29
jurica238814 8:b4afe08821f5 30 NRF52_SAADC::NRF52_SAADC(uint8_t pPin, uint8_t nPin): channel(channelCounter){
jurica238814 8:b4afe08821f5 31 if(!channelCounter){
jurica238814 8:b4afe08821f5 32 // Do this for the first object only
jurica238814 8:b4afe08821f5 33 NRF_SAADC->ENABLE = 1;
jurica238814 8:b4afe08821f5 34 NRF_SAADC->RESULT.PTR =(uint32_t)data; // Pass pointer to results buffer
jurica238814 10:b763d9cfc063 35 NRF_SAADC->RESOLUTION = 3;
jurica238814 9:a1eacc3f0cbb 36 calibrate();
jurica238814 8:b4afe08821f5 37 }
jurica238814 8:b4afe08821f5 38 if(channelCounter < 8){
jurica238814 9:a1eacc3f0cbb 39 NRF_SAADC->CH[channel].PSELP = pPin + 1;
jurica238814 9:a1eacc3f0cbb 40 NRF_SAADC->CH[channel].PSELN = nPin + 1;
jurica238814 10:b763d9cfc063 41 NRF_SAADC->CH[channel].CONFIG = 0x00121200; // differential input, Gain 1
jurica238814 8:b4afe08821f5 42 channelCounter++;
jurica238814 8:b4afe08821f5 43 NRF_SAADC->RESULT.MAXCNT = channelCounter;
jurica238814 8:b4afe08821f5 44 }
Dautor 1:2d6e904c6843 45 }
Dautor 1:2d6e904c6843 46
Dautor 1:2d6e904c6843 47 NRF52_SAADC::~NRF52_SAADC(){
Dautor 2:1e7d6ab5b04b 48 NRF_SAADC->ENABLE = 0;
Dautor 1:2d6e904c6843 49 }
Dautor 1:2d6e904c6843 50
jurica238814 8:b4afe08821f5 51 int16_t NRF52_SAADC::read(){
jurica238814 8:b4afe08821f5 52 updateData();
jurica238814 8:b4afe08821f5 53 return data[channel];
jurica238814 8:b4afe08821f5 54 }
jurica238814 8:b4afe08821f5 55
Dautor 3:fcada8b3b567 56 void NRF52_SAADC::updateData(){
Dautor 1:2d6e904c6843 57 NRF_SAADC->TASKS_START = 1;
Dautor 1:2d6e904c6843 58 while(!NRF_SAADC->EVENTS_STARTED);
Dautor 1:2d6e904c6843 59 NRF_SAADC->TASKS_SAMPLE = 1;
jurica238814 8:b4afe08821f5 60 for(uint8_t i = 0; i < channelCounter; ++i){
Dautor 4:616c6590bbd2 61 while(!NRF_SAADC->EVENTS_RESULTDONE);
Dautor 4:616c6590bbd2 62 while(!NRF_SAADC->EVENTS_DONE);
Dautor 4:616c6590bbd2 63 while(!NRF_SAADC->EVENTS_END);
Dautor 4:616c6590bbd2 64 while(NRF_SAADC->STATUS == 1); // while conversion is is progress
Dautor 4:616c6590bbd2 65 }
Dautor 4:616c6590bbd2 66 NRF_SAADC->TASKS_STOP = 1;
Dautor 4:616c6590bbd2 67 while(!NRF_SAADC->EVENTS_STOPPED);
Dautor 1:2d6e904c6843 68 }
Dautor 3:fcada8b3b567 69
Dautor 3:fcada8b3b567 70 void NRF52_SAADC::calibrate(){
Dautor 3:fcada8b3b567 71 NRF_SAADC->TASKS_CALIBRATEOFFSET = 1;
Dautor 3:fcada8b3b567 72 while(!NRF_SAADC->EVENTS_CALIBRATEDONE);
jurica238814 8:b4afe08821f5 73 }