будет лучше, если скомбинировать оверсемплинг и усреднение... сумму 16-и выборок, поделить на 4, а результат усреднить (суммировать 16 результатов и поделить на 16)
так результат получается точнее (как ни странно).
что-то вроде этого (это псевдокод, не докапывайтесь... у меня DMA делает 16 выборок)
uint32_t res = 0;
for (int i = 0; i < 16; i++) {
uint32_t tmp = 0;
for (int j = 0; j < 16; j++) tmp += GetADC(0);
res += tmp >> 2;
}
return (res >> 4);