Programovatelný generátor signálu AD9833

Programovatelný generátor signálů je přídavný modul pro Arduino. Tento modul obsahuje integrovaný obvod AD9833, který dokáže na svém výstupu generovat signály ve tvaru sinus, obdélník a trojúhelník. A u zmíněných signálů lze měnit jejich frekvenci a fázový posuv.
Frekvenci výstupního signálu lze nastavit v rozsahu 0 až 12,5 MHz, přičemž nejmenší krok je 0,1 Hz. Komunikace probíhá po sběrnici SPI. Zajímavou vlastností tohoto generátoru je také přítomnost dvou registrů, do kterých můžeme nastavit nezávisle na sobě dvě různá nastavení signálů a poté mezi nimi jednoduše přepínat. Co se týká velikosti výstupního napětí, tak to se v závislosti na nastavení pohybuje mezi 38 mV a 650 mV.
Pro napájení modulu je možné použít napětí v rozsahu 2,3 až 5,5 Voltu a proudový odběr se pohybuje okolo 4 mA.

Pro úspěšné propojení generátoru signálů a Arduino desky je nutné zapojit celkem 5 vodičů. Propojíme VCC s +5V Arduina, GND se zemí Arduina, SDATA s pinem D11, SCLK s pinem D13 a FSYNC s pinem D10. Pro FSYNC je možné vybrat také jiný volný pin, ale je nutné tuto volbu provést také na začátku programu. Ostatní signály je nutné připojit na sběrnici SPI, kdy u Arduino Uno desky jsou to právě piny D11 a D13. Zbylé dva piny OUT a AGND pak připojíme na osciloskop.

Pro úspěšné nahrání uvedeného ukázkového kódu je nutné stáhnout a naimportovat knihovnu AD9833, návod, jak na to je uveden zde. Ukázkový kód obsahuje na svém začátku připojení potřebné knihovny a nastavení čísla propojovacího pinu pro FSYNC. A jako poslední je provedena inicializace modulu z knihovny.
V podprogramu setup v prvním kroku provedeme inicializaci komunikace po sériové lince a poté zahájíme komunikaci s modulem AD. Po zahájení je nastaven registr REG0, signál sinus a frekvence 1000 Hz, ale výstup je neaktivní. Proto ho následujícím příkazem aktivujeme a vyčkáme čtyři sekundy před nekonečnou smyčkou.
Nekonečná smyčka loop obsahuje pro ukázku různá dostupná nastavení z knihovny. V prvním kroku je ukázka nastavení a zároveň aktivace trojúhelníkového signálu skrze REG1. V dalším kroku změníme pouze frekvenci generovaného signálu a poté následuje ukázka přepnutí zdroje výstupu zpět na REG0. Po této ukázce je změněn signál na obdélník a půl-obdélník, což je obdélníkový signál o poloviční frekvenci oproti nastavené. V další ukázce je nastaven signál zpět na sinus o frekvenci 1000 Hz, který je poté využitý v ukázce postupného zvyšování frekvenci ve 100 Hz krocích až na 4000 Hz. Předposlední ukázka obsahuje změnu fázového posuvu a před koncem smyčky provedeme reset modulu, ve kterém není výstup aktivní.

// Generátor funkcí AD9833

// připojení potřebné knihovny
#include <AD9833.h>
// definice propojovacího pinu FSYNC
#define pinFsync 10
// inicializace modulu z knihovny s nastavením pinu FSYNC
AD9833 gen(pinFsync);

void setup() {
  // zahájení komunikace po sériové lince
  // rychlostí 9600 baud
  Serial.begin(9600);
  // zahájení komunikace s modulem AD9833
  gen.Begin();
  // zapnutí výstupu s výchozím signálem
  // typu SINUS s frekvencí 1 kHz
  Serial.println("Start programu, sinus 1000 Hz");
  gen.EnableOutput(true);
  delay(4000);
}

void loop() {
  // nastavení trojúhelníkového signálu
  // o frekvenci 2000 Hz do REG1
  // a jeho zapnutí na výstup
  Serial.println("Trojuhelnik 2000 Hz");
  gen.ApplySignal(TRIANGLE_WAVE, REG1, 2000);
  delay(4000);
  // změna frekvence v REG1 na 1000 Hz
  Serial.println("Zmena trojuhelniku na 1000 Hz");
  gen.SetFrequency(REG1, 1000);
  delay(4000);
  // přepnutí zpět na REG0
  Serial.println("Prepnuti zpet na 1000 Hz sinus");
  gen.SetOutputSource(REG0);
  delay(4000);
  // nastavení REG0 na obdélníkový signál
  // o frekvenci 1500 Hz
  Serial.println("Zmena na obdelnik 1500 Hz");
  gen.SetWaveform(REG0, SQUARE_WAVE);
  gen.SetFrequency(REG0, 1500);
  delay(4000);
  // nastavení REG0 na půlobdélníkový signál
  // o frekvenci 1000 Hz
  Serial.println("Zmena na pul-obdelnik 1000 Hz");
  gen.SetWaveform(REG0, HALF_SQUARE_WAVE);
  gen.SetFrequency(REG0, 1000);
  delay(4000);
  // nastavení REG0 na sinusový signál
  // o frekvenci 1000 Hz
  Serial.println("Zmena na sinus 1000 Hz");
  gen.SetWaveform(REG0, SINE_WAVE);
  delay(4000);
  // postupné zvyšování fázového posuvu od 0 do 180 stupňů
  Serial.println("Zvysovani frekvence z 1000 na 4000 Hz");
  for (int i = 0; i < 30; i++) {
    gen.IncrementFrequency(REG0, 100);
    delay(100);
  }
  delay(1000);
  // nastavení fázového posuvu na 180 stupňů
  Serial.println("Nastaveni fazoveho posuvu na 180 stupnu");
  gen.SetPhase(REG1, 180);
  delay(4000);
  // reset modulu pro získání výchozího stavu
  Serial.println("Reset modulu");
  gen.Reset();
  delay(4000);
}

Po nahrání ukázkového kódu do Arduino desky s připojeným generátorem signálů AD9833 dostaneme například tento výsledek na osciloskopu:

Programovatelný generátor signálů je zajímavý přídavný modul, který nám umožňuje s pomocí Arduina generovat různé druhy signálů v poměrně širokém frekvenčním rozsahu. Tento generátor se hodí jak pro výukové účely, tak i například pro radioamatéry či kutily, kteří potřebují generovat různé druhy signálů s frekvencí i několik Megahertz. Velkou výhodou tohoto modulu je pak jeho poměrně nízký proudový odběr a široké možnosti nastavení výstupního signálu. Jen musíme myslet na to, že kvůli nízkému výstupnímu napětí ho bude pravděpodobné nutné napěťové zesílit vhodným zesilovačem.

 

Seznam použitých komponent:

https://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html
https://dratek.cz/arduino/1671-programovatelny-generator-signalu-dds-pro-sinusove-a-ctvercove-vlny-ad9833-1499851362.html
Osciloskop DS0138
https://dratek.cz/arduino/1229-digitalni-osciloskop-ds0138-200khz-1458409845.html

Další podobné články