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.
Diff: nRF51_Vdd.cpp
- Revision:
- 0:11c9f031975d
- Child:
- 1:7da210f6aff1
diff -r 000000000000 -r 11c9f031975d nRF51_Vdd.cpp --- /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); +}