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