You can get that kind of effect by averaging many ADC samples with less than half an ULP of noise.

Here, it looks like each ADC reading is about 0.167 V, and there is only about 0.042 V of noise, or ±0.25 in the ADC scale.

When the voltage corresponds to ADC reading interval

*N*+0.25 ...

*N*+0.75, it will always produce

*N*, giving the flat part.

Within

*N*-0.25 ...

*N*+0.25, it produces either

*N*-1 or

*N*, the counts and thus average corresponding to the voltage. This is why there is no discrete jump to another integer level, but a rounded corner before and after each level.

For averaging to work, there must be at least ±0.5 units in the least significant place (or ±0.5 with respect to the ADC reading scale) of noise for averaging to work intuitively.

Here is a synthetic example of what happens when there is ±0.25 units of noise, and you take a running average over 32 samples: