ADC Noise Software Solution.

9 años 3 meses antes #199 por maykef
I finally found a simple way to remove noise from of Arduino ADC, using a recursive low-pass filter. See the code:

int y0, y1, x0, x1, d0 = 0, d1 = 0; // filter variables

/* Use these equations to calculate the filter coefficients:

decay= e^(-1/n)

n is the number of samples that produce an equivalent time to discharge a capacitor. I use 7.

b0=1-decay a1=decay


y = x*b0 + delay*a1

delay=y


*/

x0 = in_ADC0;

y0 = ((x0*15)/100) + ((d0*85)/100);

d0=y0;


x1 = in_ADC1;

y1 = ((x1*15)/100) + ((d1*85)/100);

d1=y1;
El siguiente usuario dijo gracias: caleborion, shanemikel

Por favor, Identificarse para unirse a la conversación.

9 años 3 meses antes #203 por shanemikel
Respuesta de shanemikel sobre el tema ADC NOISE SOFTWARE SOLUTION!
Could you please elaborate a little here. For instance, I don't see where x comes from before you get to y=x*b0+delay*a1 . Also, you're using decay and delay (but where did delay come from?). I can't tell if that is code or pseudocode decay=e^(-1/n) is that e to the power of (-1/n) or binary arithmetic? If you could attatch a copy of a working sketch with this in it it would be easier for me to follow.

Por favor, Identificarse para unirse a la conversación.

9 años 3 meses antes - 9 años 3 meses antes #204 por Ray
Respuesta de Ray sobre el tema ADC NOISE SOFTWARE SOLUTION!
Thanks for your contribution :) ,I will try to code some examples and make some recordings :guitarfende :pedalmxr: :ampmarshall during this week,
Cheers! ;)

Por favor, Identificarse para unirse a la conversación.

9 años 3 meses antes #206 por maykef
Respuesta de maykef sobre el tema ADC NOISE SOFTWARE SOLUTION!
X = CURRENT INPUT

Y = CURRENT OUTPUT

DECAY = PARAMETER TO CALCULATE COEFFICIENTS

DELAY = PREVIOUS INPUT

Por favor, Identificarse para unirse a la conversación.

9 años 3 meses antes #207 por maykef
Respuesta de maykef sobre el tema ADC NOISE SOFTWARE SOLUTION!
Tip: This filter will make the signal a little more bass, so you have to test values for n, or add more gain on distortion effects.

Por favor, Identificarse para unirse a la conversación.

9 años 3 meses antes #208 por maykef
Respuesta de maykef sobre el tema ADC NOISE SOFTWARE SOLUTION!
You will use these formulas to calculate the coefficients before you put them on the code

e = 2,71828183 It'S LIKE pi = 3,1415

Por favor, Identificarse para unirse a la conversación.

9 años 2 meses antes #211 por Ray
Respuesta de Ray sobre el tema ADC NOISE SOFTWARE SOLUTION!

Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.

Por favor, Identificarse para unirse a la conversación.

9 años 2 meses antes - 9 años 2 meses antes #219 por maykef
Respuesta de maykef sobre el tema ADC NOISE SOFTWARE SOLUTION!
You must apply the filter immediately after storing the values of ADC, before any processing:

// Licensed under a Creative Commons Attribution 3.0 Unported License.
// Based on rcarduino.blogspot.com previous work.
// www.electrosmash.com/pedalshield


int in_ADC0, in_ADC1; //variables for 2 ADCs values (ADC0, ADC1)
int POT0, POT1, POT2, out_DAC0, out_DAC1; //variables for 3 pots (ADC8, ADC9, ADC10)
int LED = 3;
int FOOTSWITCH = 7;
int TOGGLE = 2;
int x_0=0, x_1=0, d_0=0, d_1=0; // NO NEED DOUBLE USE INT AND LONG
long f_0=0, f_1=0;

void setup()
{
//ADC Configuration
ADC->ADC_MR |= 0x80; // DAC in free running mode.
ADC->ADC_CR=2; // Starts ADC conversion.
ADC->ADC_CHER=0x1CC0; // Enable ADC channels 0 and 1.

//DAC Configuration
analogWrite(DAC0,0); // Enables DAC0
analogWrite(DAC1,0); // Enables DAC0
}

void loop()
{
//Read the ADCs
while((ADC->ADC_ISR & 0x1CC0)!=0x1CC0);// wait for ADC 0, 1, 8, 9, 10 conversion complete.
in_ADC0=ADC->ADC_CDR[7]; // read data from ADC0
in_ADC1=ADC->ADC_CDR[6]; // read data from ADC1
POT0=ADC->ADC_CDR[10]; // read data from ADC8
POT1=ADC->ADC_CDR[11]; // read data from ADC9
POT2=ADC->ADC_CDR[12]; // read data from ADC10

//USE IT HERE

x_0 = in_ADC0;
f_0 = ((x_0*13)/100) + ((d_0*87)/100);
d_0 = (int)f_0;
in_ADC0 = (int)f_0;

x_1 = in_ADC1;
f_1 = ((x_1*13)/100) + ((d_1*87)/100);
d_1 = (int)f_1;
in_ADC1 = (int)f_1;


//Add volume feature with POT2
out_DAC0=map(in_ADC0,0,4095,1,POT2);
out_DAC1=map(in_ADC1,0,4095,1,POT2);


//Write the DACs
dacc_set_channel_selection(DACC_INTERFACE, 0); //select DAC channel 0
dacc_write_conversion_data(DACC_INTERFACE, y_0);//write on DAC
dacc_set_channel_selection(DACC_INTERFACE, 1); //select DAC channel 1
// dacc_write_conversion_data(DACC_INTERFACE, out_DAC1);//write on DAC
}
El siguiente usuario dijo gracias: shanemikel

Por favor, Identificarse para unirse a la conversación.

7 años 5 meses antes #649 por BowDown
Respuesta de BowDown sobre el tema ADC NOISE SOFTWARE SOLUTION!
I am going to test this soon. What have other members found? Does this work?

Por favor, Identificarse para unirse a la conversación.

7 años 5 meses antes - 7 años 5 meses antes #652 por Ray
Respuesta de Ray sobre el tema ADC NOISE SOFTWARE SOLUTION!
We did not make much progress here... maykef published some code but we tried them without much success.
In theory it should be simple, just summing some samples before releasing them should filter the high freq noise.

Por favor, Identificarse para unirse a la conversación.

Tiempo de carga de la página: 0.079 segundos