Берём очередное значение ADC и сдвигаем влево до упора (в 16-битном слове); if (ADC > Filter) Filter++; if (ADC < Filter) Filter--;
И всё. Значение Filter неторопясь ползёт вслед за ADC.
Помехи с большими выбросами хорошо давятся, так как фильтр нелинейный. В принципе, половина отсчётов АЦП могут быть неправильными, всё равно Filter будет почти где надо.