Interconectando el microcontrolador AVR al ADC, al generador de forma de onda y otros periféricos

5

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
    
pregunta verendra

2 respuestas

1

Su cuadro de bloques no muestra ninguna relación entre el oscilador / divisor y el generador de forma de onda, pero estos deben estar optimizados para la mezcla sincrónica.

¿Puedes probar un enfoque simple?

Para mezclar la entrada y salida del seno, puedo sugerir el clásico mezclador XOR de rango de 180 grados que se conoce comúnmente como un detector de fase tipo I PLL. Las entradas son de la misma frecuencia y la salida es la diferencia de fase y suma de frecuencia (+ armónicos), por lo que se debe elegir un LPF para suprimir fácilmente los componentes 2f y proporcionar un seguimiento rápido de la fase frente al voltaje.

sea R1C1 = R2C2 = R3 / C3 = 1000 / f = 1000 / 250KHz = 4 ms deje que R1 = 1 ~ 10 MΩ, que R3 ~ 1KΩ conduzca ADC use inversores con buffer '04 y '86 XOR

Promedio de lecturas de ADC para lograr la resolución deseada y la reducción de ruido mediante √n muestras.

    
respondido por el Tony EE rocketscientist
0

Como dije en un comentario, podrías usar un mezclador para hacer el trabajo en el dominio analógico. Podría usar un chip como un AD831 que funcione desde DC a varios MHz. También contiene algunos amplificadores OP en el mismo paquete que no necesita usar.

Esto funciona de la siguiente manera:

Utilice un generador de forma de onda para obtener un seno a una frecuencia definida de 100 kHz, por ejemplo. Ingrese a la primera entrada del mezclador y también a la entrada del sensor.

Conecte la salida del sensor a la segunda entrada del mezclador.

Agregue un filtro de paso bajo básico a la salida del mezclador con una frecuencia de corte mucho más baja que la frecuencia sinusoidal (digamos aquí a 1 kHz).

¿Cómo funciona? El mezclador es un multiplicador. Su respuesta ideal es igual a:

$$ V_ {out} = A_1cos (\ omega_1t) A_2cos (\ omega_2t) $$

Pero aquí las frecuencias de entrada son las mismas y omega 1 = omega 2, solo existe un phi de cambio de fase: $$ V_ {out} = A_1cos (\ omega t) A_2cos (\ omega t + \ phi) $$

que puede ser reescrito: $$ V_ {out} = \ frac {A_1 A_2} {2} [cos (2 \ omega t + \ phi) + cos (\ phi)] $$ Aquí tenemos un term que cambia con el tiempo (el que tiene 2wt + phi) y otro que es constante (solo el phi). Por lo tanto, el filtro de paso bajo en la salida del mezclador eliminará el término oscilante (porque su media es igual a cero) y el voltaje resultante solo depende de tres factores:

  1. La amplitud de entrada (A1) que se encuentra aquí.
  2. La amplitud en la salida del sensor (A2). Debe verificar si cambia significativamente a lo largo de la escala del sensor. Probablemente no tanto.
  3. La fase (phi) que desea medir.

El voltaje de salida después del mezclador y el filtro es un voltaje "DC" que depende de la fase que desea medir. No necesitas tener un ADC rápido aquí. Solo se mide una señal de DC casi.

No tengo aquí ninguna herramienta para dibujar esquemas. Lo siento.

    
respondido por el Blup1980

Lea otras preguntas en las etiquetas