¿Cómo encontrar el área bajo la curva de una señal?

0

Estoy usando un circuito Wheatstone Bridge con un sensor de presión. Quiero encontrar el área bajo la curva cuando la señal pasa de 0 a máximo nuevamente a 0. He intentado usar ADC de Arduino y luego usar el contador para contar ++ siempre que la señal no sea cero.

simular este circuito : esquema creado usando CircuitLab

Los valores anteriores no son exactos.

Lo que quiero preguntar es cómo puedo encontrar el área bajo la curva de esta señal. Si simplemente agrego todas las señales, la variable que almacena el resultado podría desbordarse. Quiero encontrar el área e imprimirla en una pantalla o algo así. ¿Hay alguna forma mejor de hacerlo?

    
pregunta Pqrs169

4 respuestas

0

Simplemente mediría el voltaje a través del ADC en intervalos de tiempo periódicos exactos y mantendría un cálculo de suma corriente desde el cruce de cero hasta el cruce de cero. El resultado tendría las unidades de voltios-segundos porque el eje y de la curva medida es el voltaje y el eje x es el tiempo.

Por lo tanto, debería invocar su rutina de lectura de ADC en un bucle de tiempo bien calibrado, o activarlo desde una interrupción de temporizador. Activará este proceso desde un cruce por cero positivo hasta el próximo cruce por cero positivo; o, puedes hacerlo entre cruces de cero negativos.

En el caso de su puente, debe realizar una medición diferencial: Out2 - Out1 o Out1 - Out2 dependiendo de cómo funciona el transductor de presión. Si la onda es bidireccional (voltajes superiores a Out1 para la mitad del ciclo y debajo para el otro) medio), es necesario tratar ambos semiciclos como si fueran excursiones positivas. En otras palabras, tome el valor absoluto de la lectura de voltaje. Este es el caso porque las áreas, por su naturaleza, son siempre positivas.

Como cuestión práctica, la suma acumulada de las lecturas de ADC será muy grande. La suma final dependerá de cuántas lecturas tome por ciclo. Para manejar esto en su programa, escriba la suma corriente como un tipo de variable numérica más grande, como un entero largo, un entero doble, una palabra larga o incluso un punto flotante.

Luego, dividirá la suma total de las lecturas de voltaje de ADC por el número de lecturas de ADC / segundo y luego por el número de conteos / voltios de ADC para escalar la respuesta a las unidades de voltios-segundos. Aunque, si todo lo que necesita es un área bajo la curva relativa para comparar diferentes escenarios operacionales, puede prescindir de estas divisiones finales y simplemente usar la suma corriente aunque sea un número muy grande.

Si necesita hacer un solo cálculo de un ciclo aislado, el programa es bastante simple. Si necesita realizar lecturas de ciclo a ciclo secuenciales, el programa se vuelve más complejo porque no tendrá tiempo para realizar los cálculos finales de área entre cruces por cero. En este caso, debe usar un proceso de primer plano para dirigir las lecturas del ADC y realizar los cálculos y un proceso en segundo plano para tomar las medidas del ADC, o viceversa. Otro enfoque, si su aplicación lo permite, es tomar mediciones de ADC en ciclos alternos (por ejemplo, incluso), y realizar los cálculos durante el otro ciclo (por ejemplo, impar).

    
respondido por el FiddyOhm
0

¿Qué tan precisa debe ser la medición? Si no tiene que ser súper preciso, intente usar un tipo float en lugar de long int . Después de cada resultado, divide por alguna constante arbitraria para mantener los números más bajos. Suma estos números más pequeños, luego multiplica el resultado final por la misma constante. Perderá algo de precisión, pero probablemente obtendrá el resultado que desea.

    
respondido por el Trashman
0

Esto supone que su señal es positiva.

uint32_t integrateL = 0; integrateH=0; temp;
double   value;

.
.
.

adc_newvalue = GetADC();

while (adc_newvalue > 0) {
    temp = integrateL;

    integrateL += adc_newvalue; 

    if (integrateL < temp)
        integrateH++;

    value = (double)(integrateH) * (1<<32) + (double)(integrateL);

    Serial.println(value);

    adc_newvalue = GetADC();
}
    
respondido por el Daniel
0

Intentaría implementar un integrador en hardware con un opamp y algunos circuitos para restablecer el valor del integrador. A partir de ahí, puede medir la suma de la señal con el ADC. Estoy seguro de que este método le dará resultados más precisos.

    
respondido por el lucas92

Lea otras preguntas en las etiquetas