Estoy haciendo el primer proyecto con el microcontrolador AVR ATmega32-A.
En este proyecto estoy interactuando con ADC ( AD7798 ), generador de forma de onda ( AD9833 ), multiplexor, sensor capacitivo, demodulador. He adjuntado un diagrama de bloques simple para entender el propósito.
Tengo que generar una onda sinusoidal y dárselo al sensor y, a cambio, obtendré la salida del sensor con un cambio de fase. Tengo que seleccionar la salida del sensor y la señal de entrada usando el multiplexor. La señal seleccionada pasará a través del demodulador y al ADC. Finalmente ADC a Micro controlador.
El concepto es que quiero calcular la diferencia de fase entre dos señales, como la entrada (Vg) y la salida (Vr). Para calcular el valor de la fase, he implementado el algoritmo como se muestra a continuación.
Fase de Vg (y Vr a cambio) es lo que puedo cambiar, fase de El interruptor del demodulador (señal cuadrada del divisor de frecuencia) es constante y es mi fondo Puedo poner la señal Vg y Vr a través demodulador
El algoritmo debe tener este aspecto: poner Vg en el demodulador, barrer WGP (fase de señal del generador de forma de onda) hasta que obtenga el valor de CC más alto (ahora almacena cuántos grados se necesitan para obtener este DC más alto, y se calcula la amplitud Vg a partir de eso). Luego ponga la señal Vr a través demodulador y también barrer WGP hasta el valor de CC más alto. Esta fase El valor de cambio de WGP será diferente para Vg y Vr. En resultado tienes la amplitud de ambas señales y la diferencia de fase entre ellas.
He escrito todas las funciones como Para leer el valor de ADC, Generar señal con la frecuencia especificada, Cambio de fase de la señal, Barrido de fase de 0 a 360 grados, etc.
He escrito el siguiente código para seleccionar la señal utilizando el multiplexor y cambiar la fase de la señal de 0 a 360 grados en un grado en cada momento y obtener el valor máximo de voltaje de C.C.
Desde el código anterior, puedo seleccionar la señal con el comando "MUXSEL" y puedo barrer la fase de 0 a 360 grados, puedo obtener el máximo voltaje de D.C y el valor de fase correspondiente. Puedo obtener un valor por encima de cada vez que agrego demora.
delay_ms (100);
Si elimino este retraso de la función "Phaseshift", no da nada incluso si también lo reduzco.
Si pongo ese retraso, obtengo el voltaje máximo de D.C y la fase correspondiente después de 45 segundos. Este es un tiempo demasiado grande en mi aplicación. Luego cambié de canal, luego también tomé 45 segundos y tengo que usar estos valores en otros cálculos para que me lleve mucho tiempo.
Quiero obtener el voltaje máximo de D.C y el valor de fase correspondiente en 2 a 3 segundos.
Cualquiera me ayude a hacer esto. ! [ingrese la descripción de la imagen aquí] [3]
[AD7798] [4] AD9833
función spi () añadida.
unsigned char spi(unsigned char data)
{
//Start transmision
SPDR = data;
//Wait for transmision complete
while (!(SPSR & (1<<SPIF)));
return SPDR;
}
[4]: http://www.analog.com/static/imported-files/data_sheets/AD7798_7799.pdf