Skip to content

Fix voltage calculation - Update mkr-battery-app-note.md #1501

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ We will go through the lines needed to create a Sketch to read the battery value
**4.** We will now create a variable to store the maximum source voltage `max_Source_voltage` as well as the upper (`batteryFullVoltage`) and lower (`batteryEmptyVoltage`) values for the battery. We will also define the battery capacity as `batteryCapacity` so as to determine the charging current. Since we are using a 750 mAh battery in this example, we will set the value to `0.750`.

```arduino
int max_Source_voltage;
float max_Source_voltage;

float batteryFullVoltage = 4.2;
float batteryEmptyVoltage = 3.3;
Expand Down Expand Up @@ -185,12 +185,12 @@ void loop()
**13.** In order to convert `rawADC` into a voltage reading (`voltADC`) we will divide `rawADC` by 4095 and then multiply it by the analog reference voltage (3.3V).

```arduino
voltADC = rawADC * (3.3/4095.0);
voltADC = rawADC * 3.3 / 4096.0;
```

**14.** The `voltADC` variable gives us the voltage sensed directly on the PB09 pin. This voltage is passed through the voltage divider, so it is a fraction of the actual battery voltage. We can then calculate the equivilanet battery voltage as follows.
```arduino
voltBat = voltADC * (max_Source_voltage/3.3);
voltBat = max_Source_voltage * rawADC / 4096.0;
```

**15.** We can approximate the battery voltage to be proportional to the capacity level. Since the `map()` function does not work with float variables, we will manually map the values.
Expand Down Expand Up @@ -266,7 +266,7 @@ float voltBat; //calculated voltage on battery
int R1 = 330000; // resistor between battery terminal and SAMD pin PB09
int R2 = 1000000; // resistor between SAMD pin PB09 and ground

int max_Source_voltage; // upper source voltage for the battery
float max_Source_voltage; // upper source voltage for the battery

// define voltage at which battery is full/empty
float batteryFullVoltage = 4.2; //upper voltage limit for battery
Expand Down Expand Up @@ -303,8 +303,8 @@ void loop()
{

rawADC = analogRead(ADC_BATTERY); //the value obtained directly at the PB09 input pin
voltADC = rawADC * (3.3/4095.0); //convert ADC value to the voltage read at the pin
voltBat = voltADC * (max_Source_voltage/3.3); //we cannot use map since it requires int inputs/outputs
voltADC = rawADC * 3.3 / 4096.0; //convert ADC value to the voltage read at the pin
voltBat = max_Source_voltage * rawADC / 4096.0; //we cannot use map since it requires int inputs/outputs

int new_batt = (voltBat - batteryEmptyVoltage) * (100) / (batteryFullVoltage - batteryEmptyVoltage); //custom float friendly map function

Expand Down