Стандартный способ измерить напряжение выше 5В — использовать делитель на резисторах. Но есть хитрый способ измерить напряжение питания Arduino, используя внутренний источник опорного напряжения 1.1В (Internal Bandgap).
Как это работает:
- Вы измеряете значение внутреннего источника 1.1В относительно VCC (напряжения питания).
- Зная, что 1.1В — это константа, вы вычисляете VCC по формуле:
VCC = 1.1 / (measuredValue / 1023.0).
Зачем это нужно?
- Отслеживать разряд батарейки в автономных проектах.
- Калибровать АЦП, если питание нестабильно.
Код для измерения VCC:
float readVCC() {
// Выключаем все лишнее для точности
ADCSRA &= ~(1 << ADATE); // Отключаем авто-триггер
// Настраиваем АЦП на измерение внутреннего источника 1.1В
ADMUX = (1 << REFS0) | (1 << MUX3) | (1 << MUX2) | (1 << MUX1);
// REFS0 = 1 (опора на AVCC)
// MUX биты 3,2,1 = 1 (внутренний 1.1В)
delay(10); // Ждем стабилизации
// Делаем несколько измерений для усреднения
uint32_t sum = 0;
for (int i = 0; i < 16; i++) {
ADCSRA |= (1 << ADSC); // Запускаем преобразование
while (ADCSRA & (1 << ADSC)); // Ждем завершения
sum += ADC;
}
float avg = sum / 16.0;
return 1.1 / (avg / 1023.0); // Вычисляем VCC в вольтах
}
void loop() {
float vcc = readVCC();
Serial.print("Напряжение питания: ");
Serial.print(vcc, 2);
Serial.println(" В");
delay(1000);
}
Точность: ±2% при комнатной температуре. Отлично подходит для индикации заряда аккумулятора!