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:
Fri Sep 29 11:12:03 2017 +0000
Revision:
9:a1eacc3f0cbb
Parent:
8:b4afe08821f5
Child:
10:b763d9cfc063
Small fix (VDD as the reference and 1/4 gain).

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 9:a1eacc3f0cbb 19 calibrate();
jurica238814 8:b4afe08821f5 20 }
jurica238814 8:b4afe08821f5 21 if(channelCounter < 8){
jurica238814 9:a1eacc3f0cbb 22 NRF_SAADC->CH[channel].PSELP = analogIn + 1;
jurica238814 9:a1eacc3f0cbb 23 NRF_SAADC->CH[channel].CONFIG = 0x00021500; // reset
jurica238814 8:b4afe08821f5 24 channelCounter++;
jurica238814 8:b4afe08821f5 25 NRF_SAADC->RESULT.MAXCNT = channelCounter;
jurica238814 8:b4afe08821f5 26 }
jurica238814 8:b4afe08821f5 27 }
jurica238814 8:b4afe08821f5 28
jurica238814 8:b4afe08821f5 29 NRF52_SAADC::NRF52_SAADC(uint8_t pPin, uint8_t nPin): channel(channelCounter){
jurica238814 8:b4afe08821f5 30 if(!channelCounter){
jurica238814 8:b4afe08821f5 31 // Do this for the first object only
jurica238814 8:b4afe08821f5 32 NRF_SAADC->ENABLE = 1;
jurica238814 8:b4afe08821f5 33 NRF_SAADC->RESULT.PTR =(uint32_t)data; // Pass pointer to results buffer
jurica238814 9:a1eacc3f0cbb 34 calibrate();
jurica238814 8:b4afe08821f5 35 }
jurica238814 8:b4afe08821f5 36 if(channelCounter < 8){
jurica238814 9:a1eacc3f0cbb 37 NRF_SAADC->CH[channel].PSELP = pPin + 1;
jurica238814 9:a1eacc3f0cbb 38 NRF_SAADC->CH[channel].PSELN = nPin + 1;
jurica238814 9:a1eacc3f0cbb 39 NRF_SAADC->CH[channel].CONFIG = 0x00121500; // differential input, Gain 1
jurica238814 8:b4afe08821f5 40 channelCounter++;
jurica238814 8:b4afe08821f5 41 NRF_SAADC->RESULT.MAXCNT = channelCounter;
jurica238814 8:b4afe08821f5 42 }
Dautor 1:2d6e904c6843 43 }
Dautor 1:2d6e904c6843 44
Dautor 1:2d6e904c6843 45 NRF52_SAADC::~NRF52_SAADC(){
Dautor 2:1e7d6ab5b04b 46 NRF_SAADC->ENABLE = 0;
Dautor 1:2d6e904c6843 47 }
Dautor 1:2d6e904c6843 48
jurica238814 8:b4afe08821f5 49 int16_t NRF52_SAADC::read(){
jurica238814 8:b4afe08821f5 50 updateData();
jurica238814 8:b4afe08821f5 51 return data[channel];
jurica238814 8:b4afe08821f5 52 }
jurica238814 8:b4afe08821f5 53
Dautor 3:fcada8b3b567 54 void NRF52_SAADC::updateData(){
Dautor 1:2d6e904c6843 55 NRF_SAADC->TASKS_START = 1;
Dautor 1:2d6e904c6843 56 while(!NRF_SAADC->EVENTS_STARTED);
Dautor 1:2d6e904c6843 57 NRF_SAADC->TASKS_SAMPLE = 1;
jurica238814 8:b4afe08821f5 58 for(uint8_t i = 0; i < channelCounter; ++i){
Dautor 4:616c6590bbd2 59 while(!NRF_SAADC->EVENTS_RESULTDONE);
Dautor 4:616c6590bbd2 60 while(!NRF_SAADC->EVENTS_DONE);
Dautor 4:616c6590bbd2 61 while(!NRF_SAADC->EVENTS_END);
Dautor 4:616c6590bbd2 62 while(NRF_SAADC->STATUS == 1); // while conversion is is progress
Dautor 4:616c6590bbd2 63 }
Dautor 4:616c6590bbd2 64 NRF_SAADC->TASKS_STOP = 1;
Dautor 4:616c6590bbd2 65 while(!NRF_SAADC->EVENTS_STOPPED);
Dautor 1:2d6e904c6843 66 }
Dautor 3:fcada8b3b567 67
Dautor 3:fcada8b3b567 68 void NRF52_SAADC::calibrate(){
Dautor 3:fcada8b3b567 69 NRF_SAADC->TASKS_CALIBRATEOFFSET = 1;
Dautor 3:fcada8b3b567 70 while(!NRF_SAADC->EVENTS_CALIBRATEDONE);
jurica238814 8:b4afe08821f5 71 }