Добрый день.
Есть плата Aduino Nano.
Читаю значения,
loop(){
…
int delay = analogRead(RRR);
Serial.println(delay);
…
}
а они нестабильные.
341
366
342
368
342
370
348
364
350
357
Что я не так делаю?
Добрый день.
Есть плата 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 |
Если Вам хочется постабильнее, Вы должны сами себе внятно ответить на следующие вопросы:
Так, для справки пара соображений:
Если эти два пункта соблюсти и озаботиться качеством питания (а ещё лучше измерять от внутреннего опорного), то вполне удаётся достичь заявленных ± 2 lbs.
Придумываешь сам себе как работает электричество, вместо того, чтобы читать учебник.
Содержательно. Спасибо за помощь.
На здоровье. Еще по русскому языку учебник прочитай, как с элетричеством разберешься.
Евгений, спасибо за подробный ответ.
Конденсатор никак не улучшил качество показаний.
Скорее всего вы правы. Это наводки от всяких импульсных источников, которые находятся рядом.
Если так, то бороться надо в первую очередь с ними. Хотя в разумных пределах могут помочь конденсатор на ARef в купе с правильно разведённым питанием (на Ардуинах на этом сэкономили).
Поменять потенциометр, читать вход с паузами,… искать истину
Усреднять значения
loop(){
…
static int delay = analogRead(RRR);
delay = (analogRead(RRR) + delay * 3)/4;
Serial.println(delay);
…
}
Посмотрел шум на источнике 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 мс. Стоит иметь это в виду.
Спасибо огромное. У меня процессы небыстрые. Я делаю вытяжку для бани.
Опрашиваются микроволновые датчики, расположенные в туалете и в душе и кнопка в кухонной вытяжке. По результатам открываются воздушные заслонки и включается вентиллятор.
Раз в секунду прерывание декрементирует счетчики таймеров заслонок и вентиллятора.
Поэтому времени вагон.
Питание я брал от дорогого и хорошего, как я считал, USB хаба. Проверять осцилографом не считал нужным, но все же пнул на 5В и обомлел. Там были треугольные пульсации амплитудой 600 мВ.
Так что красивый добротный корпус и относительно высокая цена, отнюдь не гарантия качественного продукта.
А теперь ткни пальцем в стандарте USB, какому нормативу эти не соотвествует.
Вижу, ты мастер коммуникации. Умеешь парой слов расположить к себе людей.
Тогда ставим емкость параллельно входу. Желательно поближе к к микросхеме.
Я пользовался USB для заливки и отладки.
А в штатном режиме используется отдельный источник питания.
Собственно, когда я его подключил, то увидел, что никакого джиттера на АЦП нет и показания стабильные. После и посмотрел, что творится на питании от USB.
как по мне, то на канал АЦП конденсатор 0.1-1 мкФ поставить и всё норм. и усреднять ничо не надо.