Доброе время суток, в общем и целом нужна помощь с усреднением значения с потенционометра, много чего перепробовал, но дребезжит всё равно, может есть тупое и простое решение, до которого мой уже сонный мозг не додумался?
Для начала задаю максимальные и минимальные значения, преобразую их в количество светодиодов на ленте, дальше начинаются танцы с бубном…
Может есть у кого нормальный усреднитель/фильтр значений, что бы я просто свои переменные подставил в конце концов…
Если речь идет об AVR (ТС забыл упомянуть о том, какой используется контроллер), то при наличии конденсатора (по рекомендации поста 3) результат должен либо стоять, как вкопанный, либо столь же стабильно поочередно воспроизводить два смежных значения. Что теоретически позволяет распознать 2047 уровней. Если этого не происходит, вероятно, дело в том, что напряжение (либо измеряемое, либо опорное, либо оба сразу) на самом деле нестабильно.
Простейший вариант, предложенный @v258, может настраиваться константами вплоть до нескольких десятков.
Усреднение может быть не только таким, как указал @v258, но и просто складывать несколько (2, 4, 8, 16, 32…) результата измерения и по ним находить среднее.
Можно использовать и более сложные схемы обработки (уже, строго говоря, не являющиеся усреднением), например, запоминать старое значение и придерживаться его до тех пор, пока новое не будет отличаться от него на N единиц, где N, опять же, можно подбирать.
Конечно не то. Во-первых i нужно инициализировать, т.е. сразу задавать значение 0, во-вторых, если вы делаете 9 итераций, зачем делите на 10? И в-третьих - зачем вам нужен массив, сразу плюсовать вообще не вариант?
этот кусок не компилируется, потому большая часть несообразностей просто не может быть обсуждаема.
зачем здесь массив и два отдельных цикла - совершенно непонятно.
переменная цикла не инициализируется. Да и вообще достаточно было бы byte.
переменная sum вовремя не обнуляется - насуммировать туда можно сколько угодно вплоть до переполнения.
зачем 5-мс паузы также непонятно.
про странный выбор констант уже упоминали. И, кстати, из моего сообщения можно было сделать вывод, что рекомендуемые значения - степени двойки, а не непонятно откуда взявшиеся 9 или 10.
А самому подумать? Зачем тут какой-то пример? Логика-то элементарная - если новое значение отличается от старого более чем, например, на пять - запоминаем новое, если нет - используем старое.
Весь пример представляет из себя одну строчку с оператором if.
Среднее значение можно получить используя примерно такой алгоритм:
1.считываем значения в массив ,длинной=n ,n-раз
2.сортируем массив
3.отбрасываем несколько начальных и конечных элементов массива (часть самых высоких и самых низких значений) (скачки, провалы)
4.находим среднее арифметическое оставшихся значений.
Переведите этот алгоритм в код и будет то, что вам требуется
Ну да, оставляем некоторое количество значений. В пределе - одно.
Кстати, медиана - не всегда “хорошее” среднее. Вот, например, как “тикает” millis на AVR: за секунду происходит 976 приращений - большая часть на единицу, а несколько - на двойку. В среднем - раз в 1.000 мс. А если посчитать медиану - получится раз в 1.024 мс. Да и вообще любые “отбрасывания!” с двух сторон (после сортировки) приводят к искажению результата.