Перейти к содержанию
    

Проблемы с AD9912

 

Здравствуйте.

 

У меня к вам очередной вопрос. В одном из изделий я применил микросхему AD9912, которую предполагал использовать как перестраиваемый генератор гармонического сигнала.

 

Микросхема питается от двух источников на +3,3 и +1,8 Вольта (используются ADP1707), задающий генератор выполнен на кварцевом резонаторе KX7-T-40 МГц (с эквивалентным последовательным сопротивлением не более 50 Ом), фильтр ФАПЧ (в соответствии с рисунком 46 оригинальной документации на данную м/с R1 - 1.3 кОм, C1 - 300 пФ, C2 - 15 пФ - делитель ФАПЧ настроен на 24).

Другие параметры, установленные в данную микросхему:

Выходная частота в 1/1000 от DAC Sample Clock;

HSL, CMOS Driver, Output Doubler - выкл;

VCO Range - High;

2xreference - выкл;

Charge pump current - 250 мкА;

DAC Full-scale current - default;

 

Что наблюдаю по выходу? - частота, приблизительно равная 670 кГц, т.е. частота системы ФАПЧ 670 МГц. Изменение тока помпы (на 125 или 350 мкА), делителя ФАПЧ и частоты внешнего кварцевого резонатора не приводит к изменению выходной частоты - все так же 670 кГц. (При изменении кода частоты в регистр FTW частота пропорционально меняется).

 

Складывается впечатление, что либо не работает "помпа", либо выключен фазо-частотный детектор. Однако, отдельного бита отключения ФЧД как в м/с AD9910 здесь нет (или я его не вижу), напряжение на выводе 31 (фильтр ФАПЧ) около 750 мВ. ГУН (VCO) запускается на собственной частоте и не регулируется.

Не подскажете в чем может быть причина, почему не могу перестроить ГУН?

Заранее благодарен за ответ.

 

При записи в регистры DDS обратно считвыаются те же самые значения. Ниже приведен листинг программы.

 

 Init_DDS(); //Инициализация DDS
   
  WriteReg(0x0010,0x10); //Отключение ФАПЧ
  STROBER();  //IO UPDATE
  
  WriteReg(0x0020,0x0b); // (11(0x0B)*2+2)*40=960MHz
  WriteReg(0x0022,0x04); //  hi range PLL range
    
  WriteReg(0x01a6,0xc7); //FTW write
  WriteReg(0x01a7,0x4b);
  WriteReg(0x01a8,0x37);
  WriteReg(0x01a9,0x89);
  WriteReg(0x01aa,0x41);
  WriteReg(0x01ab,0x00);

  STROBER();  //IO UPDATE

  WriteReg(0x0010,0x60); //Full Enable

  STROBER();  //IO UPDATE

void Init_DDS()
{
//Вывод микросхемы из powerdown, установка CS, IO UPDATE неактивекн, ресет
DDS_PD0(); //DDS в активном режиме
DDSCS1(); //CS неактивен
IO_UPDATE_0(); //IO неактивен
RESET_1();
Init_Outputs(); //Инициализация портов в/в на выход
//Делаю ресет на 1мс
DELAYMS(1);
RESET_0(); //Ресет снял
//Прописываю 0й регистор так чтобы работало SDO

   DDSCS0(); 
   SPI_RX_Buffer.clear(); 
   SPI_TX_Buffer.clear();
  SPI_TX_Buffer.put(0x00);
  SPI_TX_Buffer.put(0x00);
  SPI_TX_Buffer.put(0x99);
  Transfer_SPI();
  DDSCS1();
}


void WriteReg(INT16U Adress,INT8U data)
{
INT8U Upper_Adress,Low_Adress;
Upper_Adress=Adress>>8;
Low_Adress=Adress&0xff;
DDSCS0(); 
SPI_RX_Buffer.clear(); 
SPI_TX_Buffer.clear();
SPI_TX_Buffer.put(Upper_Adress);
SPI_TX_Buffer.put(Low_Adress);
SPI_TX_Buffer.put(data);
Transfer_SPI();
DDSCS1();
}

void STROBER()
{
IO_UPDATE_0();
DELAYMS(5);
IO_UPDATE_1();
DELAYMS(5);
IO_UPDATE_0();
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день, да, проблему нашли, один из источников питания(к сожалению не помню какой) был запитан через LP2980 с максимальным током 50мА, после того как подключили к более мощному - заработало!

 

 

Последний вариант номиналов петли ФАПЧ (см. стр. 21 pdf):

R1=1.2K, C1=300pF, C2=22pF

 

На всякий случай последний вариант программы:

#include <msp430x26x.h>
#include "DDS.h"
#include "BCS.h"
#include "spi.h"
#include "ringbuffer.h"
#include <intrinsics.h>

void DDSCS1()  
{      
P2OUT|=BIT4;
} 

void DDSCS0()  
{ 
P2OUT&=~BIT4;
} 

void Init_PD()
{
P2DIR|=BIT1;
}

void DDS_PD1()
{   
P2OUT|=BIT1;
}

void DDS_PD0()
{ 
P2OUT&=~BIT1;
}

void IO_UPDATE_0()
{ 
P2OUT&=~BIT3;
}

void IO_UPDATE_1()
{   
P2OUT|=BIT3;
}

void Init_Outputs()
{
P2DIR|=(BIT1|BIT3|BIT4);
}


void STROBER()
{
IO_UPDATE_0();
DELAYMS(5);
IO_UPDATE_1();
DELAYMS(5);
IO_UPDATE_0();
}


void Init_DDS(double freq)
{
unsigned long long multiplier;  
//Сначала вывожу из повердауна, устанавливаю чип селект, ИО ардейт, делаю Ресет
DDS_PD0(); //DDS в активном режиме
DDSCS1(); //CS неактивен
IO_UPDATE_0(); //ИО неактивен 
Init_Outputs();
//Делаю ресет на 1 мс
//Делаю программный ресет!!
WriteReg(0x0012,0x01); //
STROBER();
DELAYMS(5);

//Теперь прописываю регистр так, чтобы заработало SDO
WriteReg(0x0000,0x99);


  WriteReg(0x0020,0x0a); // ((10(0x0a)+2)*2)*40=960MHz
  WriteReg(0x0022,0x04); //1xreference,VCO high range, 250uA pump current
  STROBER();
  multiplier=(long long)((double)281474976710656.0*(freq/(double)960000000.0));
  WriteReg(0x01a6,multiplier&0xff); // 
  WriteReg(0x01a7,(multiplier>>8)&0xff); // 
  WriteReg(0x01a8,(multiplier>>16)&0xff); // 
  WriteReg(0x01a9,(multiplier>>24)&0xff); // 
  WriteReg(0x01aa,(multiplier>>32)&0xff); // 
  WriteReg(0x01ab,(multiplier>>40)&0xff); // 
   
  STROBER();  //IO UPDATE 
  
  WriteReg(0x0010,0x80); //ВКЛ
  
  STROBER();  //IO UPDATE  
}



  INT8U a1,a2;
INT16U ReadPartID()
{
  DDSCS0();  
  SPI_RX_Buffer.clear();  
  SPI_TX_Buffer.clear();
  
  SPI_TX_Buffer.put(0xa0); //Read Two Bytes!
  SPI_TX_Buffer.put(0x03); 
  SPI_TX_Buffer.put(0xff);
  SPI_TX_Buffer.put(0xff);
  Transfer_SPI(); 
  DDSCS1();
  SPI_RX_Buffer.get();
  SPI_RX_Buffer.get();
  a1=SPI_RX_Buffer.get();
  a2=SPI_RX_Buffer.get();
  return ((a1<<8)&0xff00)+a2;
}

void WriteReg(INT16U Adress,INT8U data)
{
INT8U Upper_Adress,Low_Adress;
Upper_Adress=Adress>>8;
Low_Adress=Adress&0xff;
  DDSCS0();  
   SPI_RX_Buffer.clear();  
   SPI_TX_Buffer.clear();
  SPI_TX_Buffer.put(Upper_Adress); 
  SPI_TX_Buffer.put(Low_Adress); 
  SPI_TX_Buffer.put(data);
  Transfer_SPI(); 
  IFG2 &= ~(UCA0RXIFG+UCA0TXIFG);           // Очистили флаги прерываний USART1
  DDSCS1();  
}

INT8U ReadAdress(INT16U Adress)
{
INT8U Upper_Adress,Low_Adress;

Upper_Adress=Adress>>8;
Low_Adress=Adress&0xff;
  DDSCS0();  
  SPI_RX_Buffer.clear();  
  SPI_TX_Buffer.clear();
  SPI_TX_Buffer.put(Upper_Adress|0x80); 
  SPI_TX_Buffer.put(Low_Adress); 
  SPI_TX_Buffer.put(0xff);
  Transfer_SPI(); 
  DDSCS1();
  SPI_RX_Buffer.get();
  SPI_RX_Buffer.get();
  return SPI_RX_Buffer.get();
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...