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.

Revision:
0:11c9f031975d
Child:
1:7da210f6aff1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nRF51_Vdd.cpp	Sun Jan 24 03:53:32 2016 +0000
@@ -0,0 +1,62 @@
+/*
+ * mbed library program
+ *  Read nRF51822 VDD volatage and return 100 to 0% charging level
+ *      https://www.nordicsemi.com/eng/Products/Bluetooth-Smart-Bluetooth-low-energy/nRF51822
+ *
+ * Copyright (c) 2016 Kenji Arai / JH1PJL
+ *  http://www.page.sannet.ne.jp/kenjia/index.html
+ *  http://mbed.org/users/kenjiArai/
+ *      Created:    January   23rd, 2016
+ *      Revised:    January   24th, 2016
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
+ * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "nRF51_Vdd.h"
+
+nRF51_Vdd::nRF51_Vdd(float vdd100percent, float vddzeropercent){
+    v100p = vdd100percent;
+    v0p = vddzeropercent;
+}
+
+nRF51_Vdd::nRF51_Vdd(void){
+    v100p = 3.3f;
+    v0p = 1.8f;
+}
+
+float nRF51_Vdd::read_real_value(void){
+    reg0 = NRF_ADC->ENABLE;     // save register value
+    reg1 = NRF_ADC->CONFIG;     // save register value
+    reg2 = NRF_ADC->RESULT;     // save register value
+    NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Enabled;
+    NRF_ADC->CONFIG = (ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) |
+                      (ADC_CONFIG_INPSEL_SupplyOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
+                      (ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) |
+                      (ADC_CONFIG_PSEL_Disabled << ADC_CONFIG_PSEL_Pos) |
+                      (ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos);
+    NRF_ADC->EVENTS_END  = 0;
+    NRF_ADC->TASKS_START = 1;
+    while (!NRF_ADC->EVENTS_END) {;}
+    wrk = NRF_ADC->RESULT;      // 10 bit result
+    NRF_ADC->ENABLE = reg0;     // recover register value
+    NRF_ADC->CONFIG = reg1;     // recover register value
+    NRF_ADC->RESULT = reg2;     // recover register value
+    NRF_ADC->EVENTS_END  = 0;
+    return ((float)wrk / 1024 * 1.2 * 3.0);            
+}
+
+uint8_t nRF51_Vdd::read(void)
+{
+    wrk_vdd = read_real_value();
+    if (wrk_vdd <= v0p){
+        return 0;
+    } else if (wrk_vdd >= v100p){
+        return 100;
+    }
+    wrk_vdd = (wrk_vdd - v0p) / (v100p - v0p);
+    return (uint8_t)(wrk_vdd * 100); 
+}