AnsweredAssumed Answered

AD9912 trouble with PLL

Question asked by dxWAk on Feb 22, 2011
Latest reply on Mar 3, 2011 by dxWAk

Hello.

 

I'm have a trouble with AD9912 DDS.

 

AD9912 DDS powers from two sources: +3.3V and +1.8V (I'm use linear stabilisators ADP1707).
System clock input is KX7-T-40 Mhz, which maximum crystal motional resistance is 50 Ohm.
PLL Loop Filter is according to AD9912 Datasheet(see Figure 46):
R1 - 1.3KOhm, Series C1 - 300pF, Shunt C2 - 15 pF (Multiplier is 24)

 

Other parameters, loading to DDS registers:
Output Freq is 1/1000 from DAC Sample Clock;
VCO Range - High;
2xreference - OFF;
Charge pump current - 250 uA;
DAC Full-scale current - default;
Enable of all modules.

 

Then I see output signal it's 670 kHz Freq, then I planning see 960KHz(40MHz*24(N_divider)/1000). That is PLL output Freq is 670 MHz. Then I try change pump current (125 uA or 350 uA), or change PLL N divider, or change quartz output Freq doesn't change. It is around 670 kHz.

 

Then I change FTW register output freq changed in proportion.
I think that PLL system pump don't work or PFD Detector is off. However I don't see separate bit to enable or disable PFD (like AD9910 DDS).
The Voltage on 31 pin (PLL Loop Filter) is aroud 750mV. VCO is running and not regulating.

 

Can you give a hint for me, why I cann't tune VCO?
Thank you in advance.

 

Then I write to DDS registers and readback they are math, so SPI is work.
Below I type my code.

 


Init_DDS(); //DDS Init
  
WriteReg(0x0010,0x10); //PLL Disable
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()
{
//Power up IC, Set CS, IO update not active, reset
DDS_PD0(); //DDS not active
DDSCS1(); //CS not active
IO_UPDATE_0(); //IO not active
RESET_1();
Init_Outputs(); //Init MCU IO port as outputs
//1MS Reset
DELAYMS(1);
RESET_0(); //Reset not active
//Write to serial config register for SDO active
   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) //Write to DDS
{
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
{
IO_UPDATE_0();
DELAYMS(5);
IO_UPDATE_1();
DELAYMS(5);
IO_UPDATE_0();
}

Outcomes