1 votos

El AD5933 no funciona con reloj externo

Estoy usando AD5933 chip de medición de la impedancia. Hay una opción para conectar un reloj externo. Estoy usando un generador de funciones para dar una señal de onda cuadrada de 250 kHz y 2 voltios de pico al pin MCLK, pero no funciona.

La comunicación (I2C) entre el controlador y el AD5933 es buena.

(a) He utilizado el oscilador interno y puedo medir la impedancia desde 5 kHz hasta 100 kHz de rango de frecuencia. He medido diferentes combinaciones de resistencias y condensadores utilizando el oscilador interno. Ahora, he decidido medir la impedancia por debajo del rango de frecuencias de 5 kHz y según la nota de aplicación UG-364, tenemos que utilizar un oscilador externo para aplicar una frecuencia de reloj de 250 kHz para utilizar el rango de frecuencias por debajo de 5 kHz.

(b) He utilizado un generador de funciones para aplicar una frecuencia de reloj externa que se muestra en la imagen adjunta, pero el AD5933 no responde. En el código, se puede ver el while bucle, que espera un valor real e imaginario válido mediante la lectura de la bandera establecida (2º bit) en el registro de estado del AD5933. El 2º bit del registro de estado no se pone en alto, lo que significa que el AD5933 no está recibiendo valores reales e imaginarios válidos.

(c) La imagen esquemática de mi circuito está abajo.

(d) Estoy utilizando 3,3 VDC y mi rango de excitación de salida es 1, lo que significa que la tensión de excitación de salida es de 1,98 Vp-p con un offset DC de 1,48 V.

Por favor, comparte tu experiencia sobre cómo puedo conectar el reloj externo al pin MCLK del AD5933.

Esta es mi secuencia de códigos:

  1. Modo de espera

  2. Activar el oscilador externo

  3. Iniciar el barrido

  4. Inicio del barrido

function generator waveform

schematic

Este es mi código:

#include "Wire.h"

#define SLAVE_ADD 0x0D
#define ADD_PTR 0xB0

#define START_FREQ_REG1 0x82
#define START_FREQ_REG2 0x83
#define START_FREQ_REG3 0x84

#define FREG_INCR_REG1 0x85
#define FREG_INCR_REG2 0x86
#define FREG_INCR_REG3 0x87

#define NUM_INCR_REG1 0x88
#define NUM_INCR_REG2 0x89

#define CYCLE_REG1 0x8A 
#define CYCLE_REG2 0x8B 

#define REAL_REG1 0x94
#define REAL_REG2 0x95

#define IMG_REG1 0x96
#define IMG_REG2 0x97

#define CRL_REG 0x80
#define CRL_REG1 0x81
#define STATUS_REG 0x8F

void programReg();
void runSweep();
void writeData(int addr, int data);
byte getFrequency(float freq, int n);
int readData(int addr);

const float MCLK = 250*pow(10,3); // AD5933 Internal Clock Speed 16.776 MHz for formula
const float start_freq = 100; // Set start freq, < 100Khz (for formula)
const float incre_freq = 10; // Set freq increment (for formula)
const int incre_num = 10; // Set number of increments; < 511

byte value;
 int count=0;
char state; 
double gain;
const double pi = 3.141592654;

void setup() {

    Wire.begin();
    Serial.begin(115200);

  //nop - clear ctrl-reg
 writeData(CRL_REG,0x0);

    programReg();
}

void loop(){

         if(Serial.available()>0) {
     state = Serial.read();

      switch(state) {
        case 'A':  
          programReg();
          break;

        case 'B':
          runSweep();

          break;

      }
    }

}

void programReg(){

    // Start frequency of 1kHz
    writeData(START_FREQ_REG1, getFrequency(start_freq,1));
    writeData(START_FREQ_REG2, getFrequency(start_freq,2));
    writeData(START_FREQ_REG3, getFrequency(start_freq,3));

    // Increment by 1 kHz
    writeData(FREG_INCR_REG1, getFrequency(incre_freq,1)); 
    writeData(FREG_INCR_REG2, getFrequency(incre_freq,2)); 
    writeData(FREG_INCR_REG3, getFrequency(incre_freq,3));

    // Points in frequency sweep (150), max 511
    //writeData(NUM_INCR_REG1,0x00 );
    //writeData(NUM_INCR_REG2, 0x96);

 writeData(NUM_INCR_REG1, (incre_num & 0x001F00)>>0x08 );
 writeData(NUM_INCR_REG2, (incre_num & 0x0000FF));

  // Set settling cycles
  writeData(CYCLE_REG1, 0x00);
  writeData(CYCLE_REG2, 0x64);

}

void runSweep() {
    short re=0;
    short img=0;
    double freq=0;
  double mag=0;
  double  MAG=0;
  double phase=0;

  double impedance=0;

    int i=0;

  programReg();

    // 1. Standby '10110001'
    writeData(CRL_REG, 0xB0);

 // Enable external oscillator
 writeData(CRL_REG1, 0x8);

    // 2. Initialize sweep '00010001'
writeData(CRL_REG, 0x11);

     delay(20);

    // 3. Start sweep '00100000'
    writeData(CRL_REG, 0x21);   

while((readData(STATUS_REG) & 0x07) < 4 ) {  // Check that status reg != 4, sweep not complete

        delay(20); // delay between measurements

        int flag = readData(STATUS_REG)& 2;

        //Serial.println("");
        //Serial.println(readData(STATUS_REG));

        if (flag==2)

        {

            byte R1 = readData(REAL_REG1);
            byte R2 = readData(REAL_REG2);
            re = (R1 << 8) | R2;

            R1  = readData(IMG_REG1);
            R2  = readData(IMG_REG2);
            img = (R1 << 8) | R2;

            freq = start_freq + i*incre_freq;

     Serial.print(freq);
      Serial.print("\t");

        mag = sqrt(pow(double(re),2)+pow(double(img),2));

        if (count==0)
      {
       gain=1.0/(mag*34000);

       count=1;
      }

      if (count!=0)
      {
       impedance =1.0/(gain*mag);

       Serial.println(impedance);

        }

            //Increment frequency
            if((readData(STATUS_REG) & 0x07) < 4 ){
     // if((readData(STATUS_REG) & 0x04) == 0 ){
                writeData(CRL_REG,0x31);

       // writeData(CRL_REG,(readData(CRL_REG) | 0x01) | 0x30);
                i++;
      }
        }
             else {
      //Power down

   writeData(CRL_REG,0xA0);
  //writeData(CRL_REG,(readData(CRL_REG) & 0x07) | 0xA0);
             }
     p++;
        ///}
}
}

void writeData(int addr, int data) {

 Wire.beginTransmission(SLAVE_ADD);
 Wire.write(addr);
 Wire.write(data);
 Wire.endTransmission();
 delay(1);
}

int readData(int addr){
    int data;

    Wire.beginTransmission(SLAVE_ADD);
    Wire.write(ADD_PTR);
    Wire.write(addr);
    Wire.endTransmission();
  delay(1);

    Wire.requestFrom(SLAVE_ADD,1);

    if (Wire.available() >= 1){
        data = Wire.read();
    }
    else {
        data = -1;
    }

    delay(1);
    return data;    
}

byte getFrequency(float freq, int n){
    long val = long((freq/(MCLK/4)) * pow(2,27));
    byte code;

      switch (n) {
        case 1:
          code = (val & 0xFF0000) >> 0x10; 
          break;

        case 2:
          code = (val & 0x00FF00) >> 0x08;
          break;

        case 3:
          code = (val & 0x0000FF);
          break;

        default: 
          code = 0;
      }

    return code;  
}

double phase_sweep(double img, double re)
{
  double phase;
  if ((re>0)&(img>0))
  {
    phase = atan(double(img)/double(re));
    phase = (phase*180)/pi;  
  }
    else if((re>0)&(img<0))
    {
    phase = atan(double(img)/double(re));
    phase = (phase*180)/pi+360;  
    }
    else if ((re<0)&(img<0))
    {
      phase = -pi + atan(double(img)/double(re));
      phase = (phase*180)/pi;
    }
    else if ((re<0)&(img>0))
    {
      phase = pi + atan(double(img)/double(re));
      phase = (phase*180)/pi;
    }

    return phase;
  }

Por favor, ayúdenme a hacer funcionar mi AD5933 con un oscilador externo.

1voto

Link Puntos 148

Estoy usando un generador de funciones para dar una señal de onda cuadrada de 250 kHz y 2 voltios de pico al pin MCLK

Según el trazado del osciloscopio, eso es no lo que realmente está suministrando al MCLK ¡Pin!

El reloj mostrado en la traza del osciloscopio no es válido como MCLK .

La traza muestra una señal bipolar, medida por el osciloscopio como 3,88 Vp-p centrada alrededor de 0 V, es decir, aproximadamente +1,94 V a -1.94 V . Que -1.94 V supera la tensión negativa permitida en el MCLK pin. La hoja de datos del AD5933 muestra que la tensión suministrada al MCLK pin no debe sea inferior a -0,3 V:


AD5933 Absolute Maximum ratings for MCLK from the datasheet

(Fuente de la imagen: <a href="https://www.analog.com/media/en/technical-documentation/data-sheets/AD5933.pdf" rel="nofollow noreferrer">Hoja de datos del AD5933, página 7 </a>)


De un rápido vistazo a la manual de instrucciones de su generador de funciones SFG-2010 Supongo que estás usando la salida normal de la forma de onda. Usted necesita ya sea:

  1. hacer que la salida de la señal sea unipolar dentro del rango de tensión que se explica a continuación, si se sabe cómo configurar la salida normal del generador de señales para que lo haga, o

  2. utilice la salida TTL/CMOS en el generador de funciones en su lugar, elimine la resistencia de carga de 50 Ω que se muestra en su esquema, y asegúrese de que esta señal de salida unipolar está entre 0 V y su Vdd, que usted dijo que era de +3,3 V.

    Según el manual de usuario del generador de funciones, cuando se cambia a la salida "TTL", la tensión de salida es de 3 V o superior - eso sería un problema si supera los 3,3 V. Y cuando se cambia a la salida "CMOS", la tensión de salida se puede ajustar, pero la más baja mencionada es de 4 V con una tolerancia de más o menos 1 V. Por lo tanto, parece posible que la tensión de salida "CMOS" también sea demasiado alta y supere su Vdd de 3,3 V. Para tiempos de subida/bajada equilibrados, el ajuste de salida CMOS sería mi opción preferida en este caso.

Así que tendrás que hacer algunas mediciones de los voltajes de salida en modo TTL y CMOS de tu generador de señales y, dependiendo de lo que veas en tu osciloscopio, puede que necesites añadir atenuación externa o traducción de nivel push-pull (con tiempos rápidos de subida/bajada) para asegurar una amplitud de señal de reloj que no exceda de 0 V a tu Vdd, adecuada para el MCLK entrada.

O, dependiendo de sus necesidades en cuanto a precisión de la frecuencia, estabilidad, etc., podría investigar el uso de un generador de reloj diferente para producir el MCLK señal, que tiene una etapa de salida CMOS adecuada.

En el peor de los casos, conectar esa señal bipolar incorrecta al MCLK podría haber dañado ya esa parte del AD5933, por ejemplo, cortocircuitando la protección de entrada ESD en ese pin, debido a una corriente excesiva. Si genera una MCLK señal como he sugerido anteriormente, que se muestra correctamente (0 V a 3,3 V como máximo) en el ámbito cuando no conectado a la MCLK pin, pero que cambia significativamente cuando es conectado a la MCLK pin, entonces eso sería una indicación de que ya ha dañado el MCLK entrada en ese CI AD5933.

Un punto más de su esquema : Los condensadores de derivación de la fuente de alimentación necesarios (explicados en la página 34 del hoja de datos ) faltan en su esquema, y su ubicación física también es importante, como se explica en la hoja de datos. La omisión de estos condensadores de derivación también puede afectar al comportamiento del dispositivo.

(No he investigado su código - hasta el MCLK señal está arreglada, no tiene sentido buscar otros posibles problemas. Asumo que el mismo código (excepto el cambio para seleccionar el reloj externo) fue utilizado en tus experimentos con el reloj interno, que funcionó).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X