PDA

Просмотр полной версии : Проблемы AD9951



metoflex
13.01.2013, 23:54
Здравствуйте!

Не могу никак завести AD9952.. Мне для дискретного изменения частоты и амплитуты, путем установки с аппликухи. Все программные части написал, но ВЧ выход у кристалла молчит... подохреваю, что дело в инициализации.. Проверьте пожалуйста, мб что-то не проставил...

//Register CFR1
#define DIGITAL_POWER_DOWN 0
#define COMPARATOR_POWER_DOW N 1
#define DAC_POWER_DOWN 0
#define CLOCK_INPUTPOWERDOWN 0
#define EXTERNAL_POWER_DOWN_ MODE 0
#define SYNC_CLK_OUT_DISABLE 1
#define AUTO_CLR_PHASE_ACCUM 0
#define ENABLE_SINE_OUTPUT 0
#define CLEAR_PHASE_ACCUM 0
#define SDIO_INPUT_ONLY 1
#define LSB_FIRST 1
#define AUTOMATIC_SYNC_ENABL E 0
#define SOFTWARE_MANUAL_SYNC 0
#define LOAD_ARR_IO_UD 0
#define OSK_ENABLE 1
#define AUTO_OSK_KEYING 0
//Register CFR1

//Register CFR2
#define CHARHGE_PUMP_CURRENT _BIT0 1 // will be change this for tests
#define CHARHGE_PUMP_CURRENT _BIT1 1 // will be change this for tests
#define VCO_RANGE 0
#define REFCLK_MULTIPLIER_BI T0 0 // will be change this for tests
#define REFCLK_MULTIPLIER_BI T1 0 // will be change this for tests
#define REFCLK_MULTIPLIER_BI T2 0 // will be change this for tests
#define REFCLK_MULTIPLIER_BI T3 0 // will be change this for tests
#define REFCLK_MULTIPLIER_BI T4 0 // will be change this for tests
#define CRYSTAL_OUT_PIN_ENAB LE 0
#define HARDWARE_MANUAL_SYNC _ENABLE 0
#define HIGH_SPEED_SYNC_ENAB LE 0
//Register CFR2

Заранее весьма благодарен!

P.S. Выше приведены задефайненные значения, которые прописываю в соответствующие биты регистров CFR1 & CFR2.

Genadi Zawidowski
14.01.2013, 00:10
Не вся программа приведена...
ENABLE_SINE_OUTPUT 0 это звучит красиво... но это не причина.
Раз Вы ставите LSB FIRST 1, Вас ожидает чехарда с изменением порядка выдачи битов в этом и последующих словах...
Зачем?

Какие значения в собранном виде получаются у Вас? Как выдаёте?
В монтаже уверенны? Дно припаяно? Это питание ЦАП.
Пока гляньте в аттачмент, может помочь.

В моём случае без умножителей и без управления амплитудой
CFR1 = 0

Но я не переворачиваю порядок битов.

metoflex
14.01.2013, 00:42
LSB - это умышленно, т.к. по SPI данные таким образом выплевываются. Да, монтаж корректный полностью. Плата по счастливом стечению обст-в попала ко мне от друга, который работает на предприятии, где оная является серийной. Увы друг ушел с прежнего места работы, потому заводить схему приходится самому. В серийке (на предприятии) платы рабочие, как говорил мне друг. Соответственно где-то лажа в инициализации..

Порядок инициализации:
1) Ставлю Update_IO - в ноль
2)Проставляю CS у AD9952
3)Пишу данные (в регистры CFR1 & CFR2 - последовательно) (передавая сначала 8 бит - 0x00 (IB у CFR1), затем 4 байта данных. Далее передаю 0x01 (IB у CFR2), затем 3 байта данных)
4)Передергиваю Update_IO (0->1->0). при переходе от 1->0 поставил sleep на 100 мкс, дабы избежть возможность того, что кристалл не успеет съесть этот перепад (это мб в случае, когда достаточно быстро начнет происходить переход с 1->0)
5)Снимаю CS

Читал предыдущие посты этой ветки (помимо конечно самой даташитины). Не очень понял глубокий смысл бита OSK_ENABLE. Скажите пожалуйста что изменяется, при его проставлении (или не проставлении)?

Genadi Zawidowski
14.01.2013, 00:48
При отсутствии этого бита нет возможности управлять умплитудой - перемножителем со значением из регистра ASF.
К стати, если его включите, после сброса в ASF 0 - выход помножится на 0.

Программу сюда.
К стати, если мне не изменяет память, состояние микросхемы после сброса - рабочее, без умножителя.
Можете сразу писать FTW (MSB FIRST).
Да, где нашли такой SPI, что передаёт LSB FIRST?

Вот в какой момент микросхема воспримет ваш LSB FIRST, я не знаю. Скорее всего, как и ожидается, после IO UPDATE.
никогда такими экспериментами не занимался.

metoflex
14.01.2013, 01:03
Не вся программа приведена...
ENABLE_SINE_OUTPUT 0 это звучит красиво... но это не причина.
Раз Вы ставите LSB FIRST 1, Вас ожидает чехарда с изменением порядка выдачи битов в этом и последующих словах...
Зачем?

Какие значения в собранном виде получаются у Вас? Как выдаёте?
В монтаже уверенны? Дно припаяно? Это питание ЦАП.
Пока гляньте в аттачмент, может помочь.

В моём случае без умножителей и без управления амплитудой
CFR1 = 0

Но я не переворачиваю порядок битов.

Посмотрел Ваш код. Если я правильно понял, то в CFR1 - все нулями забиваете (как Вы и указали в своем сообщении). А в CFR2, только с 7 по 0 биты прописываете (в зависимости от выходной частоты в 3-ий бит пишется единичка, зтем в зависимости от навешенного фильтра, в bits<1:0>, пишется соответствующее значение и в bits <7:3> прописываете множитель CLK входного)? И при такой минимльной инициализации, записывая в ASF & FTW - Корретно изменяются частота и амплитуда выходного сигнала?
Спасибо!

Добавлено через 5 минут(ы):



К стати, если его включите, после сброса в ASF 0 - выход помножится на 0.

Про какой сброс говорите? Про IO_UPDATE? Если да, то почему (если я уже прописал в ините 1) должна будет амплитуду умножаться на нуль?

Genadi Zawidowski
14.01.2013, 01:04
при такой минимльной инициализации, записывая в ASF & FTW - Корретно изменяются частота и амплитуда выходного сигнала?

Для случая необходимости управления амплитудой доавляется единичка в CFR1

ctl1 |= (1UL << 25); /* OSK enble */

Да, это кусок из работающего проекта.


Про какой сброс говорите? Про IO_UPDATE? Если да, то почему (если я уже прописал в ините 1) должна будет амплитуду умножаться на нуль?

Я про RESET.
В регистре ASF значение 0, включаем бит OSK ENABLE - и все данные перед подачей на ЦАП множатся на 0.

metoflex
14.01.2013, 11:40
Для случая необходимости управления амплитудой доавляется единичка в CFR1

ctl1 |= (1UL << 25); /* OSK enble */

Да, это кусок из работающего проекта.



Я про RESET.
В регистре ASF значение 0, включаем бит OSK ENABLE - и все данные перед подачей на ЦАП множатся на 0.

ээээ... стоп. Выше вы пишете, что как раз для управления амплитудой этот бит нужно ставить в единицу, а здесь пишете, что при включении этого бита все данные, перед подачей на DAC, амплитуда сигнала будет умножаться на нуль. Если судить по представленному рисунку 23, в даташитине на 9952, то при нуле в этом бите амплитуда остается неизменной, такой какой она была на выходе DDS core, а если единичка то на выход подается сигнал с DDS core, но уже домноженный на ASF. Если дело обстоит именно так, то с каким амплитудным значением данные выплевываются с DDS core? (естественно говорю про амплитуду сигнала, который получается уже после DAC, до DAC понятие амплитуды сигнала теряет всякий смысл, ибо там цифровой сигнал гонится).

Спасибо!

Genadi Zawidowski
14.01.2013, 12:55
Выше вы пишете, что как раз для управления амплитудой этот бит нужно ставить в единицу, а здесь пишете, что при включении этого бита все данные, перед подачей на DAC, амплитуда сигнала будет умножаться на нуль
Вы не говорили про то, что что-то занесли в ASF. А включаете соответствующий бит. И получаете нули. Поместите в ASF 0x3fff и будет у Вас 0 dB FS (т.е., полная амплитуда).
Вы в начале написали, что Вам требуется управление амплитудой из приложения. Вот и управляйте. Если не требуется, то лучше OSK EN не включать - меньше потребление.

metoflex
14.01.2013, 16:32
Вы не говорили про то, что что-то занесли в ASF. А включаете соответствующий бит. И получаете нули. Поместите в ASF 0x3fff и будет у Вас 0 dB FS (т.е., полная амплитуда).
Вы в начале написали, что Вам требуется управление амплитудой из приложения. Вот и управляйте. Если не требуется, то лучше OSK EN не включать - меньше потребление.

Ага! Т.е. с отрубленным битом будет полная амплитуда, а с подрубленным соответственно ASF- выступает в роли некоторого аттенюатора (образно говоря), т.е. будет определять долю от максимального значения амплитуды, которую нужно проставить перед тем как выплевывать данные на DAC?

Genadi Zawidowski
14.01.2013, 19:35
с отрубленным битом будет полная амплитуда, а с подрубленным соответственно ASF- выступает в роли некоторого аттенюатора (образно говоря), т.е. будет определять долю от максимального значения амплитуды, которую нужно проставить перед тем как выплевывать данные на DAC?
Именно так и работает.
Как успехи?

metoflex
21.01.2013, 22:35
Именно так и работает.
Как успехи?

Приветствую!

Промучался, но так ничего и не вышло:(

Проверьте пожалуйста корректность записи и инициализации ДДСки.

GeneratorInit()
{
U8 dataCFR1[4] = {0x0, 0x0, 0x0 ,0x0};
U8 dataCFR2[3] = {0x0, 0x0, 0x3};
U8 dataFTW_ASF[6] = {0x00, 0x0f, 0x00, 0x00, 0xff,0xff}; //temp
const int lengthWRDataCFR1 = 4;
const int lengthWRDataCFR2 = 3;
U8 instructionDataGener atorCFR1[1] = {0x00};
U8 instructionDataGener atorCFR2[1] = {0x01};
U8 IO_UpdateToDown[4] = {0x0F, 0xFF, 0xFF, 0xFF}; // 1->0 через регистры IO_UPDATE (BIT4-BIT6 - нули, остальные единицы)
U8 IO_UpdateToUp[4] = {0x2F, 0xFF, 0xFF, 0xFF}; // 0->1 через регистры IO_UPDATE (BIT4, BIT6 - нули, остальные единицы)

printf("DBG_START_INIT_GENER ATOR\n");

SendDataToRegs (IO_UpdateToDown, 0);

SetCS_Latch (GENERATOR);
WriteDataToGenerator OnSPI(dataCFR1, instructionDataGener atorCFR1, lengthWRDataCFR1);
WriteDataToGenerator OnSPI(dataCFR2, instructionDataGener atorCFR2, lengthWRDataCFR2);
RemoveCS_Latch (GENERATOR);

SendDataToRegs (IO_UpdateToUp, UPDATE_DATA_IN_GENER ATOR);

memcpy (CurrentDataRegs, IO_UpdateToUp, DATA_REGS_LENGTH);

printf("DBG_END_INIT_GENERAT OR\n");

SendDataToGenerator (dataFTW_ASF);
}

int SendDataToGenerator( unsigned char* data)
{
int err = -1;
U8 mask_IO_UpdateToDown = 0xDF; // 1->0 using regs
U8 mask_IO_UpdateToUp = 0x20; // 0->1 using regs
U8 instructionAmplitude DataGenerator[1] = {0x02};
U8 instructionFrequency DataGenerator[1] = {0x04};

const int lengthAmplitudeWRDat a = 2;
const int lengthFrequencyWRDat a = 4;

CurrentDataRegs[0] = CurrentDataRegs[0] & mask_IO_UpdateToDown ;
SendDataToRegs (CurrentDataRegs, 0);

SetCS_Latch (GENERATOR);
WriteDataToGenerator OnSPI(data, instructionAmplitude DataGenerator, lengthAmplitudeWRDat a);
WriteDataToGenerator OnSPI(data + lengthAmplitudeWRDat a, instructionFrequency DataGenerator, lengthFrequencyWRDat a);
RemoveCS_Latch (GENERATOR);

CurrentDataRegs[0] = CurrentDataRegs[0] | mask_IO_UpdateToUp;
SendDataToRegs (CurrentDataRegs, UPDATE_DATA_IN_GENER ATOR);

return err;
}

int SendDataToRegs(unsig ned char* data, int flag)
{
int err = -1;
SetCS_Latch (REGISTERS);

err = WriteDataToRegsOnSPI (data);

if(flag == UPDATE_DATA_IN_GENER ATOR)
SetCS_Latch (GENERATOR);
RemoveCS_Latch (REGISTERS);

if(flag == UPDATE_DATA_IN_GENER ATOR)
RemoveCS_Latch (GENERATOR);

return err;
}

int WriteDataToGenerator OnSPI(unsigned char* dataWR, unsigned char* instructionByte, const int lengthWRData)
{
U8 DataRD[6];
int err;

err = write_read_spi_M(pSP I, mtxSPI_MEGA_PROG, instructionByte, DataRD, LENGTH_INSTRUCTION_D ATA_GENERATOR , SPI_TIME_OUT);
err += write_read_spi_M(pSP I, mtxSPI_MEGA_PROG, dataWR, DataRD, lengthWRData, SPI_TIME_OUT);

return err;
}

Также прикладываю изображение принципа связки с DDS (для иных целей юзается еще четыре регистра, выходными сигналами одного из которых являются входные сигналы самой DDS'ки).

http://i54.fastpic.ru/big/2013/0121/ed/ca47ef2f0e31217db474 e028eb309ded.jpg (http://fastpic.ru/)

Заранее весьма и весьма благодарен!

P.S. На воходе DDS всегда (до и после программинга) висит напряжение постоянное 1.8 В. Соответственно в переменное оно не переходит после программинга и значение не меняется, значит регистры ДДСки, амплитуды и частоты - не программерятся..

P.S. P.S. В данной реализации кода, пробую железно после инициализации прописать амплитуду и частоту, о все тщетно..

P.S. P.S. P.S. Сорри... только сейчас заметил недочет в представленной схеме... На вход каждого послежующего регистра данные выплевываются предыдущим (через последовательный выход предыдущего регистра, данные идут на последовательный вход следующего).

Genadi Zawidowski
21.01.2013, 23:44
dataFTW_ASF[6] = {0x00, 0x0f, 0x00, 0x00, 0xff,0xff}
Старшие биты в ASF вроде что-то отдельное от умножителя означают. Кажется, скорость свипирования по амплитуде.
Как я понимаю, здесь это ff ff ?
Не смог найти двух вариантов выдачи слов на SPI (Вы говорили, что у Вас сперва программиуется со старшего, потом с младшего бита).
Что у Вас с IORESET? Я его вместо CS испольщую. Можете объединить с CS или если уверены - посадить на "0".

Я не смог с Вашей программой разобраться. Предлагаю способ отладки - где-то где формируется строб на CLK AD9951, печатать состояние сигнала DATA. Обрамлять "\" и "/" по переходам чипселекта - таким образом, Вы получите в текстовом файле (с терминала в файл писать не трудно) протокол побитных записываемых слов. Далее я могу на них посмотреть.
Это можно сделать и автономно от Вас, была бы программа вся, а не кусками.

ps: я не уверен в том, что номер регистра автоматически увеличивается, если писать параметры друг за другом.

metoflex
22.01.2013, 20:38
Именно так и работает.
Как успехи?

Приветствую!

Промучался, но так ничего и не вышло:(

Проверьте пожалуйста корректность записи и инициализации ДДСки.

GeneratorInit()
{
U8 dataCFR1[4] = {0x0, 0x0, 0x0 ,0x0};
U8 dataCFR2[3] = {0x0, 0x0, 0x3};
U8 dataFTW_ASF[6] = {0x00, 0x0f, 0x00, 0x00, 0xff,0xff}; //temp
const int lengthWRDataCFR1 = 4;
const int lengthWRDataCFR2 = 3;
U8 instructionDataGener atorCFR1[1] = {0x00};
U8 instructionDataGener atorCFR2[1] = {0x01};
U8 IO_UpdateToDown[4] = {0x0F, 0xFF, 0xFF, 0xFF}; // 1->0 через регистры IO_UPDATE (BIT4-BIT6 - нули, остальные единицы)
U8 IO_UpdateToUp[4] = {0x2F, 0xFF, 0xFF, 0xFF}; // 0->1 через регистры IO_UPDATE (BIT4, BIT6 - нули, остальные единицы)

printf("DBG_START_INIT_GENER ATOR\n");

SendDataToRegs (IO_UpdateToDown, 0);

SetCS_Latch (GENERATOR);
WriteDataToGenerator OnSPI(dataCFR1, instructionDataGener atorCFR1, lengthWRDataCFR1);
WriteDataToGenerator OnSPI(dataCFR2, instructionDataGener atorCFR2, lengthWRDataCFR2);
RemoveCS_Latch (GENERATOR);

SendDataToRegs (IO_UpdateToUp, UPDATE_DATA_IN_GENER ATOR);

memcpy (CurrentDataRegs, IO_UpdateToUp, DATA_REGS_LENGTH);

printf("DBG_END_INIT_GENERAT OR\n");

SendDataToGenerator (dataFTW_ASF);
}

int SendDataToGenerator( unsigned char* data)
{
int err = -1;
U8 mask_IO_UpdateToDown = 0xDF; // 1->0 using regs
U8 mask_IO_UpdateToUp = 0x20; // 0->1 using regs
U8 instructionAmplitude DataGenerator[1] = {0x02};
U8 instructionFrequency DataGenerator[1] = {0x04};

const int lengthAmplitudeWRDat a = 2;
const int lengthFrequencyWRDat a = 4;

CurrentDataRegs[0] = CurrentDataRegs[0] & mask_IO_UpdateToDown ;
SendDataToRegs (CurrentDataRegs, 0);

SetCS_Latch (GENERATOR);
WriteDataToGenerator OnSPI(data, instructionAmplitude DataGenerator, lengthAmplitudeWRDat a);
WriteDataToGenerator OnSPI(data + lengthAmplitudeWRDat a, instructionFrequency DataGenerator, lengthFrequencyWRDat a);
RemoveCS_Latch (GENERATOR);

CurrentDataRegs[0] = CurrentDataRegs[0] | mask_IO_UpdateToUp;
SendDataToRegs (CurrentDataRegs, UPDATE_DATA_IN_GENER ATOR);

return err;
}

int SendDataToRegs(unsig ned char* data, int flag)
{
int err = -1;
SetCS_Latch (REGISTERS);

err = WriteDataToRegsOnSPI (data);

if(flag == UPDATE_DATA_IN_GENER ATOR)
SetCS_Latch (GENERATOR);
RemoveCS_Latch (REGISTERS);

if(flag == UPDATE_DATA_IN_GENER ATOR)
RemoveCS_Latch (GENERATOR);

return err;
}

int WriteDataToGenerator OnSPI(unsigned char* dataWR, unsigned char* instructionByte, const int lengthWRData)
{
U8 DataRD[6];
int err;

err = write_read_spi_M(pSP I, mtxSPI_MEGA_PROG, instructionByte, DataRD, LENGTH_INSTRUCTION_D ATA_GENERATOR , SPI_TIME_OUT);
err += write_read_spi_M(pSP I, mtxSPI_MEGA_PROG, dataWR, DataRD, lengthWRData, SPI_TIME_OUT);

return err;
}

Также прикладываю изображение принципа связки с DDS (для иных целей юзается еще четыре регистра, выходными сигналами одного из которых являются входные сигналы самой DDS'ки).

http://4put.ru/pictures/max/513/1576334.jpg (http://4put.ru/)attachment:/82/ca47ef2f0e31217db474 e028eb309ded.jpg

Заранее весьма и весьма благодарен!

P.S. На воходе DDS всегда (до и после программинга) висит напряжение постоянное 1.8 В. Соответственно в переменное оно не переходит после программинга и значение не меняется, значит регистры ДДСки, амплитуды и частоты - не программерятся..

P.S. P.S. В данной реализации кода, пробую железно после инициализации прописать амплитуду и частоту, о все тщетно..

Genadi Zawidowski
22.01.2013, 20:53
Заранее весьма и весьма благодарен
Копия вчерашнего сообщения... На какой-нибудь из моих вопросов есть ответ?

metoflex
22.01.2013, 23:05
dataFTW_ASF[6] = {0x00, 0x0f, 0x00, 0x00, 0xff,0xff}
Старшие биты в ASF вроде что-то отдельное от умножителя означают. Кажется, скорость свипирования по амплитуде.
Как я понимаю, здесь это ff ff ?
Не смог найти двух вариантов выдачи слов на SPI (Вы говорили, что у Вас сперва программиуется со старшего, потом с младшего бита).
Что у Вас с IORESET? Я его вместо CS испольщую. Можете объединить с CS или если уверены - посадить на "0".

Я не смог с Вашей программой разобраться. Предлагаю способ отладки - где-то где формируется строб на CLK AD9951, печатать состояние сигнала DATA. Обрамлять "\" и "/" по переходам чипселекта - таким образом, Вы получите в текстовом файле (с терминала в файл писать не трудно) протокол побитных записываемых слов. Далее я могу на них посмотреть.
Это можно сделать и автономно от Вас, была бы программа вся, а не кусками.

ps: я не уверен в том, что номер регистра автоматически увеличивается, если писать параметры друг за другом.

dataFTW_ASF[6] = {0x00, 0x0f, 0x00, 0x00, 0x3f,0xff} - четыре старших байта - это частота, а два младших - амплитуда (сорри в сообщении опечатался со значением пятого байта). Частота = 0x00, 0x0f, 0x00, 0x00, амплитуда = 0x3f,0xff.


Reset (36-я нога), просто посажена на землю, а к чипселекту прицепил подтяжку на три вольта, соответственно питание проседает, когда что-либо пишу, т.е. на CS присутствует логический нуль.


Т.е. думаете, что подряд CFR1 & CFR2 без передергивания IO_UPDATE (после записи данных в первый) - может и не прописать корректно?

В даной версии кода передача данных только MSB (LSB не инициирую в чипе).
Вот что пишу в регистры инита:
U8 dataCFR1[4] = {0x0, 0x0, 0x0 ,0x0};
U8 dataCFR2[3] = {0x0, 0x0, 0x3};
Это корректно? Или еще что-то нужно? (чтобы хоть как-то посмотреть живучеспособность чипа)

Если не трудно, можете прикрепить обвязку Вашей DDS'ки? Просто начинаю думаю, что ошибка мб и в обвесе сей чудо-генерилки..

SPI - тоже в режиме MSB данные выплевывает.

Genadi Zawidowski
22.01.2013, 23:32
Я думаю, при передаче данных надо не забывать вставлять адрес регистра - преадча из dataFTW_ASF не будет записывать в два полследовательных регистров.

Без умножения микросхема работает сразу после снятия сброса. Только что проверил на своём макете.
Что про схему подключения...
Классическая - SPI с процессора, CS на земле, IORESET обрамляет кадый пакет данных. Reset с регистра.
В теме
http://www.cqham.ru/forum/showthread.php?t=187 44 аттачмент production-mainunit_v1c-rezonit.zip (http://www.cqham.ru/forum/attachment.php?attac hmentid=130497&stc=1&d=1358886675) - первая страница .pdf в архиве.

metoflex
23.01.2013, 21:56
Я думаю, при передаче данных надо не забывать вставлять адрес регистра - преадча из dataFTW_ASF не будет записывать в два полследовательных регистров.

Без умножения микросхема работает сразу после снятия сброса. Только что проверил на своём макете.
Что про схему подключения...
Классическая - SPI с процессора, CS на земле, IORESET обрамляет кадый пакет данных. Reset с регистра.
В теме
http://www.cqham.ru/forum/showthread.php?t=187 44 аттачмент production-mainunit_v1c-rezonit.zip (http://www.cqham.ru/forum/attachment.php?attac hmentid=130497&stc=1&d=1358886675) - первая страница .pdf в архиве.

У себя я прописываю все корректно:

SetCS_Latch (GENERATOR);
WriteDataToGenerator OnSPI(data, instructionAmplitude DataGenerator, lengthAmplitudeWRDat a);
WriteDataToGenerator OnSPI(data + lengthAmplitudeWRDat a, instructionFrequency DataGenerator, lengthFrequencyWRDat a);
RemoveCS_Latch (GENERATOR);

где:

int WriteDataToGenerator OnSPI(unsigned char* dataWR, unsigned char* instructionByte, const int lengthWRData)
{
U8 DataRD[6];
int err;

err = write_read_spi_M(pSP I, mtxSPI_MEGA_PROG, instructionByte, DataRD, LENGTH_INSTRUCTION_D ATA_GENERATOR , SPI_TIME_OUT);
err += write_read_spi_M(pSP I, mtxSPI_MEGA_PROG, dataWR, DataRD, lengthWRData, SPI_TIME_OUT);

return err;
}

Соответственно сначала пишу адрес, а затем прописываю свои данные в данный регистр. Сегодня в даташитине, где описывается предача данных, вычитал, что можно сначала позаписать сколько влезет регистров, а потом после передергивания апдейта, все запишется в основные регистры, июо у каждого регистра есть свои буферные, к каждому из которых обращаюсь через instruction byte.

Сегодня посмотрел по дорожкам подключение, чувствую что народ с обвязкой понаворотил... Есть такой вопрос: Из каких соображений ставим резистор в цепь IOUT - RESISTOR - AVDD -?? Понятно, что выход дифференциальный и оба плеча (IOUT и его инверсного собрата) пробрасываем дополнительно через одинаковые резюки, на AVDD, но вот через какие?? Какого номинала?

Спасибо!

Genadi Zawidowski
23.01.2013, 22:06
У себя я прописываю все корректно
Не вижу адреса регистра. Вернее, первый байт в обоих массивах 0x00.

Есть такой вопрос: Из каких соображений ставим резистор в цепь IOUT - RESISTOR - AVDD -??

Я не использую в этом месте резисторы... Соображения по применению (и расчёты) описывали Analog Devices в аппноуте AN-912. В тех местах, где я применяю, мне важнее получить хорошее с/ш - стараюсь мощность не терять.

metoflex
23.01.2013, 22:09
Я не использую в этом месте резисторы... Соображения по применению (и расчёты) описывали Analog Devices в аппноуте AN-912 - что-то связанное с широкополосностью данного узла.

ого, а я и не знал что у AD еще кроме даташитов полезные вкусности есть на свой силикон:) Не подскажете, мб еще есть что-то полезное от AD, по-мимо даташитеров?

Genadi Zawidowski
23.01.2013, 22:28
еще есть что-то полезное от AD
Есть ещё evaluation boards, раньше были доступные сэмплы (мне помогло здорово в начале), калькуляторы разной степени полезности...
Сейчас можно подписаться на рассылки новостей, ссылки на статьи бывают.

Добавлено через 9 минут(ы):

Так как насчёт отсутствующего адреса регистра? Из программы не видно...

metoflex
23.01.2013, 22:32
Есть ещё evaluation boards, раньше были доступные сэмплы (мне помогло здорово в начале), калькуляторы разной степени полезности...
Сейчас можно подписаться на рассылки новостей, ссылки на статьи бывают.

Добавлено через 9 минут(ы):

Так как насчёт отсутствующего адреса регистра? Из программы не видно...

Спасибо! Вроде выше ответил.

Вот:

U8 instructionAmplitude DataGenerator[1] = {0x02};
U8 instructionFrequency DataGenerator[1] = {0x04};

const int lengthAmplitudeWRDat a = 2;
const int lengthFrequencyWRDat a = 4;

SetCS_Latch (GENERATOR);
WriteDataToGenerator OnSPI(data, instructionAmplitude DataGenerator, lengthAmplitudeWRDat a);
WriteDataToGenerator OnSPI(data + lengthAmplitudeWRDat a, instructionFrequency DataGenerator, lengthFrequencyWRDat a);
RemoveCS_Latch (GENERATOR);

Первый параметр у ф-ии - собственно указатель на данные, второй - сам instruction byte, а третий - длина данных, которые хотим выплюнуть по SPI в этот регистр.

Сама ф-ия вот:

int WriteDataToGenerator OnSPI(unsigned char* dataWR, unsigned char* instructionByte, const int lengthWRData)
{
U8 DataRD[6];
int err;

err = write_read_spi_M(pSP I, mtxSPI_MEGA_PROG, instructionByte, DataRD, LENGTH_INSTRUCTION_D ATA_GENERATOR , SPI_TIME_OUT);
err += write_read_spi_M(pSP I, mtxSPI_MEGA_PROG, dataWR, DataRD, lengthWRData, SPI_TIME_OUT);

return err;
}

Genadi Zawidowski
23.01.2013, 22:37
Спасибо за комментарий.

А как насчёт просто вывести меандр на какой-либо из битиков вашей супер-системы? Хоть одногерцовый импульс... Убедитесь что выдаётся IOUPDATE.
ps: я спрашивал насчёт строчек вроде \0000010001010101010 1010100001111000111/ через дебаговый порт. Сделайте - стразу станет понятно где ошибка.

metoflex
12.07.2013, 14:25
Здравствуйте!

DDS запустился. но при неизменной амплитуде, при изменении частоты происходит изменение амплитуды, а именно:

На 2 МГц peak to peak 1.2 В, при приближении к 16 МГц, примерно начиная с 10 МГц, происходит уменьшение амплитуды выходного сигнала, вплоть до 50 мВ peak - to - peak, потом опять плавное нарастание, до 30 МГц. Это нормально для DDS или где-то кроется какая-то ошибка?

P.S. Значение частоты проставляется на всем диапазоне - правильно, но при неизменном значении амплитуды, которое зашиваю в регистр соответствующий, амплитуда плавает..

Vitas56
12.07.2013, 16:55
Здесь несколько неизвестных факторов.
1. Чем измеряете амплитуду.
2. На что нагружен выход DDS
3. Состояние регистра ASF.
Для DDS характерно уменьшение амплитуды с повышением частоты. Например для AD9951 на 100МГц относительно 1МГц до 2дБ. Кстати Reset в DDS имеет полярность противоположную микроконтроллерам т.е из 0 в 1. При тестовом режиме значение регистра ASF нужно оставить по умолчанию.
Вот моя начальная загрузка регистров AD9951
Cfr1_1 = &B00000000
Cfr1_2 = &B00000010
Cfr1_3 = &B00000000
Cfr1_4 = &B00000010
'Cfr2_1 = &B10000100 400MHz (25MHz*16)
Cfr2_1 = &B10100100 '500mhz (25MHz*20)
Cfr2_2 = &B00000000
Cfr2_3 = &B00000000
Asf = 16383

metoflex
13.07.2013, 11:41
н1. Амплитуду измеряю осциллографом, цифровым Agilent Technologies DSO7052A;
2. Выход нагружен на ФНЧ фильтры, с частотой среза 35 МГц , затем с помощью трансворматора дифференциальный сигнал, привожу к одиночному сигналу и подаю на вход усилителя GVA84. Было конечно подозрение что это из-за нагрузки, а именно из-за частотной зависимости входного сопротивления усилителя, но лично мне верится мало, чтобы сигнал изменялся при изменении частоты более чем на 20 дБ. Частотная же зависимость самого AD9952 не может давать такое изменение амплитуды при изменении частоты, аналог девайсы себе этого просто не позволили бы..
3. Процесс изменения частоты производил, без изменения регистра ASF (Я закомментил место где пишу каждый раз новое значение амплитуды, ззаписав первоначально максимальное значение 16383).

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

Спасибо за ответ!:)

P.S. Полоса синтезируемых частот: 2 - 30 МГц.

Vitas56
13.07.2013, 11:46
Проверьте ФНЧ или снимите АЧХ при отключенном ФНЧ. Успехов.

Genadi Zawidowski
13.07.2013, 11:47
2. Выход нагружен на ФНЧ фильтры, с частотой среза 35 МГц
Вы в курсе, что дифвыход AD9951 200 Ом (при токозадающем резисторе 3.9 к)? Как подано питание на выход? Нет ли там случайно резисторов? Под какое сопротивление расчитан фильтр (как я понял, дифференциальный)? Ну не жалейте информации, телепатия плохо помогает в таких случаях.
Может быть, у Вас просто рассогласован фильтр и из-за этого неравномерность такая?

metoflex
15.07.2013, 08:20
Сейчас просмотрел всю документацию на DDS. Не нашел явно указанного выходного сопротивления. Скажите пожалуйста, где Вы нашли выходное сопротивление?

Добавлено через 11 минут(ы):

Прилагаю файл с принципиальной схемой выхогда DDS.

Genadi Zawidowski
15.07.2013, 09:33
Скажите пожалуйста, где Вы нашли выходное сопротивление?
В моём случае я подбирал трансформаторы по максимальной отдаче на 50 Ом. Получившееся значение вполне соотвествует тому что можно получить из параметров Full-Scale Output Current и Voltage Compliance Range в даташите.
Если у Вас есть VNA, можете посмотреть что в реальности получается.

Рассматривая схему:
На выходе применён трансформатор 1:1 - можно предположить, что симметричный фильтр у Вас расчитан под 50 ом. На входе стоит трансформатор с соотношением витков 2:1 - преобразующий сопротивление 4:1. Каждый выход микросхемы зашунтирован 100 Ом резистором - значит, со стороны полуобмотки трансформатора видим 50 Ом.
Итак, трансформатор преобразует 100 Ом в 25, которые перекашивают Вам АЧХ фильтра.
Для лечения, попробуйте убрать оба резистора (R151 и R155) и посмотрите на АЧХ. Да, при этом мощность на выходе AD9951 получается около +3 дБмВт - даже при потерях 3 дБ до входа усилителя GVA-84+ доберётся не менее 0 дБмВт (а скорее всего и больше) - а эта микросхема на частотах до 100 мГц судя по даташиту имеет усиление более 20 дБ - при её P1OUT +20 дБмВт она будет перегруженна. Что-нибудь с линейной АЧХ и не с таким гигантским усилением здесь примените. Я нашёл GALI-6F+, но и ей в этом месте потребовался бы аттенюатор на входе.

metoflex
16.07.2013, 14:39
В моём случае я подбирал трансформаторы по максимальной отдаче на 50 Ом. Получившееся значение вполне соотвествует тому что можно получить из параметров Full-Scale Output Current и Voltage Compliance Range в даташите.
Если у Вас есть VNA, можете посмотреть что в реальности получается.

Рассматривая схему:
На выходе применён трансформатор 1:1 - можно предположить, что симметричный фильтр у Вас расчитан под 50 ом. На входе стоит трансформатор с соотношением витков 2:1 - преобразующий сопротивление 4:1. Каждый выход микросхемы зашунтирован 100 Ом резистором - значит, со стороны полуобмотки трансформатора видим 50 Ом.
Итак, трансформатор преобразует 100 Ом в 25, которые перекашивают Вам АЧХ фильтра.
Для лечения, попробуйте убрать оба резистора (R151 и R155) и посмотрите на АЧХ. Да, при этом мощность на выходе AD9951 получается около +3 дБмВт - даже при потерях 3 дБ до входа усилителя GVA-84+ доберётся не менее 0 дБмВт (а скорее всего и больше) - а эта микросхема на частотах до 100 мГц судя по даташиту имеет усиление более 20 дБ - при её P1OUT +20 дБмВт она будет перегруженна. Что-нибудь с линейной АЧХ и не с таким гигантским усилением здесь примените. Я нашёл GALI-6F+, но и ей в этом месте потребовался бы аттенюатор на входе.

Спасибо Вам большое:) Отпаял С121, L17, L18 - смотрю выход 6 трансформатора - все как в аптеке, на всех часттах:)

Сейчас хочу замоделячить фильтр и попробовать пересчитать его.

А разве на входе трансформатора будет не 200 Ом? (изображение приаттачил)

145271

Хотя, по переменке, для кажого выходного сигнала DDS, относительно земли сопротивление будет 100 Ом...

Genadi Zawidowski
16.07.2013, 14:42
относительно каждого выхода DDS, относительно земли сопротивление будет 100 Ом
Там зашунтировано 100 Ом-ным резистором - итого 50. Нет, Вам проще снять три детали и измерять, чем два резистора убрать как я говорил и проверить...
ПРи измерениях не забудьте про 50 Ом нагрузку (если анализатор спектра - всё нормально).


замоделячить фильтр и попробовать пересчитать его
Если не уберёте резисторы, на входе фильтра 25 Ом так и останется, на выходе 50.

metoflex
16.07.2013, 18:39
Если не уберёте резисторы, на входе фильтра 25 Ом так и останется, на выходе 50.

ээээ... не 50 наверное, а 100 все-таки. Ибо сигнал не ощутит изменений, при прохождении через трансформатор, когда сопротивление понизится в четыре раза, т.е. со 100 до 25. С другой стороны можно резисторы просто поставить по 200 Ом, тогда выход трансформатора будет 200 Ом, а сопротивление на выходе первичной обмотки уже 50 Ом, тем самым фильтр соглусую и пересчитывать не нужно будет. Сегодня не замоделячил, на x64 прога не встала, завтра другую заюзаю, попробую посмотреть модель (схема не моя).

Спасибо!:)

Genadi Zawidowski
16.07.2013, 18:43
С другой стороны можно резисторы просто поставить
резисторы на выходе микросхемы AD9951 потребляют мощность. Их надо учитывать при оценке сопротивления. Одиночный выход AD9951 - 100 Ом.
Прошу ещё раз - проверьте работу первоначальной схемы без резисторов R151 и R155.


ээээ... не 50 наверное, а 100 все-таки
Без программы никак?

metoflex
17.07.2013, 10:32
резисторы на выходе микросхемы AD9951 потребляют мощность. Их надо учитывать при оценке сопротивления. Одиночный выход AD9951 - 100 Ом.
Прошу ещё раз - проверьте работу первоначальной схемы без резисторов R151 и R155.


Без программы никак?

При снятии указанных резисторов, получу просто токовый выход DDS, который не требует согласования? Если нет, то я не до конца осознал как снятие резисторов вылечит рассогласование..

Юрій
21.07.2013, 17:18
Пытаюсь запустить синтезатор на AD9954 . Возникло сомнение в достаточной амплитуде входного сигнала на OSC/REFCLK . Я правильно понял из описания к АД9954 , что на выходе CRYSTAL OUT должен быть сигнал той же частоты , что и на входе и и этот выход аппаратный ( частота на нем не зависит от управляющей программы контроллера ) ?