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@10:b763d9cfc063, 2017-10-04 (annotated)
- 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?
User | Revision | Line number | New 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 | } |