Travis M. Best

12-14-2009, 04:33 AM

Is their a easy way to average 100+ samples from a A/D Converter without having a ton a variables???

Thanks

Travis Best

Thanks

Travis Best

View Full Version : Analog To Digital Converter Averaging

Travis M. Best

12-14-2009, 04:33 AM

Is their a easy way to average 100+ samples from a A/D Converter without having a ton a variables???

Thanks

Travis Best

Thanks

Travis Best

MacGeek117

12-14-2009, 04:48 AM

What's the resolution of your ADC?

MacGeek117

▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔

BS2: $49

SX48 Protoboard: $10

Propeller Protoboard: Priceless

www.apple.com (http://www.apple.com)

www.parallax.com (http://www.parallax.com/)

www.goldmine-elec.com (http://www.goldmine-elec.com)

www.expresspcb.com (http://www.expresspcb.com)

www.jameco.com (http://www.jameco.com)

MacGeek117

▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔

BS2: $49

SX48 Protoboard: $10

Propeller Protoboard: Priceless

www.apple.com (http://www.apple.com)

www.parallax.com (http://www.parallax.com/)

www.goldmine-elec.com (http://www.goldmine-elec.com)

www.expresspcb.com (http://www.expresspcb.com)

www.jameco.com (http://www.jameco.com)

Leon

12-14-2009, 04:49 AM

For each 100 samples, zero the variable, add each sample to it, then divide by 100. 128 would be easier, as you can use the barrel shifter to divide by 128 in one operation.

Leon

▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔

Amateur radio callsign: G1HSM

Leon

▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔

Amateur radio callsign: G1HSM

Tubular

12-14-2009, 04:54 AM

The proper way is to have a circular buffer 100 samples long. Actually 128 samples to make dividing easier. You keep a total of the sum of the 100 samples. When a new sample comes along you subtract the oldest (100 samples ago) and add the new value.

An alternative is to use something along the lines of this algorithm which works ok when there isn't large noise

AverageVal = AverageVal + (NewSample-AverageVal) / 128

effectively each above/below average new sample increases/decreases the long term average by a smidge. You need to either use floating point or shift up AverageVal a few digits (like a fixed decimal point)

An alternative is to use something along the lines of this algorithm which works ok when there isn't large noise

AverageVal = AverageVal + (NewSample-AverageVal) / 128

effectively each above/below average new sample increases/decreases the long term average by a smidge. You need to either use floating point or shift up AverageVal a few digits (like a fixed decimal point)

BR

12-14-2009, 07:33 AM

Sounds like a job for a moving average filter:

pub ma16(x_meas):x_ret

''16-sample moving average filter, implemented with recursion.

''Max filter update rate ~13000 samples/sec for 1 cog @ clkfreq=80

ptr &= %00001111 'mask off all but lower four bits

sum := sum + x_meas - x_buf16[ptr]

x_buf16[ptr] := x_meas

x_ret := sum ~> 4 'divide sum by 16

ptr++

dat

'-----------[ Predefined variables and constants ]-----------------------------

x_buf16 long 0,0,0,0,0,0,0,0 '16-place filter input history buffer

long 0,0,0,0,0,0,0,0

sum long 0

ptr long 0 'pointer (set up as ring buffer)

This particular example is for a 16 element moving average, but you could easily make it into a 128 point moving average by changing the buffer size, the mask, and and the shift arithmetic right. There are a variety of additional filter examples in this thread (http://forums.parallax.com/showthread.php?p=861859).

Post Edited (BR) : 12/13/2009 11:38:26 PM GMT

pub ma16(x_meas):x_ret

''16-sample moving average filter, implemented with recursion.

''Max filter update rate ~13000 samples/sec for 1 cog @ clkfreq=80

ptr &= %00001111 'mask off all but lower four bits

sum := sum + x_meas - x_buf16[ptr]

x_buf16[ptr] := x_meas

x_ret := sum ~> 4 'divide sum by 16

ptr++

dat

'-----------[ Predefined variables and constants ]-----------------------------

x_buf16 long 0,0,0,0,0,0,0,0 '16-place filter input history buffer

long 0,0,0,0,0,0,0,0

sum long 0

ptr long 0 'pointer (set up as ring buffer)

This particular example is for a 16 element moving average, but you could easily make it into a 128 point moving average by changing the buffer size, the mask, and and the shift arithmetic right. There are a variety of additional filter examples in this thread (http://forums.parallax.com/showthread.php?p=861859).

Post Edited (BR) : 12/13/2009 11:38:26 PM GMT