DDS AD9850 i Arduino – wyśw. LED
Łatwo dostępny i tani moduł zintegrowanej syntezy DDS na układzie AD9850 sprowokował mnie do kolejnych eksperymentów. Jakość wykonania i pewnie też sygnału wyjściowego nie zwala z nóg, ale Chińczyki sprzedają go za 5-6 dolców, a na Allegro można je kupić poniżej 50 PLN – dlatego czepiać się nie będę. Wg producenta układ powinien działać do 40 MHz, i łatwo go wysterować (zarówno szeregowo jak i równolegle). W Internecie można znaleźć sporo gotowych bibliotek do obsługi tych układów z Arduino.
Nota aplikacyjna układu AD9850 do pobrania TUTAJ.
Układ składa się z 4 podstawowych płytek/modułów/elementów :
- moduł syntezy DDS na układzie AD9850
- moduł wyświetlacza – wskaźnik nastawionej częstotliwości – ja posłużyłem się dużym, szeregowym wyświetlaczem LED na układzie TM1638 (oczywiście nic nie stoi na przeszkodzie aby zastosować alfanumeryczny LCD)
- moduł obrotowego Encodera, który jest elementem umożliwiającym nastawienie żądanej częstotliwości
- Arduino Uno
Na pierwszym etapie, który tu prezentuję, funkcjonalność układu jest bardzo ograniczona i poza działającą syntezą i możliwością zmiany częstotliwości – z jednym zaprogramowanym krokiem – nic więcej nie da się zrobić. Niemniej dla osób, które samodzielnie będą eksperymentować z modułami DDS kod może być przydatny, bo jak sądzę jest bardzo przejrzysty, czytelny i wyjątkowo krótki. Duży nacisk położyłem na wykorzystanie gotowych bibliotek (po co wyważać otwarte drzwi) do obsługi poszczególnych modułów, wybierając, moim zdaniem, najlepsze/najłatwiejsze w implementacji, co istotnie uprościło kod programu.
Zastosowane biblioteki :
#include <AH_AD9850.h> //biblioteka modulu syntezy AD9850 #include <TM1638.h> //biblioteka modulu wysw. LED #include <Encoder_Polling.h> //biblioteka Encoder`a //********** Definicja pinow dla DDS //AH_AD9850(CLK, FQUP, BitData, RESET) AH_AD9850 AD9850(1, 0, 2, 3); // piny w mojej konfiguracji //********** Definicja pinow dla wysw. LED //TM1638(DIO, CLK, STB0) TM1638 module(8, 9, 7); // piny w mojej konfiguracji long Freq = 5000000; // wartosc do przechowywania // aktualnej czestotliwosci long Krok = 10000; // 10 KHz - aktualny krok DDS //********** Definicja pinow dla Encodera int encoderPin_A = 4; int encoderPin_B = 5; //******************************************************** void setup() { module.setupDisplay(true, 2); // intensywnosc swiecenia // wysw. LED domyslnie wali // po oczach (zakres 0-7) encoder_begin(encoderPin_A, encoderPin_B); // start Encoder } //******************************************************** void loop() { AD9850.set_frequency(Freq); // ustaw czest. startowa // wyswietl na LED // (wartosc czest., ustwienie kropek, nieznaczace zera) module.setDisplayToDecNumber(Freq,B01001000,false); int dir = encoder_data(); // sprawdz Encoder if(dir > 0) // jeśli w prawo to ... { Freq = Freq + Krok; // zwieksz f o krok } else if (dir <0 ) // jeśli w lewo to ... { Freq = Freq - Krok; // zmniejsz f o krok } else { } delay(50); }
Zastosowana płytka stykowa wykorzystana została wyłącznie do dystrybucji zasilania. Układ zasilany jest z zasilacza zewnętrznego, co wpływa na obniżenie zakłóceń i poprawia jakość sygnału wyjściowego. Całość pobiera ok. 270 mA