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@3:faf2e448c15b, 2018-04-14 (annotated)
- 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?
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 | 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 | } |