dxWAk 0 22 февраля, 2011 Опубликовано 22 февраля, 2011 · Жалоба Здравствуйте. У меня к вам очередной вопрос. В одном из изделий я применил микросхему 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(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LZet 0 25 июня, 2012 Опубликовано 25 июня, 2012 · Жалоба Нашли проблему? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxWAk 0 7 сентября, 2012 Опубликовано 7 сентября, 2012 · Жалоба Добрый день, да, проблему нашли, один из источников питания(к сожалению не помню какой) был запитан через 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(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться