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

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

4 + 18 =