Запись в ADMUX на 3,7 В от микросхемы перезапуска батареи

Дано: Arduino nano (atmega328P) с nrf24l01. Что я пытаюсь сделать: Измерить разряд батареи. Что я делаю для этого. Поэтому я провел небольшое исследование того, как можно измерить напряжение батареи без использования каких-либо дополнительных контактов (уже распечатал плату и вдруг понял, что было бы неплохо также измерить разряд батареи). И нашел примеры с почти всегда похожим кодом:

long readVcc() {
  long result;
  // Чтение ссылки 1,1 В относительно AVcc
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2); // Подождите, пока Vref установится
  ADCSRA |= _BV(ADSC); // Конвертировать
  while (bit_is_set(ADCSRA,ADSC));
  result = ADCL;
  result |= ADCH<<8;
  result = 1126400L / result; // Обратный расчет AVcc в мВ
  return result;
}

Это работает нормально, когда у меня заряжены батареи, но как только оно достигает 3,7 вольт, запись в ADMUX, похоже, приводит к сбою всей программы и перезапуску чипа. Однако до этой операции все остальное работает нормально.

Несколько вопросов:

  1. Кто-нибудь может объяснить мне, почему происходит сбой?
  2. Как это предотвратить?
  3. Поможет ли перепрошивка загрузчика и настройка генератора на 8 МГц решить эту проблему?

, 👍0

Обсуждение

добавьте код отладки... программа может не давать сбоев... она может попасть в бесконечный цикл... строка пока может быть бесконечным циклом, @jsotola

Я почти уверен, что это крах. Потому что он перезагружается и снова отправляет данные с помощью nrf24l01. Я проверил это, отправив счетчик, который я увеличиваю в каждом цикле. И когда он падает, это всегда 0. Так что он падает., @user10160994

может быть блок питания отключается, когда NRF24L01 активирует радио, @jsotola

Не совсем уверен, как это возможно. При чуть большей мощности все работает нормально. Также если я подключаю датчик температуры, все работает нормально. Он не работает именно при записи в ADMUX., @user10160994

Как вы выяснили, что именно при записи в ADMUX произошел сбой?, @Fahad

@Фахад довольно легко. Я просто оставил эту операцию и проверил поведение., @user10160994