Шумный 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 выборки и усредняю их.
После всего этого шум значительно уменьшился, но не полностью:
Что еще нужно сделать, чтобы получить стабильное чтение?
Если взять 1024 сэмпла, шум будет удален, но тогда я пожертвую производительностью...
@ElectronSurf, 👍0
Обсуждение1 ответ
Лучший ответ:
Я решил проблему, добавив 3 конденсатора:
220 мкФ на блоке питания Arduino.
100 мкФ на выходе TL431.
1 мкФ на входе A0.
Я также увеличил частоту дискретизации до 128 раз (и убрал задержку).
Вот результат, точный, как мой мультиметр:
Разница в более высоких напряжениях по-прежнему составляет 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
- Расширенная настройка АЦП на Due (SAM3X8E) для повышения точности
- Ardunio Mega/ATmega2560: использование порта F или K как для аналоговых входов, так и для цифровых выходов.
- Определенные порты на Teensy 3.6 не считывают правильное битовое разрешение с помощью библиотеки ADC?
- Выход AnalogRead() колеблется, даже если контакт заземлен
- Как прочитать значение АЦП без общего заземления? (Возможно или нет!)
- Потенциометр отображает только аналоговое значение напряжения 1023 в proteus
- Когда АЦП снимает показания?
- Печать результата функции AnalogRead() приводит к сбою Arduino
ваш 0.46 выглядит очень устойчиво :) SCNR. Вы можете посмотреть на сам датчик и его проводку. Добавьте конденсаторы..., @DataFiddler
@DataFiddler на этом снимке экрана он выглядит устойчивым, но это не так, ведь значение IS зависело от исходного аналогового чтения ..., @ElectronSurf
диапазон AnalogRead от 0 до 1023. вы читаете 190. что такое магические числа?, @Juraj
@Juraj цифры не имеют значения, я могу откалибровать их так или иначе, мне нужно стабильное чтение., @ElectronSurf
общая земля подключена?, @Juraj
@Juraj да, они связаны., @ElectronSurf
Из чего вы читаете? Как он подключен к ардуино?, @Majenko
Показания @Majenko взяты из двух делителей напряжения с резистором 1% и подключены к макетной плате., @ElectronSurf