Jump to content

    

проблемы с микроосхемой AD9833

Есть проблемы с микросхемой AD9833.

Микросхему подключил к контроллеру, связь наладил (слова загружаются), в качестве основного генератора использовал генератор на 25МГц (сигнал в принципе хороший, на осцилографе смотрел).

Хочу получить меандр на выходе. Для этого загружаю слова:

2128 6E14 451E 8000 8000 C000 E000 2028 чтобы получить 2МГц или

2128 570A 428F 8000 8000 C000 E000 2028 чтобы получить 1МГц, так же пробовал и другие частоты.

Коды брал с сайта http://www.analog.com/Analog_Root/static/t...334/ad9833.html.

В итоге на осциллографе вижу что получается меандр, но у этого меандра не стабильное время высокого уровня сигнала, т.е. оно постоянно, то увеличивается, то уменьшается. На частоте 1МГц изменение длительности высокого уровня сигнала составляло порядка 40нс, через каждую секунду, но период при этом оставался одним и тем же. С увеличением частоты выходного сигнала, все становиться еще хуже - фронты уже становиться не фронтами, а ступеньками. На частоте 10МГц меандр уже разглядеть сложно. Собирал несколько различных схем, менял микросхемы, менял генераторы ничего не помогло - результат такой же.

Подскажите, кто работал с этой микросхемой, как сделать правильный меандр?

Может я код неверный подаю или эта такая особененость микросхемы?

Share this post


Link to post
Share on other sites
Есть проблемы с микросхемой AD9833.

Микросхему подключил к контроллеру, связь наладил (слова загружаются), в качестве основного генератора использовал генератор на 25МГц ...изменение длительности высокого уровня сигнала составляло порядка 40нс

по-моему задача в данном случае не решаема:

25Мгц=>скорость выборки dds из пзу,т.е 40нс - которые вы видите, и от этой погрешности никуда не уйти!

(поставите генератор по-больше -"погрешность" просто уменьшится, но никуда не уйдет. надо другой dds)

 

http://www.analog.com.ru/pub_wireless.htm

Share this post


Link to post
Share on other sites

Спасибо за ответ,

тогда может быть кто-нибудь подскажет dds с хорошими фазавыми характеристиками, т.е. для меня важно чтобы импульсы формируемого меандра были стабильными, максимальная частота 2МГц.

Share this post


Link to post
Share on other sites
важно чтобы импульсы формируемого меандра были стабильными, максимальная частота 2МГц.

посмотрите если:

поставите генератор например на 20МГц(я у себя ставил и на 40, но это превышение datasheet),

то скорее всего получите красивые меандры, но только с частотами f=20MГц/(2*n). где n= 1,2,3...,

в том чисте получите 2МГц

Share this post


Link to post
Share on other sites

А причем тут сигнал на выходе микросхемы? Там будет рваный ступенчатый сигнал. После DDS надо ставить аналоговый ФНЧ с частотой среза чуть меньше половины тактовой. На выходе ФНЧ получим синус с нужной частотой. Потом ставим аналоговый компаратор и уже на его выходе получаем требуемый меандр. Смотрите аппноты на старшие DDS AD59хх- там это подробно разжевано и компаратор быстрый в сруктуру микросхемы DDS встроен.

А в режиме MSB на выходе оно и будет дергаться плюс-минус период клока, в даташите же написано - "This is useful as a coarse clock source." Это переносимо на килогерцах, а на мегагерцах-ну незнаю.. такой огромный джиттер....

Share this post


Link to post
Share on other sites

Работаю с ad9833.

Подключил к atmega 8535, по SPI отправляю настроечные слова.

К ad9833 подключен генератор 16 Mhz. Данные, тики и уровни идут правильно - согласно datasheet.

 

Генерирует sin и меандр.

Треугольник так и не получилось настроить - в теории все работает при задании control_bit[1] = 1

 

Откопал чудо application note - взял из него пример, поигрался с частотами, но работает все через раз и максимально возможной частоты не показывает, все в пределе 1-10 кГц.

 

Кто сталкивался с данной микросхемой, какие могут быть идеи насчет правильной настройки?

 

привожу настроечное слово и код отправки по SPI

// // app note
Write16SPI(0x2100); 
Write16SPI(0x50C7); 
Write16SPI(0x40F0); 
Write16SPI(0xC000); 
Write16SPI(0x2000);

 

// синус 
Write16SPI(0x2128);
Write16SPI(0x6E14);
Write16SPI(0x451E);
Write16SPI(0x8000);
Write16SPI(0x8000);
Write16SPI(0xC000);
Write16SPI(0xE000);
Write16SPI(0x0002);

 

#define CLOCK           PORTB.1
// защелка
#define FSYNC           PORTB.2
// данные
#define DATA_OUT        PORTB.0

 

//------------------функция записи по SPI-------------------
void Write16SPI(unsigned int data){
// счетчик цикла
int K=16;         
int J=0;
// 
unsigned char low_part;
unsigned char hi_part;   

bit pin_data; 

                                        
// сохраняем младшую часть 
low_part = (unsigned char)(data & 0x00FF);  
// сохраняем старшую часть
hi_part = (unsigned char)(data >> 8);   
    
        // начало передачи данных
        FSYNC = 0;

        // выставляем данные     
        Write8Bit(hi_part);
        // если старшие 8 бит - 
       
        Write8Bit(low_part);

        // окончание передачи данных  
        FSYNC = 1;
}

//------------------функция записи по SPI-------------------
void Write8Bit(unsigned char data){
// счетчик цикла
int K=8;         
int J=0;

bit pin_data; 

        K = 8;   
        J = 0;
        // передаем 16 бит по одному
        while (K){
                pin_data = (data & 128);
                DATA_OUT = pin_data;
                data <<= 1;
                
//                 sprintf(buf, "%x", pin_data);
//                 lcd_gotoxy(J,1); 
//                 lcd_puts(buf); 
//                 delay_ms(100); 
//                 
                // активный уровень clock 
                CLOCK = 1;     
                delay_us(10);  
                //delay_ms(1);
                // декремент счетчика
                K--;        
                J++;
                CLOCK = 0;      
                delay_us(10);                 
        }       
}

Share this post


Link to post
Share on other sites

странно не имел с ней проблем, использовал синус.

 

вот код, асм, но понять можно, далее из массива, куда адресуется dm(i0+=1)= ar; 16 разр. слова уходят в SPI.

 

//2//write reg-s

//Fout= fMCLK /2^28 * FREQREG= 16.384MHz/2^28*FREQREG

//d15= 0 d14=1 - freq0

//d15= 1 d14=0 - freq1

//d12= 1 - MSB

 

//2----Writing to a Frequency Registers

ar= dm(AD9833Cntrl);

ar= setbit 13 of ar;//set LSB,MSB byte,

dm(i0+=1)= ar;

 

//3 --------FREQ0 REG Write

ar= dm(FreqRegDDS+1);// LSB first if LSB+MSB

ar= setbit 14 of ar; //select freq0 register

dm(i0+=1)= ar;

 

 

// For LSB //CONTROL REGISTER "WRITE"

//

 

 

//4-----------------FREQ0 REG Write

ar= dm(FreqRegDDS+0); //MSB second if send LSB+MSB

ar= setbit 14 of ar; //freq0

dm(i0+=1)= ar;

 

 

//-----Writing to a Phase Register

//d15 d14 d13 d12 ......................

//1 1 0 X MSB 12 PHASE0 Bits LSB

//1 1 1 X MSB 12 PHASE1 Bits LSB

 

//------

//5---------------- enable AD9833

ar= dm(AD9833Cntrl);

ar= 0;//clrbit 8 of ar; // clear reset;

dm(AD9833Cntrl)= ar;

dm(i0+=1)= ar;

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this