Read nRF51822(BLE Chip) VDD voltage and return 100 to 0% charging level

Dependents:   BLE_Temp_Vdd_via_UART_TY BLE_EddystoneBeacon_w_ACC_TY51822 BLE_LoopbackUART_low_pwr_w_RTC1 BLE_Paired_Server ... more

This is only for nRF51822.

You don't need any hardware circuit. Just read internal Vdd voltage using ADC function inside of the chip.

Committer:
kenjiArai
Date:
Sat Apr 14 04:55:32 2018 +0000
Revision:
3:faf2e448c15b
Parent:
2:9b1e219a7695
small modification

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:11c9f031975d 1 /*
kenjiArai 0:11c9f031975d 2 * mbed library program
kenjiArai 0:11c9f031975d 3 * Read nRF51822 VDD volatage and return 100 to 0% charging level
kenjiArai 0:11c9f031975d 4 * https://www.nordicsemi.com/eng/Products/Bluetooth-Smart-Bluetooth-low-energy/nRF51822
kenjiArai 0:11c9f031975d 5 *
kenjiArai 3:faf2e448c15b 6 * Copyright (c) 2016,'18 Kenji Arai / JH1PJL
kenjiArai 0:11c9f031975d 7 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 3:faf2e448c15b 8 * https://os.mbed.com/users/kenjiArai/
kenjiArai 0:11c9f031975d 9 * Created: January 23rd, 2016
kenjiArai 3:faf2e448c15b 10 * Revised: April 14th, 2018
kenjiArai 0:11c9f031975d 11 *
kenjiArai 0:11c9f031975d 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
kenjiArai 0:11c9f031975d 13 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
kenjiArai 0:11c9f031975d 14 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
kenjiArai 0:11c9f031975d 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kenjiArai 0:11c9f031975d 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
kenjiArai 0:11c9f031975d 17 */
kenjiArai 0:11c9f031975d 18
kenjiArai 0:11c9f031975d 19 #include "nRF51_Vdd.h"
kenjiArai 1:7da210f6aff1 20 #include "nrf_delay.h"
kenjiArai 1:7da210f6aff1 21
kenjiArai 1:7da210f6aff1 22 nRF51_Vdd::nRF51_Vdd(float vdd100percent, float vddzeropercent, uint8_t adc_use){
kenjiArai 1:7da210f6aff1 23 v100p = vdd100percent;
kenjiArai 1:7da210f6aff1 24 v0p = vddzeropercent;
kenjiArai 1:7da210f6aff1 25 use_adc_for_others = adc_use;
kenjiArai 1:7da210f6aff1 26 }
kenjiArai 0:11c9f031975d 27
kenjiArai 0:11c9f031975d 28 nRF51_Vdd::nRF51_Vdd(float vdd100percent, float vddzeropercent){
kenjiArai 0:11c9f031975d 29 v100p = vdd100percent;
kenjiArai 0:11c9f031975d 30 v0p = vddzeropercent;
kenjiArai 1:7da210f6aff1 31 use_adc_for_others = USE_ADC;
kenjiArai 0:11c9f031975d 32 }
kenjiArai 0:11c9f031975d 33
kenjiArai 0:11c9f031975d 34 nRF51_Vdd::nRF51_Vdd(void){
kenjiArai 0:11c9f031975d 35 v100p = 3.3f;
kenjiArai 0:11c9f031975d 36 v0p = 1.8f;
kenjiArai 1:7da210f6aff1 37 use_adc_for_others = USE_ADC;
kenjiArai 0:11c9f031975d 38 }
kenjiArai 0:11c9f031975d 39
kenjiArai 0:11c9f031975d 40 float nRF51_Vdd::read_real_value(void){
kenjiArai 1:7da210f6aff1 41 NRF_ADC->POWER = 1;
kenjiArai 1:7da210f6aff1 42 nrf_delay_us(5);
kenjiArai 1:7da210f6aff1 43 NRF_ADC->EVENTS_END = 0;
kenjiArai 1:7da210f6aff1 44 NRF_ADC->TASKS_STOP = 1;
kenjiArai 0:11c9f031975d 45 reg0 = NRF_ADC->ENABLE; // save register value
kenjiArai 0:11c9f031975d 46 reg1 = NRF_ADC->CONFIG; // save register value
kenjiArai 0:11c9f031975d 47 reg2 = NRF_ADC->RESULT; // save register value
kenjiArai 0:11c9f031975d 48 NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Enabled;
kenjiArai 0:11c9f031975d 49 NRF_ADC->CONFIG = (ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) |
kenjiArai 0:11c9f031975d 50 (ADC_CONFIG_INPSEL_SupplyOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
kenjiArai 0:11c9f031975d 51 (ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) |
kenjiArai 0:11c9f031975d 52 (ADC_CONFIG_PSEL_Disabled << ADC_CONFIG_PSEL_Pos) |
kenjiArai 0:11c9f031975d 53 (ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos);
kenjiArai 0:11c9f031975d 54 NRF_ADC->EVENTS_END = 0;
kenjiArai 0:11c9f031975d 55 NRF_ADC->TASKS_START = 1;
kenjiArai 0:11c9f031975d 56 while (!NRF_ADC->EVENTS_END) {;}
kenjiArai 1:7da210f6aff1 57 wrk = NRF_ADC->RESULT; // 10 bit result
kenjiArai 0:11c9f031975d 58 NRF_ADC->EVENTS_END = 0;
kenjiArai 1:7da210f6aff1 59 NRF_ADC->TASKS_STOP = 1;
kenjiArai 1:7da210f6aff1 60 if (use_adc_for_others == USE_ADC){
kenjiArai 1:7da210f6aff1 61 NRF_ADC->ENABLE = reg0; // recover register value
kenjiArai 1:7da210f6aff1 62 NRF_ADC->CONFIG = reg1; // recover register value
kenjiArai 1:7da210f6aff1 63 NRF_ADC->RESULT = reg2; // recover register value
kenjiArai 1:7da210f6aff1 64 NRF_ADC->EVENTS_END = 0;
kenjiArai 1:7da210f6aff1 65 } else {
kenjiArai 1:7da210f6aff1 66 NRF_ADC->CONFIG = 0x18;
kenjiArai 1:7da210f6aff1 67 NRF_ADC->EVENTS_END = 1;
kenjiArai 1:7da210f6aff1 68 NRF_ADC->TASKS_STOP = 1;
kenjiArai 1:7da210f6aff1 69 NRF_ADC->ENABLE = 0;
kenjiArai 1:7da210f6aff1 70 nrf_delay_us(5);
kenjiArai 1:7da210f6aff1 71 NRF_ADC->POWER = 0;
kenjiArai 1:7da210f6aff1 72 nrf_delay_us(5);
kenjiArai 1:7da210f6aff1 73 }
kenjiArai 3:faf2e448c15b 74 return ((float)wrk / 1024.0f * 1.2f * 3.0f);
kenjiArai 0:11c9f031975d 75 }
kenjiArai 0:11c9f031975d 76
kenjiArai 1:7da210f6aff1 77 uint8_t nRF51_Vdd::read(void){
kenjiArai 0:11c9f031975d 78 wrk_vdd = read_real_value();
kenjiArai 0:11c9f031975d 79 if (wrk_vdd <= v0p){
kenjiArai 0:11c9f031975d 80 return 0;
kenjiArai 0:11c9f031975d 81 } else if (wrk_vdd >= v100p){
kenjiArai 0:11c9f031975d 82 return 100;
kenjiArai 0:11c9f031975d 83 }
kenjiArai 0:11c9f031975d 84 wrk_vdd = (wrk_vdd - v0p) / (v100p - v0p);
kenjiArai 0:11c9f031975d 85 return (uint8_t)(wrk_vdd * 100);
kenjiArai 0:11c9f031975d 86 }