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.
nRF51_Vdd.cpp@0:11c9f031975d, 2016-01-24 (annotated)
- 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?
User | Revision | Line number | New 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 | } |