Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблемы с AD9912
Форум разработчиков электроники ELECTRONIX.ru > Аналоговая и цифровая техника, прикладная электроника > Rf & Microwave Design
dxWAk

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

У меня к вам очередной вопрос. В одном из изделий я применил микросхему 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();
}

AlexeyZ
Нашли проблему?
dxWAk
Добрый день, да, проблему нашли, один из источников питания(к сожалению не помню какой) был запитан через 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();
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.