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:
-
Modo de espera
-
Activar el oscilador externo
-
Iniciar el barrido
-
Inicio del barrido
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.