- DDS Function Generator nedir?
- AD9833 Function Generator IC'nin Çalışmasını Anlayın
- AD9833 tabanlı İşlev Oluşturucuyu Oluşturmak için Gerekli Bileşenler
- AD9833 Tabanlı Fonksiyon Üreteci - Şematik Diyagram
- AD9833 Tabanlı Fonksiyon Üreteci - Arduino Kodu
- AD9833 Tabanlı Fonksiyon Üreticiyi Test Etme
- Diğer Geliştirmeler
Benim gibi farklı elektronik devrelerle ince ayar yapmak isteyen bir elektronik meraklısıysanız, iyi bir Fonksiyon Üreticisine sahip olmak bazen zorunlu hale gelir. Ancak birine sahip olmak bir sorundur çünkü bu tür temel ekipman bir servete mal olabilir. Kendi test ekipmanınızı oluşturmak sadece daha ucuz değil, aynı zamanda bilginizi geliştirmek için harika bir yoldur.
Bu yüzden bu yazıda, çıkışta maksimum 12 MHz frekansla sinüs, kare ve üçgen dalgalar üretebilen Arduino ve AD9833 DDS Fonksiyon Üretici Modülü ile basit bir Sinyal Üreteci oluşturacağız. Son olarak, osiloskopumuzun yardımıyla çıkış frekansını test edeceğiz.
Daha önce basit analog devrelerin yardımıyla Basit Sinüs Üreteci, Kare Dalga Üreteci ve Üçgen Dalga Üreteci inşa etmiştik. Bazı temel Dalga Biçimi Oluşturucu Devreleri arıyorsanız, bunları kontrol edebilirsiniz. Ayrıca, AD9833 Modülünü kullanmadan daha ucuz bir Arduino Fonksiyon üreteci oluşturmak istiyorsanız, DIY Arduino Waveform Generator Projesine göz atabilirsiniz.
DDS Function Generator nedir?
Adından da anlaşılacağı gibi, bir fonksiyon üreteci, ayar üzerine belirli bir frekansa sahip belirli bir dalga formunu çıkarabilen bir cihazdır. Örneğin, çıkış frekansı yanıtınızı test etmek istediğiniz bir LC filtreniz olduğunu düşünün, bunu bir fonksiyon üreteci yardımıyla kolayca yapabilirsiniz. Tek yapmanız gereken, istediğiniz çıkış frekansını ve dalga biçimini ayarlamaktır, ardından yanıtı test etmek için aşağı veya yukarı çevirebilirsiniz. Bu sadece bir örnekti, liste ilerledikçe onunla daha fazla şey yapabilirsiniz.
DDS, Doğrudan Dijital Sentez anlamına gelir. Sıfırdan bir sinyal oluşturmak için dijitalden analoğa dönüştürücüler (DAC) kullanan bir tür dalga biçimi üretecidir. Bu yöntem, özellikle bir sinüs dalgası oluşturmak için kullanılır. Ancak kullandığımız IC, Kare veya Üçgen dalga sinyalleri üretebilir. Bir DDS çipinin içinde gerçekleşen işlemler dijitaldir, bu nedenle frekansı çok hızlı değiştirebilir veya bir sinyalden diğerine çok hızlı bir şekilde geçebilir. Bu cihaz, geniş bir frekans spektrumu ile iyi bir frekans çözünürlüğüne sahiptir.
AD9833 Function Generator IC'nin Çalışmasını Anlayın
Projemizin merkezinde analog cihazlar tarafından tasarlanan ve geliştirilen AD9833 Programlanabilir Dalga Biçimi Üreteci IC bulunmaktadır. Maksimum 12 MHz frekansta sinüs, üçgen ve kare dalga üretebilen, düşük güçlü, programlanabilir bir dalga formu üretecidir. Sadece bir yazılım programı ile çıkış frekansını ve fazını değiştirebilen çok benzersiz bir IC. 3 kablolu bir SPI arayüzüne sahiptir, bu nedenle bu IC ile iletişim çok basit ve kolay hale gelir. Bu IC'nin fonksiyonel blok şeması aşağıda gösterilmiştir.
Bu IC'nin çalışması çok basit. Yukarıdaki fonksiyonel blok şemasına bakarsak, görevi bir sinüs dalgasının 0'dan 2π'ye kadar tüm olası dijital değerlerini depolamak olan bir Faz Birleştiricimiz olduğunu görürüz. Daha sonra, görevi daha sonra doğrudan genliğe haritalanabilen faz bilgisini dönüştürmek olan SIN ROM'umuz var. SIN ROM, dijital faz bilgisini bir arama tablosuna bir adres olarak kullanır ve faz bilgisini genliğe dönüştürür. Ve son olarak, görevi SIN ROM'dan dijital verileri alıp karşılık gelen analog voltajlara dönüştürmek olan 10 bitlik bir dijitalden analoğa dönüştürücümüz var, bu da çıktıdan elde ettiğimiz şey. Çıkışta, sadece küçük bir yazılım kodu ile açıp kapatabileceğimiz bir anahtarımız da var. Bunun hakkında daha sonra makalede konuşacağız.Yukarıda gördüğünüz ayrıntılar, IC'nin içinde olup bitenlerin çok basit bir versiyonudur ve yukarıda gördüğünüz ayrıntıların çoğu AD9833 veri sayfasından alınmıştır, ayrıca daha fazla bilgi için kontrol edebilirsiniz.
AD9833 tabanlı İşlev Oluşturucuyu Oluşturmak için Gerekli Bileşenler
AD9833 tabanlı işlev oluşturucuyu oluşturmak için gerekli bileşenler aşağıda listelenmiştir, bu devreyi çok genel bileşenlerle tasarladık, bu da çoğaltma işlemini çok kolaylaştırır.
- Arduino Nano - 1
- AD9833 DDS Fonksiyon Jeneratörü - 1
- 128 X 64 OLED Ekran - 1
- Genel Rotary Enkoder - 1
- DC Varil Jakı - 1
- LM7809 Voltaj Regülatörü - 1
- 470 uF Kapasitör - 1
- 220 uF Kapasitör - 1
- 104pF Kapasitör - 1
- 10K Direnç - 6
- Dokunsal Anahtarlar - 4
- Vidalı Klemens 5.04mm - 1
- Kadın Başlık - 1
- 12V Güç Kaynağı - 1
AD9833 Tabanlı Fonksiyon Üreteci - Şematik Diyagram
AD9833 ve Arduino Tabanlı Fonksiyon Üreteci için eksiksiz devre şeması aşağıda gösterilmiştir.
İstediğimiz frekansı oluşturmak için AD9833'ü Arduino ile birlikte kullanacağız. Ve bu bölümde tüm detayları şematik yardımıyla anlatacağız; Devre ile neler olduğuna dair size kısa bir genel bakış vereyim. AD9833 modülüyle başlayalım. AD9833 modülü, fonksiyon üreteci modülüdür ve şemaya göre Arduino ile bağlantılıdır. Devreye güç sağlamak için, iyi bir dekuplaj kapasitörü olan bir LM7809 voltaj regülatörü IC kullanıyoruz, bu gereklidir çünkü besleme gürültüsü çıkış sinyaline müdahale ederek istenmeyen çıkışa neden olabilir. Her zaman olduğu gibi, Arduino bu proje için beyin olarak çalışıyor. Ayarlanan frekansı ve diğer değerli bilgileri görüntülemek için 128 X 64 OLED ekran modülünü bağladık. Frekans aralığını değiştirmek için üç anahtar kullanıyoruz. İlki frekansı Hz olarak ayarlar, ikincisi çıkış frekansını KHz olarak ayarlar ve üçüncüsü frekansı MHz olarak ayarlar, ayrıca çıkışı etkinleştirmek veya devre dışı bırakmak için kullanılabilecek başka bir düğmemiz de vardır. Son olarak, döner kodlayıcıya sahibiz,ve ona bir miktar çekme direnci eklememiz gerekiyor, aksi takdirde bu anahtarlar çalışmaz çünkü havuzlama yönteminde düğmeye basma olayını kontrol ediyoruz. Döner kodlayıcı frekansı değiştirmek için kullanılır ve döner kodlayıcının içindeki dokunsal anahtar ayarlanan dalga biçimini seçmek için kullanılır.
AD9833 Tabanlı Fonksiyon Üreteci - Arduino Kodu
Bu projede kullanılan kodun tamamı bu sayfanın alt kısmında bulunabilir. Gerekli başlık dosyalarını ve kaynak dosyalarını ekledikten sonra, Arduino dosyasını doğrudan derleyebilmelisiniz. Sen indirebilirsiniz ad9833 Arduino kütüphanesini aşağıda verilen bağlantıdan ve diğer kitaplıkları veya başka kütüphane kurmak için tahta yöneticisi yöntemini kullanabilirsiniz.
- Bill Williams'ın sunduğu AD9833 Kitaplığını indirin
- Adafruit tarafından SSD1306 OLED Kütüphanesini İndirin
- Adafruit GFX kitaplığını indirin
Ino'daki kodun açıklaması . dosyası aşağıdaki gibidir. İlk olarak, gerekli tüm kitaplıkları ekleyerek başlıyoruz. İçin kütüphane AD9833 DDS modülü ilk OLED kütüphanede takip eder ve matematik kütüphanesi hesaplamalarda bazıları için gereklidir.
#include // AD9833 Modülü için Lbrary #include
Ardından, düğmeler, anahtar, döner kodlayıcı ve OLED'ler için gerekli tüm giriş ve çıkış pinlerini tanımlıyoruz.
#define SCREEN_WIDATA_PINH 128 // OLED ekran Piksel cinsinden genişlik #define SCREEN_HEIGHT 64 // OLED ekran yüksekliği, piksel cinsinden #define SET_FREQUENCY_HZ A2 // Frekansı Hz'de Ayarlamak İçin Düğme #define SET_FREQUENCY_KHZ A3 // KhzENC_define Frekans Ayarlamak İçin Düğme A6 // Mhz'de Frekansı Ayarlamak İçin Düğme #define ENABLE_DISABLE_OUTPUT_PIN A7 // Çıkışı Etkinleştirmek / Devre Dışı Bırakmak İçin Düğme #define FNC_PIN 4 // Fsync AD9833 Modülü tarafından Gerekli #define CLK_PIN 8 // Kodlayıcının Saat Pimi #define DATA_PIN 7 / / Kodlayıcının Veri Pini #define BTN_PIN 9 // Kodlayıcı üzerindeki Dahili Buton
Bundan sonra, bu kodda gerekli olan tüm gerekli değişkenleri tanımlarız. İlk olarak, döner kodlayıcı değerini saklayacak bir tamsayı değişken sayacı tanımlarız. Sonraki iki değişken clockPin ve clockPinState, kodlayıcı yönünü anlamak için gereken pin heykelini depolar. Mevcut zamanlayıcı-sayaç değerlerini tutan bir zaman değişkenimiz var, bu değişken düğme iptali için kullanılıyor. Ardından, uygulanacak olan hesaplanan frekansı tutan işaretsiz uzun değişken moduleFrequency var. Sonra, geri ödeme gecikmesi var. Bu gecikme gerektiği gibi ayarlanabilir. Ardından, set_frequency_hz olmak üzere üç boole değişkenimiz var,set_frequency_Khz ve set_frequency_Mhz bu üç değişken, modülün mevcut ayarını belirlemek için kullanılır. Makalenin ilerleyen bölümlerinde daha ayrıntılı olarak konuşacağız. Daha sonra, çıkış dalga formunun durumunu saklayan değişkenimiz var, varsayılan çıkış dalga formu bir sinüs dalgasıdır. Ve son olarak, çıktı dalga biçimini ayarlamak için kullanılan kodlayıcı düğme sayısını tutan encoder_btn_count değişkenine sahibiz.
int sayaç = 1; // Döner kodlayıcı döndürüldüğünde bu Sayaç değeri artar veya azalır int clockPin; // Döner kodlayıcı tarafından kullanılan pin durumu için yer tutucu int clockPinState; // döner kodlayıcı tarafından kullanılan pin durumu için yer tutucu unsigned long time = 0; // İmzalanmamış uzun modülün kaldırılması için kullanılırFrequency; // çıkış frekansını ayarlamak için kullanılır long debounce = 220; // Gecikmeyi geri al bool btn_state; // AD98333 Modülünün çıkışını devre dışı bırakmak için kullanılır bool set_frequency_hz = 1; // AD9833 Modülünün varsayılan frekansı bool set_frequency_khz; bool set_frequency_mhz; String waveSelect = "SIN"; // Modülün başlangıç dalga biçimi int encoder_btn_count = 0; // kodlayıcı düğmesini kontrol etmek için kullanılır İleri'ye basın, biri OLED ekran ve diğeri AD9833 modülü için iki nesnemiz var.Adafruit_SSD1306 ekranı (SCREEN_WIDATA_PINH, SCREEN_HEIGHT, & Wire, -1); AD9833 gen (FNC_PIN);
Daha sonra, setup () fonksiyonumuz var, bu kurulum fonksiyonunda, hata ayıklama için Seri'yi etkinleştirerek başlıyoruz. AD9833 modülünü begin () metodu yardımıyla başlatıyoruz. Ardından, atanan tüm döner kodlayıcı pinlerini Input olarak ayarladık. Ve clock pininin değerini clockPinState değişkeninde saklarız, bu döner kodlayıcı için gerekli bir adımdır.
Daha sonra tüm buton pinlerini input olarak ayarlayıp display.begin () metodu yardımıyla OLED ekranını etkinleştiriyoruz ve ayrıca if ifadesiyle herhangi bir hata olup olmadığını kontrol ediyoruz. Bu yapıldığında, ekranı temizler ve bir başlangıç açılış ekranı yazdırırız, açılış ekranı için de gecikme olan 2 saniyelik bir gecikme ekleriz ve son olarak ekranı temizleyen ve güncelleyen update_display () işlevini çağırırız. bir kez daha görüntüleyin. Update_display () yönteminin ayrıntıları makalenin ilerleyen bölümlerinde ele alınacaktır.
geçersiz kurulum () {Serial.begin (9600); // Serial @ 9600 baud gen.Begin (); // Bu, AD9833 nesnesi pinMode (CLK_PIN, INPUT) bildirildikten sonraki ilk komut OLMALIDIR; // Pinleri giriş pinMode (DATA_PIN, INPUT) olarak ayarlama; pinMode (BTN_PIN, INPUT_PULLUP); clockPinState = digitalRead (CLK_PIN); pinMode (SET_FREQUENCY_HZ, INPUT); // Pinleri giriş pinMode olarak ayarlama (SET_FREQUENCY_KHZ, INPUT); pinMode (SET_FREQUENCY_MHZ, INPUT); pinMode (ENABLE_DISABLE_OUTPUT_PIN, INPUT); if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// 128x64 Serial.println için 0x3D adresi (F ("SSD1306 tahsisi başarısız oldu")); için (;;); } display.clearDisplay (); // Ekranı temizleyin display.setTextSize (2); // Metin Boyutunu Ayarla display.setTextColor (WHITE); // LCD Renkli gösterimi ayarlayın. setCursor (30, 0); // İmleç Konumunu Ayarla display.println ("AD9833"); // Bu Metin görüntüsünü yazdırın.setCursor (17, 20); // İmleç Konumunu Ayarla display.println ("Function"); // Bu Metni yazdırın display.setCursor (13, 40); // İmleç Konumunu Ayarla display.println ("Oluşturucu"); // Bu Metni yazdırın display.display (); // Görüntü gecikmesini güncelleyin (2000); // 2 SEC update_display () gecikmesi; // update_display İşlevini çağırın}
Daha sonra, loop () fonksiyonumuz var, tüm ana fonksiyonlar loop bölümünde yazılmıştır.
İlk olarak Rotary kodlayıcının Clock pinini okuyoruz ve daha önce ilan ettiğimiz clockPin değişkeninde saklıyoruz. Daha sonra if ifadesinde, pinin önceki değeri ile pinin mevcut değerinin benzer olup olmadığını kontrol ediyoruz ve ayrıca pinin mevcut değerini de kontrol ediyoruz. Hepsi doğruysa, veri pinini kontrol ederiz, eğer doğruysa bu, kodlayıcının saat yönünün tersine döndüğü anlamına gelir ve sayaç değerini counter-- komutunun yardımıyla düşürürüz. Aksi takdirde counter ++ komutuyla sayaç değerini artırırız. Son olarak, minimum değeri 1 olarak ayarlamak için başka bir if ifadesi koyuyoruz. Ardından, clockPinState'i mevcut clockPin ile güncelliyoruz.gelecekteki kullanım için değer.
geçersiz döngü () {clockPin = digitalRead (CLK_PIN); if (clockPin! = clockPinState && clockPin == 1) {if (digitalRead (DATA_PIN)! = clockPin) {counter -; } else {counter ++; // Kodlayıcı CW'yi döndürüyor, bu yüzden artırın} if (counter <1) counter = 1; Serial.println (sayaç); update_display (); }
Ardından, bir düğmeye basmayı algılamak için kodumuz var. Bu bölümde, kodlayıcının içindeki butonu bazı iç içe geçmiş if ifadeleri yardımıyla tespit ettik, if (digitalRead (BTN_PIN) == LOW && millis () - time> denounce), bu ifadede önce düğmenin olup olmadığını kontrol ediyoruz pin düşük ya da düşük, düşükse basılır. Sonra tekrar geri tepme gecikmesi ile zamanlayıcı değerini kontrol ederiz, eğer her iki ifade de doğruysa, başarılı bir düğme basma eylemi ilan ederiz, eğer öyleyse, enkoder_btn_count değerini artırırız. Daha sonra, maksimum sayaç değerini 2'ye ayarlamak için başka bir if ifadesi açıklıyoruz, buna ihtiyacımız var çünkü çıkış dalga formunu ayarlamak için kullanıyoruz .Ardışık üç if ifadesi bunu yapar, değer sıfırsa, sinüs dalga formu seçilir, bir ise kare dalgadır ve değer 2 ise üçgen bir dalgadır. Bu if ifadelerinin üçünde de ekranı update_display () işleviyle güncelliyoruz . Ve son olarak, zaman değişkenini mevcut zamanlayıcı sayaç değeriyle güncelliyoruz.
// Bir DÜŞÜK sinyal tespit edersek, düğmeye basılırsa (digitalRead (BTN_PIN) == LOW && millis () - time> debounce) {encoder_btn_count ++; // if (encoder_btn_count> 2) değerlerini artırın // değer 2'den büyükse 0'a sıfırlayın {encoder_btn_count = 0; } if (encoder_btn_count == 0) {// değer 0 ise sinüs dalgası seçilir waveSelect = "SIN"; // dize değişkenini sin değeriyle güncelleyin update_display (); // ekranı güncelleyin} if (encoder_btn_count == 1) {// değer 1 kare dalga seçiliyse waveSelect = "SQR"; // dize değişkenini SQR değeriyle güncelleyin update_display (); // ekranı güncelleyin} if (encoder_btn_count == 2) {// değer 1 ise Üçgen dalga seçilir waveSelect = "TRI"; // dize değişkenini TRI değeriyle güncelleyin update_display ();// görüntüyü güncelle} time = millis (); // zaman değişkenini güncelleyin}
Daha sonra, tüm düğmeleri bir geri çevrilme gecikmesi ile ayarlamak için gerekli olan tüm gerekli kodu tanımlarız. Düğmeler Arduino'nun analog pinlerine bağlandığından, analog okuma değeri 30'un altına düştüğünde bir düğmeye basmayı tanımlamak için analog okuma komutunu kullanıyoruz, ardından başarılı bir düğmeye basıldığını tespit ediyoruz ve 200 msn gerçek bir düğmeye basılması veya yalnızca bir gürültü olup olmadığını kontrol edin. Bu ifade doğruysa, boole değişkenlerini işlev üretecinin Hz, Khz ve Mhz değerlerini ayarlamak için kullanılan değerlerle atarız. Daha sonra, ekranı güncelliyoruz ve zaman değişkenini güncelliyoruz. Bunu Arduino ile bağlantılı dört düğmenin tümü için yapıyoruz.
eğer (analogRead (SET_FREQUENCY_HZ) <30 && millis () - zaman> geri çevrilme) {set_frequency_hz = 1; // boole değerlerini güncelle set_frequency_khz = 0; set_frequency_mhz = 0; update_display (); // gösterim zamanını güncelle = milis (); // zaman değişkenini güncelle} if (analogRead (SET_FREQUENCY_KHZ) <30 && millis () - zaman> debounce) {set_frequency_hz = 0; // boole değerlerini güncelle set_frequency_khz = 1; set_frequency_mhz = 0; moduleFrequency = sayaç * 1000; update_display (); // görüntüleme zamanını güncelle = milis (); // zaman değişkenini güncelle} if (analogRead (SET_FREQUENCY_MHZ) <30 && millis () - time> debounce) {// geri çevrilme gecikmeli analog pini kontrol et set_frequency_hz = 0; // boole değerlerini güncelle set_frequency_khz = 0; set_frequency_mhz = 1; moduleFrequency = sayaç * 1000000; update_display ();// gösterim zamanını güncelle = millis (); // zaman değişkenini güncelle} if (analogRead (ENABLE_DISABLE_OUTPUT_PIN) <30 && millis () - zaman> debounce) {// analog pini hata bildirme gecikmesi ile kontrol et btn_state =! btn_state; // Düğme durumunu tersine çevirin gen.EnableOutput (btn_state); // Düğme durumuna bağlı olarak işlev oluşturucunun çıkışını etkinleştirin / devre dışı bırakın update_display (); // görüntüleme süresini güncelleyin = milis (); // zaman değişkenini güncelleyin}}// zaman değişkenini güncelleyin}}// zaman değişkenini güncelleyin}}
Son olarak, update_display () fonksiyonumuz var. Bu işlevde, bu ekranı güncellemekten çok daha fazlasını yaptık çünkü ekranın belirli bir kısmı OLED'de güncellenemez. Güncellemek için yeni değerlerle yeniden boyamanız gerekir. Bu, kodlama sürecini çok daha zor hale getirir.
Bu işlevin içinde ekranı temizleyerek başlıyoruz. Ardından, gerekli metin boyutumuzu ayarlıyoruz. Daha sonra imlecimizi ve yazdırılan Fonksiyon Üreticimizi display.println ("Function Function") ile ayarlıyoruz ; komut. Display.setCursor (0, 20) fonksiyonu yardımıyla yine metin boyutunu 2 ve imleci (0,20) olarak ayarladık.
Bu, hangi dalga için bilgileri yazdırdığımız yerdir.
display.clearDisplay (); // Öncelikle display.setTextSize (1) öğesini temizleyin; // metin boyutunu ayarla display.setCursor (10, 0); // İmleç konumunu ayarlayın display.println ("Function Generator"); // metni yazdırın display.setTextSize (2); // metin boyutunu ayarla display.setCursor (0, 20); // İmleç konumunu ayarla
Daha sonra, boole değişkenlerini frekans ayrıntıları için kontrol edip moduleFrequency değişkenindeki değeri güncelliyoruz. Bunu Hz, kHz ve MHz değerleri için yapıyoruz. Ardından, waveSelect değişkenini kontrol edip hangi dalganın seçildiğini tespit ediyoruz. Şimdi, dalga tipini ve frekansını ayarlayacak değerlere sahibiz.
if (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {// Hz'de frekansı ayarlamak için düğmeye basılıp basılmadığını kontrol edin moduleFrequency = counter; // moduleFrequency değişkenini geçerli sayaç değeriyle güncelleyin} if (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {// KHz'de frekansı ayarlamak için düğmeye basılıp basılmadığını kontrol edin moduleFrequency = counter * 1000; // moduleFrequency değişkenini mevcut sayaç değeriyle güncelleyin, ancak KHZ'de ayarlamak için 1000'i çarpıyoruz} if (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {// MHz'de frekansı ayarlamak için düğmeye basılıp basılmadığını kontrol edin modül = sayaç * 1000000; eğer (moduleFrequency> 12000000) {moduleFrequency = 12000000;// frekansın 12Mhz sayacı = 12 olduğundan daha büyük olmasına izin vermeyin; }} if (waveSelect == "SIN") {// Sinüs dalgası seçilir display.println ("SIN"); gen.ApplySignal (SINE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "SQR") {// Sqr dalgası seçilir display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Üç dalga seçilir display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // AD9833 modülünü güncelleyin. Serial.println (moduleFrequency); }} if (waveSelect == "SQR") {// Sqr dalgası seçilir display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Üç dalga seçilir display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // AD9833 modülünü güncelleyin. Serial.println (moduleFrequency); }} if (waveSelect == "SQR") {// Sqr dalgası seçilir display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Üç dalga seçilir display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // AD9833 modülünü güncelleyin. Serial.println (moduleFrequency); }
İmleci tekrar ayarlayıp sayaç değerlerini güncelliyoruz. Yine ekrandaki frekans aralığını güncellemek için boole'yi kontrol ediyoruz, bunu yapmak zorundayız çünkü OLED'in çalışma prensibi çok garip.
display.setCursor (45, 20); display.println (sayaç); // sayaç bilgilerini ekranda yazdırın. eğer (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Hz"); // display.display () ekranında Hz yazdırın; // tüm set görüntüyü güncellediğinde} if (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Khz"); display.display (); // tüm set görüntüyü güncellediğinde} if (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {display.setCursor (90, 20); display.println ("Mhz"); display.display (); // tüm setler ekranı güncellediğinde}
Ardından, çıktıyı OLED'e açık / kapalı olarak yazdırmak için düğmeye basma değişkenini kontrol ediyoruz. Yine OLED modülü nedeniyle bunun yapılması gerekiyor.
eğer (btn_state) {display.setTextSize (1); display.setCursor (65, 45); display.print ("Çıktı AÇIK"); // çıktıyı display.display () üzerine yazdır; display.setTextSize (2); } else {display.setTextSize (1); display.setCursor (65, 45); display.print ("Çıktı KAPALI"); // çıktıyı display.display () 'e yazdırın; display.setTextSize (2); }
Bu, kodlama sürecimizin sonunu işaret ediyor. Bu noktada kafanız karışırsa, daha fazla anlamak için koddaki yorumları kontrol edebilirsiniz.
AD9833 Tabanlı Fonksiyon Üreticiyi Test Etme
Devreyi test etmek için yukarıdaki kurulum kullanılır. Gördüğünüz gibi DC varil jakına 12V DC güç adaptörü bağladık ve Hantek Osiloskobu devrenin çıkışına bağladık. Çıkış frekansını görselleştirmek ve ölçmek için osiloskopu dizüstü bilgisayara da bağladık.
Bu yapıldıktan sonra döner kodlayıcı yardımıyla çıkış frekansını 5Khz olarak ayarladık ve çıkış sinüs dalgasını test ettik ve emin olun ki çıkışta 5Khz sinüs dalgası oluyor.
Daha sonra, çıkış dalga formunu üçgen bir dalga olarak değiştirdik, ancak frekans aynı kaldı, çıkış dalga formu aşağıda gösterilmiştir.
Sonra çıktıyı kare dalgaya değiştirdik ve çıktıyı gözlemledik ve bu mükemmel bir kare dalgaydı.
Ayrıca frekans aralıklarını değiştirdik ve çıkışı test ettik ve iyi çalışıyordu.
Diğer Geliştirmeler
Bu devre yalnızca konseptin bir kanıtıdır ve daha fazla geliştirmeye ihtiyaç duyar. Öncelikle, çıkış için kaliteli bir PCB'ye ve bazı kaliteli BNC konektörüne ihtiyacımız var, aksi takdirde daha yüksek bir frekans elde edemeyiz. Modülün genliği çok düşük, bu yüzden bunu geliştirmek için çıkış voltajını yükseltmek için bazı op-amp devrelerine ihtiyacımız var. Çıkış genliğini değiştirmek için bir potansiyometre bağlanabilir. Sinyali dengelemek için bir anahtar bağlanabilir; bu aynı zamanda sahip olunması gereken bir özelliktir. Ve dahası, kod biraz hatalı olduğu için çok fazla iyileştirmeye ihtiyaç duyar. Son olarak, OLED ekranların değiştirilmesi gerekir, aksi takdirde kolayca anlaşılabilir kod yazmak imkansızdır.
Bu eğitimin sonunu işaret ediyor, umarım makaleyi beğenmiş ve yeni bir şeyler öğrenmişsindir. Makale ile ilgili herhangi bir sorunuz varsa aşağıdaki yorum bölümüne bırakabilir veya Elektronik Forumumuzu kullanabilirsiniz.