Hola implemente un codigo que halla el valor pico de una señal de 60Hz mediante una funcion pero cada vez que se ejecuta la funcion en la señal se genera ruido mientras se ejecuta la funcion. Cuando termina de ejecutarse la funcion la señal queda normal sin ruido.
Adjunto el codigo a continuacion:
unsigned int lectura1,lectura2;
unsigned int mayor,mayor1;
unsigned int valorPico;
char i;
void obtenerPico(unsigned char canal)
{
mayor = 0;
mayor1 = 0;
valorPico=0;
for(i=0;i<1;i++)
{
for(j=0;j<155;j++)
{
lectura1=ADC_Get_Sample(canal);
Delay_us(10);
lectura2=ADC_Get_Sample(canal);
Delay_us(10);
if(lectura2>lectura1) mayor=lectura2;
else mayor = lectura1;
if(mayor>mayor1) mayor1=mayor;
}
valorPico+=mayor1;
}
}
Por lo que describes, no se si estoy entendiendo mal, es que cuando llamas o ejecutas la función obtenerPico, la señal sinusoidal se altera o corrompe. Si es así, tal vez deberías compartir el esquemático de tu hardware.
Respecto a tu código, por lo que comprendo, parece que tomas varias muestras (256). Cada 2 muestras consecutivas comparas ambas señales. En el momento que la segunda muestra sea mayor a la primera, asumes que has encontrado el
valor pico (Aquí creo que deberías retornar o finalizar la función, ya que no tiene sentido seguir realizando comparaciones.
Tal vez exista una mejor manera con amplificadores operacionales (Suponiendo que siempre va a ser una señal sinusoidal), podrías primero integrar a la señal (obtendrías una función coseno respecto a la primera que se puede asumir que es seno), y esta nueva señal pasaría por un detector de cruce por cero.
El detector de cruce por cero genera pulsos justo en los picos de la señal seno (original) y dichos picos podrían ser útiles para que el microcontrolador active el ADC y media el valor de voltaje de la señal original.