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:
Sun Jan 24 03:53:32 2016 +0000
Revision:
0:11c9f031975d
Child:
1:7da210f6aff1
new release / Read nRF51822(BLE Chip) VDD volatage and return 100 to 0% charging level

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 0:11c9f031975d 6 * Copyright (c) 2016 Kenji Arai / JH1PJL
kenjiArai 0:11c9f031975d 7 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:11c9f031975d 8 * http://mbed.org/users/kenjiArai/
kenjiArai 0:11c9f031975d 9 * Created: January 23rd, 2016
kenjiArai 0:11c9f031975d 10 * Revised: January 24th, 2016
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 0:11c9f031975d 20
kenjiArai 0:11c9f031975d 21 nRF51_Vdd::nRF51_Vdd(float vdd100percent, float vddzeropercent){
kenjiArai 0:11c9f031975d 22 v100p = vdd100percent;
kenjiArai 0:11c9f031975d 23 v0p = vddzeropercent;
kenjiArai 0:11c9f031975d 24 }
kenjiArai 0:11c9f031975d 25
kenjiArai 0:11c9f031975d 26 nRF51_Vdd::nRF51_Vdd(void){
kenjiArai 0:11c9f031975d 27 v100p = 3.3f;
kenjiArai 0:11c9f031975d 28 v0p = 1.8f;
kenjiArai 0:11c9f031975d 29 }
kenjiArai 0:11c9f031975d 30
kenjiArai 0:11c9f031975d 31 float nRF51_Vdd::read_real_value(void){
kenjiArai 0:11c9f031975d 32 reg0 = NRF_ADC->ENABLE; // save register value
kenjiArai 0:11c9f031975d 33 reg1 = NRF_ADC->CONFIG; // save register value
kenjiArai 0:11c9f031975d 34 reg2 = NRF_ADC->RESULT; // save register value
kenjiArai 0:11c9f031975d 35 NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Enabled;
kenjiArai 0:11c9f031975d 36 NRF_ADC->CONFIG = (ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) |
kenjiArai 0:11c9f031975d 37 (ADC_CONFIG_INPSEL_SupplyOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
kenjiArai 0:11c9f031975d 38 (ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) |
kenjiArai 0:11c9f031975d 39 (ADC_CONFIG_PSEL_Disabled << ADC_CONFIG_PSEL_Pos) |
kenjiArai 0:11c9f031975d 40 (ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos);
kenjiArai 0:11c9f031975d 41 NRF_ADC->EVENTS_END = 0;
kenjiArai 0:11c9f031975d 42 NRF_ADC->TASKS_START = 1;
kenjiArai 0:11c9f031975d 43 while (!NRF_ADC->EVENTS_END) {;}
kenjiArai 0:11c9f031975d 44 wrk = NRF_ADC->RESULT; // 10 bit result
kenjiArai 0:11c9f031975d 45 NRF_ADC->ENABLE = reg0; // recover register value
kenjiArai 0:11c9f031975d 46 NRF_ADC->CONFIG = reg1; // recover register value
kenjiArai 0:11c9f031975d 47 NRF_ADC->RESULT = reg2; // recover register value
kenjiArai 0:11c9f031975d 48 NRF_ADC->EVENTS_END = 0;
kenjiArai 0:11c9f031975d 49 return ((float)wrk / 1024 * 1.2 * 3.0);
kenjiArai 0:11c9f031975d 50 }
kenjiArai 0:11c9f031975d 51
kenjiArai 0:11c9f031975d 52 uint8_t nRF51_Vdd::read(void)
kenjiArai 0:11c9f031975d 53 {
kenjiArai 0:11c9f031975d 54 wrk_vdd = read_real_value();
kenjiArai 0:11c9f031975d 55 if (wrk_vdd <= v0p){
kenjiArai 0:11c9f031975d 56 return 0;
kenjiArai 0:11c9f031975d 57 } else if (wrk_vdd >= v100p){
kenjiArai 0:11c9f031975d 58 return 100;
kenjiArai 0:11c9f031975d 59 }
kenjiArai 0:11c9f031975d 60 wrk_vdd = (wrk_vdd - v0p) / (v100p - v0p);
kenjiArai 0:11c9f031975d 61 return (uint8_t)(wrk_vdd * 100);
kenjiArai 0:11c9f031975d 62 }