Нестабильные показания АЦП

Добрый день.
Есть плата Aduino Nano.

Читаю значения,
loop(){

int delay = analogRead(RRR);
Serial.println(delay);

}
а они нестабильные.

341
366
342
368
342
370
348
364
350
357

Что я не так делаю?

В целом показания нормальные, ничего криминального нет. Выбросы не улетают за 4.2% от среднего.

Значение Отл. от среднего %
341 13,8 4,05%
366 11,2 3,06%
342 12,8 3,74%
368 13,2 3,59%
342 12,8 3,74%
370 15,2 4,11%
348 6,8 1,95%
364 9,2 2,53%
350 4,8 1,37%
357 2,2 0,62%
354,8

Если Вам хочется постабильнее, Вы должны сами себе внятно ответить на следующие вопросы:

  1. почему на пине ARef Вы не поставили конденсатор?
  2. каково качество питания (какие там пульсации)?
  3. каково качество источника 3.3В, который, судя по схеме, совсем отдельный (какие там пульсации)?

Так, для справки пара соображений:

  1. достичь паспортного значения ошибок ADC на Нана не получится, там сэкономили на питании аналоговой части микросхемы. Если нужно, то надо брать голую микросхему и делать нормальное питание самому;
  2. Замерять напряжение на пине лучше не во время работы контроллера, как это делает ардуиновская среда, а погружая контроллер в сон, чтобы он меньше “шумел”. В даташите это называется техникой уменьшения шума.

Если эти два пункта соблюсти и озаботиться качеством питания (а ещё лучше измерять от внутреннего опорного), то вполне удаётся достичь заявленных ± 2 lbs.

1 лайк

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

Содержательно. Спасибо за помощь.

1 лайк

На здоровье. Еще по русскому языку учебник прочитай, как с элетричеством разберешься.

2 лайка

Евгений, спасибо за подробный ответ.
Конденсатор никак не улучшил качество показаний.

Скорее всего вы правы. Это наводки от всяких импульсных источников, которые находятся рядом.

Если так, то бороться надо в первую очередь с ними. Хотя в разумных пределах могут помочь конденсатор на ARef в купе с правильно разведённым питанием (на Ардуинах на этом сэкономили).

1 лайк

Поменять потенциометр, читать вход с паузами,… искать истину :slight_smile:

Усреднять значения

loop(){
…
  static int delay = analogRead(RRR);
  delay = (analogRead(RRR) + delay * 3)/4;
  Serial.println(delay);
…
}
1 лайк

Посмотрел шум на источнике 3.3 В.
Он небольшой, всего 30 мВ.

Потенциометр прецизионный. Читать с паузами не поможет, поскольку шум это случайный процесс.

Да, я по этому пути и пошел. Только усредняю по 50 значениям.

  ...
  const int measurings = 50;  // Усредняем показания по 50-ти значениям
  int delay = 0;

  for(int x=0; x < measurings; x++)
    delay += analogRead(RRR);

  delay /= measurings * 4;

#ifdef DEBUG
  Serial.println(delay);
#endif  ...

Получается такой вот результат:

40
40
40
39
39
40
40
39

На этом, думаю, вопрос закрыт.
Всем отклинувшимся спасибо за помощь.

Каждое считывание analogRead() занимает примерно 112 мкс, соответственно, этот цикл занимает примерно 5,6 мс. Стоит иметь это в виду.

1 лайк

Спасибо огромное. У меня процессы небыстрые. Я делаю вытяжку для бани.
Опрашиваются микроволновые датчики, расположенные в туалете и в душе и кнопка в кухонной вытяжке. По результатам открываются воздушные заслонки и включается вентиллятор.

Раз в секунду прерывание декрементирует счетчики таймеров заслонок и вентиллятора.
Поэтому времени вагон.

Питание я брал от дорогого и хорошего, как я считал, USB хаба. Проверять осцилографом не считал нужным, но все же пнул на 5В и обомлел. Там были треугольные пульсации амплитудой 600 мВ.
Так что красивый добротный корпус и относительно высокая цена, отнюдь не гарантия качественного продукта.

А теперь ткни пальцем в стандарте USB, какому нормативу эти не соотвествует.

Вижу, ты мастер коммуникации. Умеешь парой слов расположить к себе людей.

1 лайк

Тогда ставим емкость параллельно входу. Желательно поближе к к микросхеме.

1 лайк

Я пользовался USB для заливки и отладки.
А в штатном режиме используется отдельный источник питания.
Собственно, когда я его подключил, то увидел, что никакого джиттера на АЦП нет и показания стабильные. После и посмотрел, что творится на питании от USB.

как по мне, то на канал АЦП конденсатор 0.1-1 мкФ поставить и всё норм. и усреднять ничо не надо.