Buenos días a todos,
Estoy intentando hacer un programa que me capture cuatro muestras simultaneas de una señal a 64KHz que lee el ADC, para posteriormente realizar el cálculo de la fase. El problema es que quiero realizar esto de manera indefinida en el tiempo, por lo que necesito que las muestras que almaceno siempre sean consecutivas, es decir: Si el primer grupo de cuatro son las muestras m1, m2, m3 y m4, el siguiente grupo de cuatro muestras tienen que ser la m5, m6, m7 y m8. No me serviría, por ejemplo, las muestras m7, m8, m9 y m10, perdiendo las muestras m5 y m6 por el camino, ya que esto me daría valores de fase incorrectos.
En el programa que he escrito lo que hago es almacenar en el vector1, gracias a la interrupción del ADC, cuatro muestras consecutivas. Una vez que he almacenado cuatro muestras en el vector1, en la función main copio esas muestras en otro vector (vector2), para asegurarme de que lo que se vaya sobreescribiendo en vector1 ya lo tenga guardado. Una vez hecho esto, calculo la fase con las cuatro muestras almacenadas en vector2, y el ciclo se repite indefinidamente.
Esta sería la interrupción por ADC:
void __attribute__((interrupt, no_auto_psv)) _ADC1Interrupt() {
temp = ADCBUF0;
temp1 = temp;
temp1 = (temp1 * (3.313)) / 1023.0;
vector1[cont] = temp1;
cont++;
if (cont == 4) {
chiv = 1;
}
IFS0bits.AD1IF = 0; // Reseteamos el Flag del ADC
}
y en la función main tendría lo siguiente:
int main(void) {
OscConfig();
Configurar_IO();
ADCInit(); // Inicializamos el conversor A/D
Configurar_UART();
Configurar_Timer32();
while (OSCCONbits.LOCK != 1);
ADCStart(); // Encendemos el ADC
T2CONbits.TON = 1;
while (1) {
if (chiv == 1) {
cont = 0;
chiv = 0;
for (i = 0; i <= 3; i++) {
vector2[i] = vector1[i];
}
denom = vector2[0] - vector2[2];
numer = vector2[3] - vector2[1];
fase = (atan(numer / denom))*(180 / M_PI);
}
}
return 0;
}
Como podéis ver el código no es complicado, tomo cuatro muestras y hago un calculo con ellas, tomo las cuatro siguientes, y vuelvo a hacer el cálculo, y así indefinidamente.
El problema es que creo que, una vez que tengo las cuatro muestras y procedo a calcular la fase, todos esos cálculos que hago en el main son mas lentos que lo que tarda el ADC en coger las cuatro muestras (el ADC funciona a una frecuencia de muestreo de 256KHz), por lo que no da tiempo a ejecutar la rutina en el main cuando el ADC ya produce la interrupción.
Una de las dudas que tengo es si las interrupciones resetean la funcion main. Es decir, si la interrupción del ADC se produce mientras se está ejecutando la linea 5 del main, una vez que ha finalizado la interrupción, ¿se sigue por la línea 5 del main o se resetea y vuelve a empezar de nuevo? Si fuera la primera opción tendría prácticamente 4 ciclos del ADC para ejecutar todo el main, mientras que si fuera la segunda, solo tendría el último ciclo del ADC para hacer el cálculo. Os adjunto todo el código por si queréis echarle un vistazo al completo.
Independientemente de esta duda, si se os ocurre una forma mas eficiente de hacer lo que estoy intentando hacer, os agradecería enormemente vuestra ayuda.
Muchas gracias a todos!!