[sdiy] Digital filtering of pot input

Richie Burnett rburnett at richieburnett.co.uk
Fri Dec 2 15:28:08 CET 2016

You're on the right track, but you haven;t implemented it correctly.  You 
need to introduce a dead-band around the current output value in which the 
ADC result is allowed room to wiggle around.  For example, you might choose 
to add a dead-band of +/- 4 counts....

So if the current stored output value is 100, the lower edge of the 
dead-band is 96 and the upper edge is 104.  If the ADC result wiggles around 
between 96 and 104 you do nothing.
If it steps below 96, you add 4 to its value, store the new output value and 
update the upper and lower edges of the dead-band.
If it steps above 104, you subtract 4 from its value, store the new output 
value and update the upper and lower edges of the dead-band.

If you choose the dead-band to be just a bit larger than the amount of noise 
your ADC is producing you won't get any spurious changes in the output value 
unless *you* physically turn the pot up or down.

If you choose an ADC with more bits than you need, then you can implement 
the dead-band and still achieve a full range of outputs without stepping 
when you reduce the bit depth down to what you need for the actual output. 
For instance you might use a 10-bit ADC for what will ultimately be 7-bit 

When you are testing your implementation you can temporarily increase the 
dead-band to something large that is clearly noticeable when turning the 
pot.  Then you can feel a noticeable dead-band: As you turn the pot 
clockwise the output value will increase, but if you stop and turn it back 
anticlockwise, you have to go a little way back before it starts counting 
back down.  This proves you've implemented it correctly.  It's kind of like 
backlash in gears.  The ideal amount of dead-band is an amount that swallows 
up the ADC noise but is imperceptible to the end user.

As an aside, if you're putting the product into an electrically noisy (EMI) 
environment or using cheap pots that might degrade, then add a bit more 
dead-band than you think you need, just to be on the safe side.  Most users 
don't even notice the "backlash" effect when they turn a pot, but they will 
notice control values that jump around when they're not touching the pot!!!


PS. Roman's suggestion of averaging multiple samples is also a very wise 
suggestion.  Do this as well if you can.  A trick I used to use was to read 
ADC inputs repeatedly for 100ms then take the average.  Since 100ms is a 
whole number of cycles at both 50Hz and 60Hz, any contribution from mains 
"hum" cancels out in the average, and doesn't effect the measurement result.

-----Original Message----- 
From: Matthias Puech
Sent: Friday, December 02, 2016 12:51 PM
To: synth-diy at synth-diy.org
Subject: [sdiy] Digital filtering of pot input

Hi DIYists,

I have a potentially simple question on filtering. I get my pot reading from 
a very noisy ADC (on-board STM32F4), but I absolutely need the value to be 
constant when I'm not touching the pot. It's ok for it to be a bit wobbly 
while I am turning the pot. Now I'm using hysteresis:

if (fabs(reading - output) < 0.01)
  output = reading;

which gives me a stable value when I'm not turning the pot, but I am annoyed 
by the staircase effect while I'm turning it. Is there a simple filter that 
will let signal through when there is consistent movement but hold it when 

Thanks in advance,
Synth-diy mailing list
Synth-diy at synth-diy.org

No virus found in this message.
Checked by AVG - www.avg.com
Version: 2016.0.7924 / Virus Database: 4728/13523 - Release Date: 12/02/16 

More information about the Synth-diy mailing list