Плавают результаты измерений (analogRead(A0) Nano)

Здравствуйте.
Измеряю напряжение батареи (не питание контроллера). Метод стандартный: делитель средней точкой на A0. Провода максимально короткие, измеряю батарею (не БП), т.е. показания должны быть постоянными. Однако цешка показывает 9.45В, а контроллер выдает хороший разбег в показаниях. Как вылечить, что я упустил?

Схема:

Код:

#define pinBat A0

void setup() {
  pinMode(pinBat,INPUT);// A0 - аналоговый вход
}

void readU (){                              
    u = analogRead(pinBat);                 // измерение 
    uBat = (u * 20.75) / 1023;               // пересчет измерения в вольты. коэфф подогнан под делитель
    Serial.println(uBat);
    dtostrf(uBat,0, 1, uBatStr);
    return (uBatStr);
}
Вывод в порт:

01:08:20.989 → 9.17
01:08:24.677 → 9.13
01:08:27.946 → 9.13
01:08:30.990 → 9.05
01:08:34.710 → 9.11
01:08:37.945 → 8.99
01:08:41.084 → 8.99
01:08:44.932 → 9.07
01:08:47.971 → 9.17
01:08:51.626 → 9.03
01:08:54.960 → 9.13

Разбег, как разбег. Точность всего в два с половиной раза хуже паспортной. Можно, конечно, спросить от чего Вы питаете контроллер, но … отчего бы не питали – намного лучше не станет.

Паспортную точность АЦП на Nano Вы в принципе не получите никогда, т.к. на этой плате питание аналоговой части неправильно (упрощённо) разведено (см. даташит). Кроме того, таким способом измерения Вы опять же никогда не получите паспортную точность.

Чтобы получить точность ±2lsb, которая указана в даташите, Вам необходимо:

  1. Правильно развести аналоговое питание платы (про Nano/Uno забудьте);
  2. Измерение проводить в режиме “ADC Noise Reduction” (см. даташит), т.е. погружая контроллер на время измерения в специальный режим сна;
  3. Обеспечить хорошее, спокойное питание контроллера.
  4. В качестве референса брать не напряжение питания (оно может меняться, например, по ходу просадки батареи), а внутренне опорное напряжение, которое надо заранее промерить и откалибровать. Но это не жёсткое требование. При хорошем, надёжном питании контроллера, можно и от него отталкиваться – получается.

При таких условиях паспортная точность вполне достигается.

Усреднение может помочь в некоторых случаях.

1 лайк

Уберите соединение с Vin. Может быть ситуация улучшится. Но мой опыт измерения температур разными способами показывает, что разброс измерений всегда есть.

а на Vin можно пялить 9В?

[quote=“ВладФ, post:4, topic:14195”]
Уберите соединение с Vin. Может быть ситуация улучшится.
[/quote]Я схемку с разбегу накидал, ошибся чуть. Там нет соединения делителя с Vin.

[quote=“Arduman, post:5, topic:14195, full:true”]
а на Vin можно пялить 9В?
[/quote]По даташиту на нану, там стоит UA78M05, который позволяет до 35V по входу. Наши китайские бракоделы могут воткнуть туда и чего попроще, но вольт 15, думаю, оно схавает.

Вот тут можно немного подробнее? Вчера при гуглении попадалась процедура калибровки АЦП наны, но тогда не придал значения, а сейчас не могу найти!

Простите мне моё старческое слабоумие, а где тут кнопка редактирования поста? Или нет такой?

Новичкам недоступно. Появится начиная с какого-то там количества постов

Можно. Вот коллекция аппнот про АЦП.

  1. Правильная разводка питания есть вот здесь в первой главе – AT01080_schematic-checklist.pdf - Google Drive
  2. Про калибровку и вообще про АЦП – Atmel-2559-Characterization-and-Calibration-of-the-ADC-on-an-AVR_ApplicationNote_AVR120.pdf - Google Drive
  3. Про АЦП и понимание его работы – atmel-8456-8-and-32-bit-avr-microcontrollers-avr127-understanding-adc-parameters_application-note.pdf - Google Drive
  4. Про измерение собственного питания – Measure VCC-Battery Voltage.pdf - Google Drive
  5. Понимание параметров АЦП. Это про то, что означают слова написанные в даташите. Тут же есть про технику оверсамплинга и как ею пользоваться – Understanding-ADC-parameters_application-note.pdf - Google Drive

Только, по личному опыту добавлю, есть тут одна тонкость.

Не ведитесь на слова типа «аккуратно измерьте напряжение на ARef высокоомным мультиметром». Не знаю насколько высокоомны мультиметры в их лаборатории, но у любителя точно нет мультиметра, способного адекватно измерить напряжение на ARef. Вы намеряете цену на овёс.

Я всегда в таких случаях поступаю так: переворачиваю формулу, чтобы не вычислять, например, питание через напряжение на ARef, а, наоборот, вычислять напряжение на ARef через питание. Уж питание-то я могу хорошо измерить разумным прибором. Так вот, тщательно измеряю несколько раз, а ARef рассчитываю и потом его использую как если бы измерил. Результаты вполне адекватные получаются.

2 лайка