diff --git a/samples/boards/nrf/battery/README.rst b/samples/boards/nrf/battery/README.rst new file mode 100644 index 00000000000..4ace4e99ff3 --- /dev/null +++ b/samples/boards/nrf/battery/README.rst @@ -0,0 +1,81 @@ +.. _boards_nrf_battery: + +Battery Voltage Measurement +########################### + +Overview +******** + +This sample demonstrates using Nordic configurations of the Zephyr ADC +infrastructure to measure the voltage of the device power supply. Two +power supply configurations are supported: + +* If the board devicetree has a ``/vbatt`` node with compatible + ``voltage-divider`` then the voltage is measured using that divider. +* Otherwise the power source is assumed to be directly connected to the + digital voltage signal, and the internal source for ``Vdd`` is + selected. + +An example of a devicetree node describing a voltage divider for battery +monitoring is: + +.. code-block:: none + + / { + vbatt { + compatible = "voltage-divider"; + io-channels = <&adc 4>; + output-ohms = <180000>; + full-ohms = <(1500000 + 180000)>; + power-gpios = <&sx1509b 4 0>; + }; + }; + +Note that in many cases where there is no voltage divider the digital +voltage will be fed from a regulator that provides a fixed voltage +regardless of source voltage, rather than by the source directly. In +configuration involving a regulator the measured voltage will be +constant. + +The sample provides discharge curves that map from a measured voltage to +an estimate of remaining capacity. The correct curve depends on the +battery source: a standard LiPo cell requires a curve that is different +from a standard alkaline battery. Curves can be measured, or estimated +using the data sheet for the battery. + +Application Details +=================== + +The application initializes battery measurement on startup, then loops +displaying the battery status every five seconds. + +Requirements +************ + +A Nordic-based board, optionally with a voltage divider specified in its +devicetree configuration as noted above. + +Building and Running +******************** + +The code can be found in :zephyr_file:`samples/boards/nrf/battery`. + +.. zephyr-app-commands:: + :zephyr-app: samples/boards/nrf/battery + :board: nrf52_pca20020 + :goals: build flash + :compact: + + +Sample Output +============= + +.. code-block:: console + + *** Booting Zephyr OS build zephyr-v2.2.0-318-g84219bdc1ac2 *** + [0:00:00.016]: 4078 mV; 10000 pptt + [0:00:04.999]: 4078 mV; 10000 pptt + [0:00:09.970]: 4078 mV; 10000 pptt + [0:00:14.939]: 4069 mV; 10000 pptt + [0:00:19.910]: 4078 mV; 10000 pptt + [0:00:24.880]: 4069 mV; 10000 pptt diff --git a/samples/boards/nrf/battery/src/battery.c b/samples/boards/nrf/battery/src/battery.c index 3e12aac6310..318d38e5c02 100644 --- a/samples/boards/nrf/battery/src/battery.c +++ b/samples/boards/nrf/battery/src/battery.c @@ -57,13 +57,10 @@ struct divider_config { }; static const struct divider_config divider_config = { +#if DT_HAS_NODE(VBATT) .io_channel = { -#if DT_NODE_HAS_PROP(VBATT, io_channels) DT_IO_CHANNELS_LABEL(VBATT), DT_IO_CHANNELS_INPUT(VBATT), -#else - DT_LABEL(DT_ALIAS(adc_0)), -#endif }, #if DT_NODE_HAS_PROP(VBATT, power_gpios) .power_gpios = { @@ -74,6 +71,11 @@ static const struct divider_config divider_config = { #endif .output_ohm = DT_PROP(VBATT, output_ohms), .full_ohm = DT_PROP(VBATT, full_ohms), +#else /* /vbatt exists */ + .io_channel = { + DT_LABEL(DT_ALIAS(adc_0)), + }, +#endif /* /vbatt exists */ }; struct divider_data {