Расчет процента заряда батареи с помощью Arduino

Я делаю небольшой проект, используя зарядное устройство Lipoly и аккумулятор 2500 мАч 3,7 В, оба от Adafruit. Я пытаюсь отобразить процент оставшегося заряда батареи. Для этого я использую этот небольшой эскиз:

long readVcc() {
  long result;
  // Read 1.1V reference against AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Convert
  while (bit_is_set(ADCSRA,ADSC));
  result = ADCL;
  result |= ADCH<<8;
  result = 1126400L / result; // Back-calculate AVcc in mV
  return result;
}

На этой странице я увидел , что минимальное напряжение составляет 3,0 В, поэтому я использую его для получения своих значений:

  float volt = (float)readVcc()/1000;
  float percent = ((volt-3)/0.7)*100;

Когда я отображаю свои значения, он показывает мне, что оставшийся процент составляет -4%. Должен ли я беспокоиться или я делаю что-то неправильно при расчете?

Если ваш расчет ((вольт-3)/0,7)*100 дает вам отрицательное число, это означает, что ваша переменная «вольт» меньше 3 В.
Подождите, подождите... Вы измеряете постоянное опорное напряжение 1,1 В, подключенное к входу АЦП, и вычисляете Avcc? АЦП наоборот, интересно!
Камиль, не могли бы вы объяснить, что вы только что сказали? Поскольку функция readVCC принадлежит не мне, я получил ее на этой странице: code.google.com/p/tinkerit/wiki/SecretVoltmeter .
- пояснил я в ответ.

Ответы (1)

Я думаю, что ваш расчет в порядке.

Доказательство:

Если ваши результаты преобразования АЦП равны 1024 (полная шкала 10 бит) - когда AVcc = опорный

result = 1126400L / 1024 = 1100;

Если ваши результаты преобразования АЦП равны 512 (половина шкалы 10 бит) - когда AVcc = опорное / 2

result = 1126400L / 512 = 2200;

Ваш процентный результат равен -4%, потому что напряжение ниже 3 В.

percent = ((volt-3)/0.7)*100
-4 = ((volt-3)/0.7)*100
-4/100 = (volt-3)/0.7
-0.04*0.7 = volt - 3
-0.28 + 3 = volt
 2.972 = volt
И безопасно ли иметь напряжение ниже 3 В с батареей 3,7 В?
Нет. Это не хорошо для литий-ионного аккумулятора. Он довольно быстро теряет емкость. Вы должны отключить батарею, когда это произойдет, или уменьшить ток до микроампер (микроконтроллер в спящем режиме, светодиоды выключены, все выключено) до тех пор, пока батарея не будет перезаряжена.
Хорошо спасибо :). У вас есть идеи, как отключить Arduino, когда батарея ниже 3 В? Я видел, что в Arduino есть спящий режим, этого должно быть достаточно?
Это зависит от того, что вы подключили к этой батарее. И как долго эта схема будет стоять без зарядки. Если вы оставите его в спящем режиме на 3 В на несколько недель - он все равно убьет батарею. Это действительно трудно сказать. Я не парень с Arduino, я не знаю, как работает спящий режим. Если включить Power-down Mode: (0,1 мкА в Atmega328P) - должно хватить, но без схемы сложно сказать. Если у вас есть I2C с подтяжками - они могут убить батарею, независимо от того, включен ли у вас режим отключения питания.
Хорошо, спасибо за все ответы! Я проверю это!
* Привет всем, я пытаюсь присоединиться к вопросу tomatediabolik и ответить Камилу и сгенерировать исходный код ошибки, я хотел бы знать, насколько серьезен полный код, потому что я думаю, что это отличная идея, и я работаю над аналогичным проектом. заранее большое спасибо.