Шумный analogRead

Я пытаюсь считать напряжение с помощью Arduino, вот код:

float r1 = 99700;
float r2 = 10004;
float adc, voltage;
unsigned long analog;
void setup() {
  Serial.begin(9600);
  analogReference(EXTERNAL);
  pinMode(A0, INPUT);
}

void loop() {
  for (int i = 0; i < 64; ++i) {
    analog += analogRead(A0);
    delay(1);
  }
  analog = analog / 64;
  adc = (analog * 2.441) / 1024;
  voltage = adc / (r2 / (r1 + r2));
  Serial.print(analog);
  Serial.print(", ");
  Serial.print(adc);
  Serial.print(", ");
  Serial.print(voltage);
  Serial.println(" ");
}

У меня были ОЧЕНЬ шумные показания, и я добавил внешний источник опорного напряжения (TL431), а также подключил переключающий адаптер 9 В к Arduino UNO. Но у меня все еще был некоторый шум в аналоговых показаниях, поэтому, как вы можете видеть в коде, я беру 64 выборки и усредняю их.

После всего этого шум значительно уменьшился, но не полностью:

console

Что еще нужно сделать, чтобы получить стабильное чтение?

Если взять 1024 сэмпла, шум будет удален, но тогда я пожертвую производительностью...

, 👍0

Обсуждение

ваш 0.46 выглядит очень устойчиво :) SCNR. Вы можете посмотреть на сам датчик и его проводку. Добавьте конденсаторы..., @DataFiddler

@DataFiddler на этом снимке экрана он выглядит устойчивым, но это не так, ведь значение IS зависело от исходного аналогового чтения ..., @ElectronSurf

диапазон AnalogRead от 0 до 1023. вы читаете 190. что такое магические числа?, @Juraj

@Juraj цифры не имеют значения, я могу откалибровать их так или иначе, мне нужно стабильное чтение., @ElectronSurf

общая земля подключена?, @Juraj

@Juraj да, они связаны., @ElectronSurf

Из чего вы читаете? Как он подключен к ардуино?, @Majenko

Показания @Majenko взяты из двух делителей напряжения с резистором 1% и подключены к макетной плате., @ElectronSurf


1 ответ


Лучший ответ:

2

Я решил проблему, добавив 3 конденсатора:

  1. 220 мкФ на блоке питания Arduino.

  2. 100 мкФ на выходе TL431.

  3. 1 мкФ на входе A0.

Я также увеличил частоту дискретизации до 128 раз (и убрал задержку).

Вот результат, точный, как мой мультиметр:

concole

результат

Разница в более высоких напряжениях по-прежнему составляет 2 мВ из-за моего опорного напряжения 2,5 В и 10-битного разрешения АЦП Arduino (2,5 / 1024 = 0,002).

,

По сути, Serial.begin(9600); и многое другое управляет скоростью вывода., @DataFiddler

АЦП всегда шумят. Если вы углубитесь в спецификации конкретного процессора, вы можете обнаружить, что 10-битный аналого-цифровой преобразователь имеет только, возможно, 8 бит значимых данных. 1) Убедились ли вы, что процессор отслеживает ожидаемое напряжение, изменяя напряжение на входе аналого-цифрового преобразователя? 2) Что вы используете в качестве опорного напряжения. И рассмотрите возможность использования экспоненциального усреднения вместо усреднения фиксированной группы аналого-цифровых преобразований., @st2000

@ st2000 да, он показывает правильные напряжения с разницей ~ 2 мВ, эталон напряжения - TL431. я даже не знаю, что такое экспоненциальное усреднение! сейчас погуглю. Спасибо., @ElectronSurf

Похоже, википедия называет это [экспоненциальным сглаживанием](https://en.wikipedia.org/wiki/Exponential_smoothing), а не экспоненциальным усреднением. Выбирайте значения на основе степеней двойки, чтобы упростить математику и адаптироваться к встраиваемому программированию., @st2000