Преобразование АЦП в напряжение зависит от фактического значения контакта +5 В?

13

Вопросов:

  1. Зависит ли преобразование счетчика АЦП от напряжения от фактического напряжения на выводе +5 В?
  2. Если да, то какой метод получения напряжения от платы принят?

Предпосылки / Detail:

У меня есть схема, в которой у меня есть Arduino Nano (клон), работающий от разъема USB (от концентратора). Работа Arduino заключается в измерении напряжения на батарее, которая будет приводить в действие вторую цепь, включенную / выключенную Nano. Для справки это тестер аккумулятора.

Тестовая схема

Есть экран Nokia 5110, который отображает напряжение из очень простого рисунка ниже.

void setup() {
  Serial.begin(9600);
  display.begin();
  // Init done

  // You can change the contrast around to adapt the display
  // for the best viewing!
  display.setContrast(50);

  // Text display tests
  display.setTextSize(1);
  display.setTextColor(BLACK);
}


void loop() {
  display.clearDisplay();   // Clears the screen and buffer
  display.setCursor(0,0);
  display.print("Vin=");
  int rawVIN = analogRead(VIN);
  float floatVin = (rawVIN*4.75)/1023.0;
  display.println(floatVin);
  Serial.println(rawVIN);
  display.display();
  delay(1000);
}
  • Я измерил напряжение аккумулятора с помощью DVM, и оно составляет 4,13 В, но Nano сообщает о 4,35 В.
  • У меня есть общий язык между аккумулятором и Arduino.
  • Поскольку соединение для проверки напряжения может плавать, у меня есть понижающий резистор, чтобы остановить дикие колебания (> 10 кОм)

После некоторого исследования я обнаружил, что +5 В на самом деле выводило 4,75 В, и изменил мой эскиз с

float v = (rawVIN*5.0)/1024.0;

в

float v = (rawVIN*4.75)/1024.0;

и показания напряжения на Arduino были теперь правильными. Я сделал это не потому, что я понимаю, что я сделал, я сделал это, потому что у меня была догадка, это может изменить значение на правильное.

Карибу
источник
3
Как сторона, которую вы не должны делить на 1024, а не на 1023. Это ошибка, которая повторяется снова и снова, по-видимому, вытекающая из ошибки в примерах Arduino. Источник? Таблица данных для AVR.
Том Карпентер
@ TomCarpenter Я думаю, что это результат того, что я возился с вычислениями и что-то читал после довольно долгого удара головой о стол - я начал с 1024, но, как вы видите, закончил с 1023 - я исправлю свой вопрос ,
Карибу

Ответы:

16

АЦП внутри Arduino не измеряет напряжение, а скорее напряжения соотношение . А именно отношение напряжения на аналоговом входе к напряжению на выводе Vref.

В конфигурации по умолчанию вывод Vref внутренне привязан к линии +5 В. Вы можете использовать вместо внутренней ссылки Vref :

analogReference(INTERNAL);

Эта ссылка составляет около 1,1 V, и является достаточно невосприимчивы к колебаниям на +5 В. Проблема состоит в том, что вы не можете измерить напряжение выше, чем в качестве ссылки.

Для вашего тестера батареи, если вы хотите какое-то «абсолютное» измерение, вы можете использовать внутренний эталон и делитель напряжения, чтобы убедиться, что измеренное напряжение ниже 1,1 В.

Редактирование : Еще одна опция, которая не требует делителя напряжения, - это использование Vcc в качестве эталона для измерения как аналогового входа, так и внутреннего эталона с запрещенной зоной 1,1 В. Измерение 1,1 В против Vcc является косвенным способом измерения Vcc. Это не поддерживается базовой библиотекой Arduino, но вы можете сделать это, запрограммировав непосредственно управляющие регистры АЦП:

// Return the supply voltage in volts.
float read_vcc()
{
    const float V_BAND_GAP = 1.1;     // typical
    ADMUX  = _BV(REFS0)    // ref = Vcc
           | 14;           // channel 14 is the bandgap reference
    ADCSRA |= _BV(ADSC);   // start conversion
    loop_until_bit_is_clear(ADCSRA, ADSC);  // wait until complete
    return V_BAND_GAP * 1024 / ADC;
}

Помните, что самое первое чтение после загрузки может быть поддельным.

Эдгар Бонет
источник
Спасибо за быстрый ответ :) теперь это имеет смысл и объясняет, почему с помощью моей корректировки кода я получаю правильный ответ. Это в сочетании с ответом enrics дает мне все, что мне нужно для продолжения.
Карибу
9

USB-питанием Arduino Nano будет иметь опорное напряжение АЦП, который не может полагаться, в связи с +/- 5% допуском входного напряжения USB. Вдобавок к этому, у Nano есть диод Шоттки MBR0520 (D1), который будет падать между 0,1 и 0,5 В в зависимости от собственных производственных допусков, его температуры и потребляемой мощности вашей платы.

Что вы можете сделать по этому поводу?

MCU на борту Arduino Nano - это ATmega328P. АЦП Nano может масштабировать показания аналогового напряжения в соответствии с несколькими доступными ссылками (и вы можете выбрать тот, который вам больше подходит). Вы можете сделать это через analogReference (type)функцию и выбрать одну из следующих ссылок type:

  • ПО УМОЛЧАНИЮ: стандартное аналоговое задание 5 В (на платах Arduino 5 В) или 3,3 В (на платах Arduino 3,3 В)
  • ВНУТРЕННЯЯ: встроенное задание, равное 1,1 вольт на ATmega168 или ATmega328 и 2,56 вольт на ATmega8 (недоступно на Arduino Mega) [...]
  • ВНЕШНЕЕ: напряжение, приложенное к выводу AREF (только от 0 до 5 В), используется в качестве эталона.

Источник: аналоговая ссылка

Это схема АЦП для того, что находится внутри ATmega328, чтобы вы могли видеть, что там происходит:

Блок АЦП ATmega328P

Источник: данные ATmega328

Таким образом, простое решение заключается в создании слабого делителя напряжения, чтобы получить напряжение, которое вы хотите измерить ниже эталона ВНУТРЕННЕГО В 1.1 В, а затем настроить analogReferenceсоответствующим образом.

Делитель напряжения должен быть слабым (высокие значения R), чтобы вы не потребляли слишком много тока от батареи, но не слишком слабым, чтобы быть нагруженным входным импедансом АЦП.

бонус

Тем не менее, если вам нужен источник опорного напряжения выше, внутренний 1,1 V зонного ссылка на ATmega328 вы все еще повезло. Можно было бы использовать выход регулятора LDO 3,3 В от встроенного FT232RL, который доступен для вас на выводе 14 разъема, но я не думаю, что он также надежен. Спецификация FT232RL определяет его при 3,0-3,6 В (номинальная 3,3 В).

Таким образом , универсальное решение было бы построить внешнее опорное напряжение , основываясь на дешевом TL431 . Это может дать вам надежную ссылку до 4,0 - 4,25 V с точностью в +/- 1%.

Внешний источник опорного напряжения схема будет что-то же просто, как это (и TL431 доступен в макете дружной TO-92 корпусе!):

Шунтирующий регулятор напряжения на основе TL431

Энрик Бланко
источник
Спасибо за этот исчерпывающий ответ и за все альтернативы, которые я мог бы рассмотреть - я, вероятно, пойду попросту и сделаю делитель напряжения, чтобы масштабировать мой вход между 0 и 1.1. Намек на значения resisteor был для меня ценным - спасибо
Caribou
3

У меня есть страница о преобразователе АЦП на Atmega328P . Несколько ниже на странице я опишу ссылки на напряжение. Вы можете использовать микросхему TL431 для обеспечения различных опорных напряжений, например 4 В:

опорного напряжения 4V

Изменяя резисторы, вы можете получить другие напряжения (похоже, что вы хотите около 4,2 В).

Выходное напряжение не зависит от входного напряжения (в данном случае 5 В).

Связанная страница описывает, как вы можете выбрать значения резистора.

Ник Гаммон
источник
2

Зависит ли преобразование счетчика АЦП от напряжения от фактического напряжения на выводе + 5В?

да и нет: модуль adc заботится о Vref, который может поставляться через Vdd, внутри или снаружи.

Если да, то какой метод получения напряжения от платы является приемлемым?

путем настройки модуля АЦП. таблица данных устройства должна иметь регистры / биты, которые должны быть установлены для этого.

dannyf
источник