Sterowanie DDS-em - AD9835

Witam,

Czy ktoś sterował (np. poprzez komputer, uC) syntezerem DDS - AD9835? Nie potrafię za nic sterować tym układem, poniżej opiszę dokładniej o co chodzi:

Zbudowałem prosty układ (w oparciu o 'Evaluation Board' ze strony AD), układ taktuje generatorem 50MHz, steruję za pośrednictwem portu LPT. Oryginalny program AD do sterowania tym układem działa bezproblemowo, układ natychmiast reaguje na każde polecenie (zmiana częstotliwości, reset, itp.) Napisałem w C program do sterowania tym układem, wykorzystując identyczne połączenia co dla programu oryginalnego AD.

PDF układu:

formatting link
Board:
formatting link
strona:
formatting link
której to można uzyskać bezpśrednio słowa, które trzeba wysłać do układu.

Podłączyłem do portu LPT diody LED i w pracy krokowej sprawdzałem wysyłane bity i sygnały na liniach - wszystko się zgadza. Mimo wszystko układem nie da się sterować. Oryginalny program wysyła dane ponad 10 krotnie szybciej niż mój (nawet po usunięciu delay-ów) - ale powiedzmy, że póki co nie zależy mi na szybkości.

I tak np. przy zmianie częstotliwości robię tak: (wcześniej oryginalnym programem inicjalizuje DDS (reset) - nie blokuje to portu)

  1. Wszystkie bity portu ustawiam na 1.
  2. Zeruję bit FSYNC.
  3. Przesyłam po SDATA: 0x3033, zatwierdzając każdy bit wyzerowaniem SCLK (opadające zbocze...).
  4. Ustawiam bit FSYNC. I wg. mnie po tym układ powinien wytwarzać sygnał, a nic się nie dzieje. Podobnie, jak ustalę jaką częstotliwość programem z AD, po czym próbuję moim programem układ resetować DDS wysyłając 0xF800.

Szukałem w Internecie, ale nie znalazłem żadnych innych opisów sterowania, czy kodów źródłowych. Czy ktoś jest w stanie mi pomóc? Czy ktoś pisał podobne program do sterowania tym układem?

Jeśli to istotne, to mogę zamieścić gdzieś źródła, ale tak jak pisałem

- sprawdzałem LEDami i dane są prawidłowe. Nie mam oscyloskopu cyfrowego, by sprawdzić co wysyła oryginalny program. Może da się jakiś wirtualny port zainstalować, gdzie dane będą zapisywane do pliku? Teraz to wymyśliłem i poszukam...

Reply to
Dykus
Loading thread data ...
Reply to
Marek Dzwonnik

Witam,

Dnia 21-02-05 (Monday) o 19:16, 'Marek Dzwonnik' napisał(a):

Będę wdzięczny. Pisałem na priv.

Oczywiście pomoc innych osób nadal bardzo mile widziana. :)

Reply to
Dykus

tez zrobilem na 3x AD9832 i tez dzialajacy. Do zaprogramowania tego sluzyl AT90S2313, kody wysylane byly zgodnie z tym, co napisano w nocie aplikacyjnej i co wyrzucila mi aplikacja ze strony Analoga.

SCLK na PB4 SDATA na PB3 FSYNC0, FSYNC2, FSYNC3 czyli wybor ukladu na PB2, PB1, PB0

funkcja wysylajaca dane do DDS:

void dds_serial( unsigned int data, char device) { char a; PORTB=0xFF; //wybieramy odpowiedni uklad CS czyli FSYNC; if (device==0) PORTB=PORTB&0xFB; if (device==1) PORTB=PORTB&0xFD; if (device==2) PORTB=PORTB&0xFE;

for(a=0;a<16;a++) { if (data&0x8000) PORTB=PORTB|0x08; else PORTB=PORTB&0xF7; data=data<<1; //sygnal zegarowy PORTB=PORTB&0xEF; PORTB=PORTB|0x10; }; //przed wyjsciem ustawiamy wszystkie CS na niekatywne PORTB=0xFF; }

i potem przykladowo zaprogramowanie ukladu 0 na dwie przelaczane czestotliwosci 9,9 kHz i 10,4 kHz:

dds_serial(0xF800,0); //reset dds_serial(0x3034,0); dds_serial(0x2111,0); dds_serial(0x3236,0); dds_serial(0x2300,0); //FREQ0 9.9KHZ dds_serial(0x3441,0); dds_serial(0x25CC,0); dds_serial(0x3638,0); dds_serial(0x2700,0); //FREQ1 10.4KHZ dds_serial(0x1800,0); dds_serial(0x0900,0); //PH0 dds_serial(0x1A00,0); dds_serial(0x0B00,0); //PH1 dds_serial(0x1C00,0); dds_serial(0x0D00,0); //PH2 dds_serial(0x1E00,0); dds_serial(0x0F00,0); //PH3 dds_serial(0x8000,0); //SYNC/SELSRC dds_serial(0xC000,0); //OUT OF RESET

Reply to
Michal Baszynski .
Reply to
Marek Dzwonnik

Witam,

Dziękuję wszystkim za pomoc!

Błąd był (jak to zwykle bywa:) po mojej stronie - źle sterowałem sygnałem FSYNC (zerowany na czas wysyłania danych) przy wykonywaniu funkcji (błąd w programie).

Reply to
Dykus

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.