Atmel mikrodenetleyici üzerindeki dds üretecinin şematik diyagramı. Plc'de fonksiyonel dds üreteci. Montajdan sonra jeneratör çalışma modlarının testi

Atmel mikrodenetleyici üzerindeki dds üretecinin şematik diyagramı.  Plc'de fonksiyonel dds üreteci.  Montajdan sonra jeneratör çalışma modlarının testi
Atmel mikrodenetleyici üzerindeki dds üretecinin şematik diyagramı. Plc'de fonksiyonel dds üreteci. Montajdan sonra jeneratör çalışma modlarının testi

Maksimum frekans - 65534 Hz ​​(ve kare dalga ile 8 MHz'e kadar HS çıkışı). Daha sonra jeneratörün FPGA'nın kendisini en iyi şekilde gösterebileceği mükemmel bir görev olduğunu düşündüm. Spor meselesi olarak, iki hafta sonu içinde son teslim tarihlerini karşılarken ve parametreleri kesin olarak tanımlanmamış, ancak mümkün olan maksimum değerde alırken projeyi FPGA üzerinde tekrarlamaya karar verdim. Bundan ne çıktığını kesimin altından öğrenebilirsiniz.

Sıfır gün

Hafta sonu gelmeden önce uygulama hakkında düşünmek için biraz zamanım oldu. Görevimi basitleştirmek için jeneratörü düğmeleri ve LCD ekranı olan ayrı bir cihaz olarak değil, USB üzerinden PC'ye bağlanan bir cihaz olarak yapmaya karar verdim. Bunun için bir USB2RS232 kartım var. Anakart sürücülere (CDC) ihtiyaç duymuyor, bu nedenle Linux altında çalışacağını düşünüyorum (bazıları için bu önemli). Ayrıca RS232 üzerinden mesaj alma konusunda zaten çalıştığımı saklamayacağım. Opencores.com'dan RS232 ile çalışmak için hazır modüller alacağım.

Sinüs dalgası sinyali oluşturmak için bir DAC'ye ihtiyacınız olacaktır. Orijinal projede olduğu gibi DAC tipini seçtim - R2R 8-bit. Megahertz mertebesinde yüksek frekanslarda çalışmanıza izin verecektir. FPGA'nın bununla başa çıkması gerektiğine inanıyorum

COM bağlantı noktası üzerinden veri aktarımı için nasıl bir program yazacağımı düşünüyordum. Bir yandan Delphi7'de yazabilirsiniz; zaten böyle bir program yazma deneyiminiz var ve ayrıca çalıştırılabilir dosyanın boyutu büyük olmayacak. Ayrıca bir html sayfasında Java betiği biçiminde Serial ile çalışacak bir şeyler çizmeye çalıştım, ancak bu az çok yalnızca Chrome seri API'si aracılığıyla çalıştı, ancak bunun için bir eklenti yüklemeniz gerekiyor... genel olarak , bu da söz konusu olamaz. PyQt5'i kendim için bir yenilik olarak denedim ama böyle bir projeyi dağıtırken bir sürü kütüphaneyi sürüklemeniz gerekiyor. Bir PyQt projesini bir exe dosyasına derlemeye çalıştığımda, 10 MB'tan fazla olduğu ortaya çıktı. Yani C++\Qt5 ile yazılmış bir uygulamadan daha iyi olmayacaktır. Python'da geliştirme deneyimim olmadığını da dikkate almakta fayda var, ancak Qt5'te deneyimim var. Bu nedenle seçim Qt5'e düştü. Beşinci versiyondan beri seri ile çalışmak için bir modül ortaya çıktı ve ben zaten onunla çalıştım. Ve Qt5 tabanlı bir uygulama Linux ve Mac'e aktarılabilir (bazıları için bu önemlidir) ve sürüm 5.2'den itibaren QWidgets tabanlı uygulamalar bir akıllı telefona bile aktarılabilir!

Başka ne gerekiyor? Doğal olarak kartın bir FPGA'sı var. Bende iki tane var (10 bin hücre için Cyclone iv EP4CE10E22C8N ve 5 bin hücre için Cyclone ii EP2C5). Soldaki konnektörü daha kullanışlı olduğu için seçeceğim. Hacim açısından projenin çok büyük olması planlanmıyor, dolayısıyla ikisinden birine sığacak. Hız olarak birbirlerinden farklı değiller. Her iki kartın da üzerinde 50 MHz osilatörler var ve FPGA'nın içinde frekansı planlanan 200 MHz'e çıkarabileceğim bir PLL var.

İlk gün

Zaten sentezleyici projemde DDS modülünü yapmış olduğum için hemen havyayı elime aldım ve DAC'yi dirençlerle lehimlemeye başladım. Bir prototip tahtası aldım. Kurulum ambalajlama kullanılarak yapıldı. Teknolojiyi etkileyen tek değişiklik, standları kalaylamak için kullanılan F38N asidini bırakıp TT gösterge akı jeli kullanmamdı. Teknolojinin özü basit: Rafları baskılı devre kartına lehimliyorum ve dirençleri baskılı devre kartı tarafından lehimliyorum. Eksik bağlantıları bükerek yapıyorum. Ayrıca raflar kullanışlı çünkü onları doğrudan FPGA kartına yerleştirebiliyorum.

Ne yazık ki evde 1 ve 2 kiloohm'luk dirençler yoktu. Mağazaya gidecek zaman yoktu. Kurallarımdan birinden vazgeçmek ve eski gereksiz tahtadaki dirençleri kaldırmak zorunda kaldım. Orada 15K ve 30K dirençler kullanıldı. Sonuç şu Frankenstein:


Projeyi oluşturduktan sonra hedef cihazı ayarlamanız gerekir: Menü Atamalar -> Cihaz


Projede kontrol edilemeyen ana DDS modülünü sabit bir frekansa kodladım.

1000 Hz Jeneratör Modülü

modül signal_generator(clk50M, signal_out); giriş kablosu clk50M; tel çıkış sinyali_çıkışı; tel clk200M; osc osc_200M reg akümülatörü; signal_out = toplayıcıyı ata; //1000 Hz üretmeye çalışın //50.000.000 Hz - harici jeneratörün saat frekansı //2^32 = 4.294.967.296 - DDS bit derinliği - 32 bit //1000Hz / 50.000.000 Hz / 2'ye bölün * 4294967296 => 42949, 67296 her zaman @ (posge clk50M) akümülatöre başlayın<= accumulator + 32"d42949; end endmodule


Daha sonra geliştirme ortamının projenin ana modülünde hangi giriş/çıkış hatlarının bulunduğunu ve bunların hangi fiziksel PIN'lere bağlı olduğunu sorması için "Derlemeyi Başlat"a tıkladım.Hemen hemen herkese bağlanabilirsiniz.Derleme sonrasında, görünen satırları çip FPGA'nın gerçek PIN'lerine atayın:

Menü öğesi Atamalar -> Pin Planlayıcı

Lütfen şimdilik HS_OUT, key0 ve key1 satırlarını dikkate almayın, projede daha sonra görünüyorlar ancak başlangıçta ekran görüntüsü almaya zamanım olmadı.

Prensip olarak, Konum sütununda yalnızca PIN_nn'yi "kaydetmek" yeterlidir ve geri kalan parametreler (G/Ç standardı, Geçerli Uzatma ve Dönüş Hızı) varsayılan olarak bırakılabilir veya PIN_nn'nin sunduğu parametrelerin aynılarını seçebilirsiniz. varsayılan (varsayılan), böylece "ov.

Karttaki konnektör numarasına hangi PIN'in karşılık geldiğini nasıl öğrenebilirim?

Konektör pin numaraları kartta işaretlenmiştir


Konektör kontaklarının bağlı olduğu FPGA pinleri ise FPGA kartıyla birlikte gelen belgelerde açıklanmaktadır.




Pinler atandıktan sonra projeyi tekrar derleyip USB programlayıcı kullanarak flashlıyorum. USB Byte blaster programlayıcı için sürücüleriniz kurulu değilse, Windows'a bunların Quartus'un kurulu olduğu klasörde bulunduğunu söyleyin. Daha sonra bunu kendisi bulacaktır.

Programlayıcının JTAG konektörüne bağlı olması gerekir. Ve programlama için menü öğesi “Araçlar -> Programcı”dır (veya araç çubuğundaki simgeye tıklayın). "Başlat" düğmesi, neşeli "Başarı" ve ürün yazılımı zaten FPGA'nin içindedir ve zaten çalışmaktadır. Sadece FPGA'yı kapatmayın, aksi takdirde her şeyi unutacaktır.

Araçlar -> Programcı


DAC, FPGA kartı konektörüne bağlanır. DAC çıkışına bir osiloskop S1-112A bağladım. Sonuç bir "testere" olmalıdır çünkü faz akümülatörünün DDS sözcüğünün yüksek dereceli kısmı 8 bitlik çıkışa verilir. Ve taşıncaya kadar daima artar.

Yaklaşık 1,5 saat ve 1000 Hz frekans için aşağıdaki osilogramı görüyorum:

“Testerenin” ortasında küçük bir kırık olduğunu belirtmek isterim. Bunun nedeni dirençlerin çeşitli değer aralıklarına sahip olmasıdır.

Açıklığa kavuşturulması gereken bir diğer önemli nokta, DDS jeneratörünün çalışacağı mümkün olan maksimum frekanstır. Doğru yapılandırılmış TimeQuest parametreleri ile “Derleme Raporu”nda derlendikten sonra devrenin hızının bir farkla 200 MHz'in üzerinde olduğunu görebilirsiniz. Bu da 50 MHz olan jeneratör frekansını PLL kullanarak 4 ile çarpacağım anlamına geliyor.DDS faz akümülatörünün değerini 200 MHz frekans ile arttıracağım. Bizim koşullarımızda elde edilebilecek son frekans aralığı 0 - 100 MHz'dir. Frekans ayar doğruluğu:

200.000.000 Hz (clk) / 2^32 (DDS) = 0,047 Hz
Yani ~0,05 Hz'den daha iyidir. Böyle bir çalışma frekansı aralığına (0...100 MHz) sahip bir jeneratör için bir hertz kesirinin doğruluğunun yeterli olduğunu düşünüyorum. Birisinin doğruluğu artırması gerekiyorsa, bunun için DDS bit derinliğini artırabilir (TimeQuest Zamanlama Analizörünü kontrol ederek mantık devresinin çalışma hızının CLK = 200 MHz dahilinde olduğunu kontrol etmeyi unutmayın, çünkü bu bir toplayıcıdır) veya basitçe Bu kadar geniş bir frekans aralığı gerekmiyorsa saat frekansını azaltın.

TimeQuest Zamanlama Analizörü


Ekranda “gördüm”ü gördükten sonra ailevi meseleler beni taşraya gitmeye zorladı (izin günümdü). Orada biçtim, pişirdim, mangal yaptım ve akşam beni bekleyen sürprizden habersizdim. Geceye yaklaştıkça yatmadan önce diğer frekanslar için sinyal şekline bakmaya karar verdim.

100 kHz frekansı için

250 kHz frekansı için

500 kHz frekansı için

1 MHz frekans için

İkinci gün

DAC'ın 100 ve 200 Ohm'luk dirençler üzerinde nasıl çalışacağının ilginç olması nedeniyle hemen havyayı elime aldım. Bu sefer DAC'nin daha doğru olduğu ortaya çıktı ve kurulumu daha az zaman aldı.

DAC'yi FPGA kartına yerleştirip osiloskopa bağlıyoruz

1 MHz kontrol ediliyor - VO! Bu tamamen farklı bir konu!

10 MHz'i gördüm

25 MHz'i gördüm


10 MHz testerenin şekli hala doğru olana benzer. Ancak 25 MHz'de artık hiç de "güzel" değil. Bununla birlikte, C1-112a'nın bant genişliği 10 MHz'dir, dolayısıyla bu durumda sebep zaten osiloskopta olabilir.

Prensip olarak DAC ile ilgili bu sorunun kapalı olduğu düşünülebilir. Şimdi yüksek hızlı çıkışın dalga biçimlerini alalım. Bunu yapmak için, en anlamlı biti FPGA'nın ayrı bir PIN'ine göndereceğiz. Bu satıra ait verileri DDS akümülatörünün en önemli bitinden alacağız.

hs_out = akümülatörü atayın;

Kare dalga 1 MHz

Kare dalga 5 MHz

Kare dalga 25 MHz

50 MHz kare dalga artık neredeyse görünmez


Ancak FPGA çıkışının dirençle yüklenmesi gerektiğini düşünüyorum. Belki cepheler daha dik olurdu.

Sinüs tabloya göre yapılır. Tablo boyutu 8 bitlik 256 değerdir. Daha fazlasını almak mümkün olabilirdi ama zaten hazır bir mif dosyam vardı. Sihirbazı kullanarak mif dosyasından sinüs tablosu verilerini içeren bir ROM öğesi oluşturuyoruz.

ROM Oluşturma - Araçlar -> Mega Sihirbazı Eklenti yöneticisi


1 bağlantı noktalı ROM'u seçin ve modüle bir ad verin

Katılıyoruz

Burada da aynı fikirdeyiz

Gözat'ı kullanarak mif dosyamızı sinüs tablosuyla buluyoruz

Burada da hiçbir şeyi değiştirmiyoruz.

sine_rom_bb.v modülünün işaretini kaldırın - buna gerek yoktur. Sonraki bitiş. Quartus sizden projeye bir modül eklemenizi isteyecek, kabul ediyoruz. Bundan sonra modül Verilog'daki diğer modüller gibi kullanılabilir.


DDS akümülatör kelimesinin üstteki 8 biti ROM adresi olarak kullanılacak ve veri çıkışı sinüs değeri olacaktır.

Kod

//sinüs rom teli sinüs_out; sine_rom sinüs1(.clock(clk200M), .address(akümülatör), .q(sine_out));


Farklı frekanslardaki sinüs dalgasının osilogramı... aynı görünür.

İstenirse direnç yayılmasıyla ilişkili DAC sorunlarını göz önünde bulundurabilirsiniz:

Neyse, hafta sonunun sonu. Ancak bilgisayardan kontrol için yazılım henüz yazılmadı. Planlanan son teslim tarihlerine uymadığımı itiraf etmek zorundayım.

Üçüncü gün

Çok az zamanımız var, bu yüzden programı aceleyle (en iyi geleneklere göre) yazıyoruz. Bazı yerlerde harf sayısını azaltmak ve klavyeden bilgi girme kolaylığı sağlamak için widget adına göre bir olay filtresi kullanılır. Lütfen anlayın ve affedin.

Arayüz

Analoglarla bağlantılar

Tam liste değil
Fonksiyonel DDS jeneratörü. AVR'ye dayalı olarak oluşturulmuştur. Frekanslar 0…65534 Hz.
DDS jeneratörü GK101'in incelemesi. Altera MAX240 FPGA kullanılarak oluşturulmuştur. 10 MHz'e kadar frekanslar.
PIC16F870 üzerinde çok işlevli jeneratör. Frekans aralığı: 11 Hz - 60 kHz.
jeneratörler Etiket ekle

Maksimum frekans - 65534 Hz ​​(ve kare dalga ile 8 MHz'e kadar HS çıkışı). Daha sonra jeneratörün FPGA'nın kendisini en iyi şekilde gösterebileceği mükemmel bir görev olduğunu düşündüm. Spor meselesi olarak, iki hafta sonu içinde son teslim tarihlerini karşılarken ve parametreleri kesin olarak tanımlanmamış, ancak mümkün olan maksimum değerde alırken projeyi FPGA üzerinde tekrarlamaya karar verdim. Bundan ne çıktığını kesimin altından öğrenebilirsiniz.

Sıfır gün

Hafta sonu gelmeden önce uygulama hakkında düşünmek için biraz zamanım oldu. Görevimi basitleştirmek için jeneratörü düğmeleri ve LCD ekranı olan ayrı bir cihaz olarak değil, USB üzerinden PC'ye bağlanan bir cihaz olarak yapmaya karar verdim. Bunun için bir USB2RS232 kartım var. Anakart sürücülere (CDC) ihtiyaç duymuyor, bu nedenle Linux altında çalışacağını düşünüyorum (bazıları için bu önemli). Ayrıca RS232 üzerinden mesaj alma konusunda zaten çalıştığımı saklamayacağım. Opencores.com'dan RS232 ile çalışmak için hazır modüller alacağım.

Sinüs dalgası sinyali oluşturmak için bir DAC'ye ihtiyacınız olacaktır. Orijinal projede olduğu gibi DAC tipini seçtim - R2R 8-bit. Megahertz mertebesinde yüksek frekanslarda çalışmanıza izin verecektir. FPGA'nın bununla başa çıkması gerektiğine inanıyorum

COM bağlantı noktası üzerinden veri aktarımı için nasıl bir program yazacağımı düşünüyordum. Bir yandan Delphi7'de yazabilirsiniz; zaten böyle bir program yazma deneyiminiz var ve ayrıca çalıştırılabilir dosyanın boyutu büyük olmayacak. Ayrıca bir html sayfasında Java betiği biçiminde Serial ile çalışacak bir şeyler çizmeye çalıştım, ancak bu az çok yalnızca Chrome seri API'si aracılığıyla çalıştı, ancak bunun için bir eklenti yüklemeniz gerekiyor... genel olarak , bu da söz konusu olamaz. PyQt5'i kendim için bir yenilik olarak denedim ama böyle bir projeyi dağıtırken bir sürü kütüphaneyi sürüklemeniz gerekiyor. Bir PyQt projesini bir exe dosyasına derlemeye çalıştığımda, 10 MB'tan fazla olduğu ortaya çıktı. Yani C++\Qt5 ile yazılmış bir uygulamadan daha iyi olmayacaktır. Python'da geliştirme deneyimim olmadığını da dikkate almakta fayda var, ancak Qt5'te deneyimim var. Bu nedenle seçim Qt5'e düştü. Beşinci versiyondan beri seri ile çalışmak için bir modül ortaya çıktı ve ben zaten onunla çalıştım. Ve Qt5 tabanlı bir uygulama Linux ve Mac'e aktarılabilir (bazıları için bu önemlidir) ve sürüm 5.2'den itibaren QWidgets tabanlı uygulamalar bir akıllı telefona bile aktarılabilir!

Başka ne gerekiyor? Doğal olarak kartın bir FPGA'sı var. Bende iki tane var (10 bin hücre için Cyclone iv EP4CE10E22C8N ve 5 bin hücre için Cyclone ii EP2C5). Soldaki konnektörü daha kullanışlı olduğu için seçeceğim. Hacim açısından projenin çok büyük olması planlanmıyor, dolayısıyla ikisinden birine sığacak. Hız olarak birbirlerinden farklı değiller. Her iki kartın da üzerinde 50 MHz osilatörler var ve FPGA'nın içinde frekansı planlanan 200 MHz'e çıkarabileceğim bir PLL var.

İlk gün

Zaten sentezleyici projemde DDS modülünü yapmış olduğum için hemen havyayı elime aldım ve DAC'yi dirençlerle lehimlemeye başladım. Bir prototip tahtası aldım. Kurulum kullanılarak yapıldı. Teknolojiyi etkileyen tek değişiklik, standları kalaylamak için kullanılan F38N asidini bırakıp TT gösterge akı jeli kullanmamdı. Teknolojinin özü basit: Rafları baskılı devre kartına lehimliyorum ve dirençleri baskılı devre kartı tarafından lehimliyorum. Eksik bağlantıları bükerek yapıyorum. Ayrıca raflar kullanışlı çünkü onları doğrudan FPGA kartına yerleştirebiliyorum.

Ne yazık ki evde 1 ve 2 kiloohm'luk dirençler yoktu. Mağazaya gidecek zaman yoktu. Kurallarımdan birinden vazgeçmek ve eski gereksiz tahtadaki dirençleri kaldırmak zorunda kaldım. Orada 15K ve 30K dirençler kullanıldı. Sonuç şu Frankenstein:


Projeyi oluşturduktan sonra hedef cihazı ayarlamanız gerekir: Menü Atamalar -> Cihaz


Projede kontrol edilemeyen ana DDS modülünü sabit bir frekansa kodladım.

1000 Hz Jeneratör Modülü

modül signal_generator(clk50M, signal_out); giriş kablosu clk50M; tel çıkış sinyali_çıkışı; tel clk200M; osc osc_200M reg akümülatörü; signal_out = toplayıcıyı ata; //1000 Hz üretmeye çalışın //50.000.000 Hz - harici jeneratörün saat frekansı //2^32 = 4.294.967.296 - DDS bit derinliği - 32 bit //1000Hz / 50.000.000 Hz / 2'ye bölün * 4294967296 => 42949, 67296 her zaman @ (posge clk50M) akümülatöre başlayın<= accumulator + 32"d42949; end endmodule


Daha sonra geliştirme ortamının projenin ana modülünde hangi giriş/çıkış hatlarının bulunduğunu ve bunların hangi fiziksel PIN'lere bağlı olduğunu sorması için "Derlemeyi Başlat"a tıkladım.Hemen hemen herkese bağlanabilirsiniz.Derleme sonrasında, görünen satırları çip FPGA'nın gerçek PIN'lerine atayın:

Menü öğesi Atamalar -> Pin Planlayıcı

Lütfen şimdilik HS_OUT, key0 ve key1 satırlarını dikkate almayın, projede daha sonra görünüyorlar ancak başlangıçta ekran görüntüsü almaya zamanım olmadı.

Prensip olarak, Konum sütununda yalnızca PIN_nn'yi "kaydetmek" yeterlidir ve geri kalan parametreler (G/Ç standardı, Geçerli Uzatma ve Dönüş Hızı) varsayılan olarak bırakılabilir veya PIN_nn'nin sunduğu parametrelerin aynılarını seçebilirsiniz. varsayılan (varsayılan), böylece "ov.

Karttaki konnektör numarasına hangi PIN'in karşılık geldiğini nasıl öğrenebilirim?

Konektör pin numaraları kartta işaretlenmiştir


Konektör kontaklarının bağlı olduğu FPGA pinleri ise FPGA kartıyla birlikte gelen belgelerde açıklanmaktadır.




Pinler atandıktan sonra projeyi tekrar derleyip USB programlayıcı kullanarak flashlıyorum. USB Byte blaster programlayıcı için sürücüleriniz kurulu değilse, Windows'a bunların Quartus'un kurulu olduğu klasörde bulunduğunu söyleyin. Daha sonra bunu kendisi bulacaktır.

Programlayıcının JTAG konektörüne bağlı olması gerekir. Ve programlama için menü öğesi “Araçlar -> Programcı”dır (veya araç çubuğundaki simgeye tıklayın). "Başlat" düğmesi, neşeli "Başarı" ve ürün yazılımı zaten FPGA'nin içindedir ve zaten çalışmaktadır. Sadece FPGA'yı kapatmayın, aksi takdirde her şeyi unutacaktır.

Araçlar -> Programcı


DAC, FPGA kartı konektörüne bağlanır. DAC çıkışına bir osiloskop S1-112A bağladım. Sonuç bir "testere" olmalıdır çünkü faz akümülatörünün DDS sözcüğünün yüksek dereceli kısmı 8 bitlik çıkışa verilir. Ve taşıncaya kadar daima artar.

Yaklaşık 1,5 saat ve 1000 Hz frekans için aşağıdaki osilogramı görüyorum:

“Testerenin” ortasında küçük bir kırık olduğunu belirtmek isterim. Bunun nedeni dirençlerin çeşitli değer aralıklarına sahip olmasıdır.

Açıklığa kavuşturulması gereken bir diğer önemli nokta, DDS jeneratörünün çalışacağı mümkün olan maksimum frekanstır. Doğru yapılandırılmış TimeQuest parametreleri ile “Derleme Raporu”nda derlendikten sonra devrenin hızının bir farkla 200 MHz'in üzerinde olduğunu görebilirsiniz. Bu da 50 MHz olan jeneratör frekansını PLL kullanarak 4 ile çarpacağım anlamına geliyor.DDS faz akümülatörünün değerini 200 MHz frekans ile arttıracağım. Bizim koşullarımızda elde edilebilecek son frekans aralığı 0 - 100 MHz'dir. Frekans ayar doğruluğu:

200.000.000 Hz (clk) / 2^32 (DDS) = 0,047 Hz
Yani ~0,05 Hz'den daha iyidir. Böyle bir çalışma frekansı aralığına (0...100 MHz) sahip bir jeneratör için bir hertz kesirinin doğruluğunun yeterli olduğunu düşünüyorum. Birisinin doğruluğu artırması gerekiyorsa, bunun için DDS bit derinliğini artırabilir (TimeQuest Zamanlama Analizörünü kontrol ederek mantık devresinin çalışma hızının CLK = 200 MHz dahilinde olduğunu kontrol etmeyi unutmayın, çünkü bu bir toplayıcıdır) veya basitçe Bu kadar geniş bir frekans aralığı gerekmiyorsa saat frekansını azaltın.

TimeQuest Zamanlama Analizörü


Ekranda “gördüm”ü gördükten sonra ailevi meseleler beni taşraya gitmeye zorladı (izin günümdü). Orada biçtim, pişirdim, mangal yaptım ve akşam beni bekleyen sürprizden habersizdim. Geceye yaklaştıkça yatmadan önce diğer frekanslar için sinyal şekline bakmaya karar verdim.

100 kHz frekansı için

250 kHz frekansı için

500 kHz frekansı için

1 MHz frekans için

İkinci gün

DAC'ın 100 ve 200 Ohm'luk dirençler üzerinde nasıl çalışacağının ilginç olması nedeniyle hemen havyayı elime aldım. Bu sefer DAC'nin daha doğru olduğu ortaya çıktı ve kurulumu daha az zaman aldı.

DAC'yi FPGA kartına yerleştirip osiloskopa bağlıyoruz

1 MHz kontrol ediliyor - VO! Bu tamamen farklı bir konu!

10 MHz'i gördüm

25 MHz'i gördüm


10 MHz testerenin şekli hala doğru olana benzer. Ancak 25 MHz'de artık hiç de "güzel" değil. Bununla birlikte, C1-112a'nın bant genişliği 10 MHz'dir, dolayısıyla bu durumda sebep zaten osiloskopta olabilir.

Prensip olarak DAC ile ilgili bu sorunun kapalı olduğu düşünülebilir. Şimdi yüksek hızlı çıkışın dalga biçimlerini alalım. Bunu yapmak için, en anlamlı biti FPGA'nın ayrı bir PIN'ine göndereceğiz. Bu satıra ait verileri DDS akümülatörünün en önemli bitinden alacağız.

hs_out = akümülatörü atayın;

Kare dalga 1 MHz

Kare dalga 5 MHz

Kare dalga 25 MHz

50 MHz kare dalga artık neredeyse görünmez


Ancak FPGA çıkışının dirençle yüklenmesi gerektiğini düşünüyorum. Belki cepheler daha dik olurdu.

Sinüs tabloya göre yapılır. Tablo boyutu 8 bitlik 256 değerdir. Daha fazlasını almak mümkün olabilirdi ama zaten hazır bir mif dosyam vardı. Sihirbazı kullanarak mif dosyasından sinüs tablosu verilerini içeren bir ROM öğesi oluşturuyoruz.

ROM Oluşturma - Araçlar -> Mega Sihirbazı Eklenti yöneticisi


1 bağlantı noktalı ROM'u seçin ve modüle bir ad verin

Katılıyoruz

Burada da aynı fikirdeyiz

Gözat'ı kullanarak mif dosyamızı sinüs tablosuyla buluyoruz

Burada da hiçbir şeyi değiştirmiyoruz.

sine_rom_bb.v modülünün işaretini kaldırın - buna gerek yoktur. Sonraki bitiş. Quartus sizden projeye bir modül eklemenizi isteyecek, kabul ediyoruz. Bundan sonra modül Verilog'daki diğer modüller gibi kullanılabilir.


DDS akümülatör kelimesinin üstteki 8 biti ROM adresi olarak kullanılacak ve veri çıkışı sinüs değeri olacaktır.

Kod

//sinüs rom teli sinüs_out; sine_rom sinüs1(.clock(clk200M), .address(akümülatör), .q(sine_out));


Farklı frekanslardaki sinüs dalgasının osilogramı... aynı görünür.

İstenirse direnç yayılmasıyla ilişkili DAC sorunlarını göz önünde bulundurabilirsiniz:

Neyse, hafta sonunun sonu. Ancak bilgisayardan kontrol için yazılım henüz yazılmadı. Planlanan son teslim tarihlerine uymadığımı itiraf etmek zorundayım.

Üçüncü gün

Çok az zamanımız var, bu yüzden programı aceleyle (en iyi geleneklere göre) yazıyoruz. Bazı yerlerde harf sayısını azaltmak ve klavyeden bilgi girme kolaylığı sağlamak için widget adına göre bir olay filtresi kullanılır. Lütfen anlayın ve affedin.

Arayüz

Analoglarla bağlantılar

Tam liste değil
Fonksiyonel DDS jeneratörü. AVR'ye dayalı olarak oluşturulmuştur. Frekanslar 0…65534 Hz.
DDS jeneratörü GK101'in incelemesi. Altera MAX240 FPGA kullanılarak oluşturulmuştur. 10 MHz'e kadar frekanslar.
PIC16F870 üzerinde çok işlevli jeneratör. Frekans aralığı: 11 Hz - 60 kHz.
jeneratörler
  • Qt5
  • Etiket ekle

    Herhangi bir ev atölyesinde gerekli alet ve ölçüm aletleri seti bulunmalıdır. Amatör radyoculuğu hobi olarak yapan insanlar için, gerekli ekipmanı satın almanın yüksek parasal maliyetleri genellikle kabul edilemez.

    Yani benim durumumda, bu ekipmanın listesi tam olmaktan uzaktı ve eksikti. sinyal üreteci.

    Sinyal üreteci Sonunda mevcut radyo unsurlarından kendinizi yaratmanın kolay olduğu ve pahalı olmadığı ortaya çıktı. Böylece, internette araştırma yaptıktan sonra, çeşitli jeneratörler için, DAC'li daha gelişmiş modeller de dahil olmak üzere, ancak üretimi zaten pahalı olan çok sayıda devre buldum. Başlangıç ​​olarak basit olanda durdum. DDS sinyal üreteci Atmel'in ATMEGA8 mikrokontrolcüsü üzerinde. Bunda hiçbir şeyi iyileştirmedim veya değiştirmedim - her şeyi olduğu gibi bıraktım, sadece bir kopya oluşturdum ve özellikle bu cihazın yazarlığını iddia etmiyorum.

    Bu yüzden, sinyal üreteci iyi özelliklere sahiptir ve basit problemleri çözmeye uygundur.

    Bilgilerin görüntülenmesi sinyal üreteci HD44780 denetleyiciye sahip 16x2 karakterli LCD ekranda üretilmiştir. Mikrodenetleyici bağlantı noktalarından tasarruf etmek için LCD ekranın yalnızca üç kabloyla kontrol edilmesi dikkat çekicidir; bu, bir kaydırma yazmacı kullanılarak elde edildi - bir ekranın üç kabloyla nasıl bağlanacağını okuyun.

    Bağlantı noktalarını kaydetmek gereklidir, dirençli bir DAC için 8 bağlantı noktası, düğmeler için 7 bağlantı noktası kullanılır. Orijinal makalede yazar PWM modülasyonunu kullanacağına söz verdi, ancak ATMEGA16'da daha gelişmiş bir sürüm geliştirmeye başladığı için görünüşe göre bunu bitirmedi.

    Bir DDS sinyal üretecinin şematik diyagramı ve baskılı devre kartı.

    Devre ve kartlar orijinalde gösterilmiştir; ayrıca yazar tarafından kullanılmayan PWM kontrolü için düğmeler içerirler.

    DAC için özellikle ±%0,05 hatayla hassas dirençler aldım, ancak ortaya çıktığı gibi ±%5 hatayla basit dirençler oldukça yeterli. Dalga biçimi tüm sinyal türleri için oldukça kabul edilebilirdi.

    Ne zaman jeneratör birleştirildiğinde ve program mikro denetleyiciye yüklendiğinde, ekran kontrastını ayarlamadığınız sürece hiçbir ayar yapılmasına gerek yoktur.

    Cihazla çalışmak basittir - sinyal şeklini seçin, gerekli frekansı ayarlayın ve frekans ayar adımını adım başına 1 - 10 - 100 - 1000 Hz limitleriyle değiştirebilirsiniz. Daha sonra Başlat'a tıklayın ve jeneratör çalışmaya başlar. Jeneratör çalıştırıldığında sinyalin frekansının ve şeklinin değiştirilemeyeceği, bunun nedeninin programın sonsuz bir döngüye girmesi ve maksimum üretim frekansını arttırmak için düğme yoklama prosedürünün uygulanması olduğu unutulmamalıdır. kaldırılması gerekiyordu. Oluşturmayı durdurmak için durdur/sıfırla seçeneğine tıklayın; bu, programı yeniden başlatır ve ayarlar menüsüne geri döner. İşte nüans.

    Ayrıca jeneratör mahfazasının imalatından da bahsetmek istiyorum. Bir mağazadan hazır bir kasa satın alabilir veya başka bir cihazdan uygun bir kasa kullanabilirsiniz, ancak ben bunu tamamen kendim yapmaya karar verdim. Vücuda bağışladığım çift taraflı cam elyafından bir parça boşta duruyordu.

    Öncelikle LCD ekranın ve sinyal üreteci kartının, güç kaynağının, konnektörlerin ve butonların ölçülerini, boyutlarını alıp kasanın içinde olacak şekilde bir kağıt üzerine yerleştirmeniz gerekiyor. Elde edilen ölçülere göre imalata başlayabilirsiniz.

    Bu proje, devrenin bazı karmaşıklığına rağmen, en azından daha basit olanlarla karşılaştırıldığında çok geniş bir işlevselliğe sahip olan ve montaj maliyetini haklı çıkaran yüksek kaliteli ve evrensel bir fonksiyon üretecidir. 9 farklı dalga formu üretebilme kapasitesine sahip olup aynı zamanda darbe senkronizasyonu ile çalışmaktadır.

    MK'deki jeneratörün şematik diyagramı

    Cihaz ayarları

    • Frekans aralığı: 10 Hz - 60 kHz
    • 3 farklı adımda dijital frekans ayarı
    • Dalga formları: Sinüs, Üçgen, Kare, Testere, H-pulse, L-pulse, Burst, Sweep, Noise
    • Çıkış aralığı: Sinüs ve üçgen için 15V, diğer modlar için 0-5V
    • Darbe senkronizasyonu için bir çıkış var

    Cihaz, iki kutuplu bir 15 V devre oluşturan 78L15 ve 79L15'in normal çalışması için gerekli olan yeterince yüksek (18 V'un üzerinde) DC voltajını sağlayan 12 volt AC'den güç alır.Bu, LF353 mikro devresinin çıkış yapabilmesi için yapılır. 1 kOhm yüke kadar tam sinyal aralığı.

    Seviye kontrol cihazı ALPS SRBM1L0800'ü kullandı. Devre ±%1 toleranslı veya daha iyi dirençler kullanmalıdır. LED akım sınırlayıcıları - 4306R serisi dirençler. Sanatçının tercihine bağlı olarak parlaklık artırılabilir. Jeneratör, alüminyum ön ve arka panellere sahip 178x154x36 mm plastik bir kasaya monte edilmiştir.

    Birçok kontak bileşeni ön ve arka panellere monte edilmiştir (düğmeler, düğmeler, RCA konektörleri, LED düzenekleri, güç konektörü). Baskılı devre kartları mahfazaya plastik ara parçaları olan cıvatalarla tutturulur. Jeneratörün diğer tüm elemanları baskılı devre kartlarına monte edilmiştir - güç kaynağı ayrıdır. Ortadaki sol tuş modu değiştirmek, sağ tuş ise mod frekansını seçmek içindir.

    Jeneratör çeşitli sinyaller üretir ve "Seç" tuşu kullanılarak seçilen ve üstteki (şemada) üç LED ile gösterilen üç modda çalışır. Döner kontrol, sinyal parametrelerini aşağıdaki tabloya göre değiştirir:

    Mod 1'e ayarlandıktan hemen sonra sinüs oluşumu meydana gelir. Ancak başlangıç ​​frekansı oldukça düşüktür ve bunu arttırmak için kodlayıcının en az bir tıklaması gerekir. Kartta, cihazı programlama için bağlamak için bir kontak bulunur; bu, gerekirse sinyal üretecinin işlevselliğini hızlı bir şekilde değiştirmenize olanak tanır. Tüm proje dosyaları - PIC16F870 ürün yazılımı, kart çizimleri

    Sinyallerin bu DDS fonksiyon üreteci (versiyon 2.0) bir AVR mikro denetleyicisine monte edilmiştir, iyi işlevselliğe sahiptir, genlik kontrolüne sahiptir ve ayrıca tek taraflı bir baskılı devre kartı üzerine monte edilmiştir.

    Bu jeneratör, Jesper DDS jeneratör algoritmasını temel alır; program, montaj kodu ekleriyle AVR-GCC C için modernize edilmiştir. Jeneratörün iki çıkış sinyali vardır: birincisi DDS sinyalleridir, ikincisi yüksek hızlı (1..8 MHz) "dikdörtgen" çıkıştır ve bu, MK'yi yanlış tüylerle ve başka amaçlarla canlandırmak için kullanılabilir.
    Yüksek hızlı HS (Yüksek Hız) sinyali doğrudan Atmega16 OC1A (PD5) mikro denetleyicisinden alınır.
    DDS sinyalleri, dirençli bir R2R matrisi aracılığıyla ve sinyal genliğinin ve ofsetinin ayarlanmasına olanak tanıyan LM358N yongası aracılığıyla diğer MC çıkışlarından üretilir. Ofset ve genlik iki potansiyometre kullanılarak ayarlanır. Ofset +5V..-5V aralığında ayarlanabilir ve genlik 0...10V'dir. DDS sinyallerinin frekansı 0... 65534 Hz ​​aralığında ayarlanabilir; bu, ses devrelerini ve diğer amatör radyo görevlerini test etmek için fazlasıyla yeterlidir.

    DDS jeneratörü V2.0'ın ana özellikleri:
    - yaygın ve ucuz radyo elemanlarına sahip basit bir devre;
    - tek taraflı baskılı devre kartı;
    - dahili güç kaynağı;
    - 8 MHz'e kadar ayrı yüksek hızlı çıkış (HS);
    - Değişken genlik ve ofset ile DDS sinyalleri;
    - DDS sinyalleri: sinüs, dikdörtgen, testere ve ters testere, üçgen, EKG sinyali ve gürültü sinyali;
    - 2×16 LCD ekran;
    - sezgisel 5 düğmeli klavye;
    - frekans ayarlama adımları: 1, 10, 100, 1000, 10000 Hz;
    - gücü açtıktan sonraki son durumu hatırlamak.

    Aşağıdaki blok diyagram bir fonksiyon oluşturucunun mantıksal yapısını göstermektedir:

    Gördüğünüz gibi cihaz birkaç besleme voltajına ihtiyaç duyuyor: +5V, -12V, +12V. +12V ve -12V voltajları sinyal genliğini ve ofsetini düzenlemek için kullanılır. Güç kaynağı, bir transformatör ve birkaç voltaj dengeleyici yonga kullanılarak tasarlanmıştır:

    Güç kaynağı ayrı bir karta monte edilmiştir:

    Güç kaynağını kendiniz monte etmek istemiyorsanız, gerekli tüm voltajların zaten mevcut olduğu bir bilgisayardan normal bir ATX güç kaynağı kullanabilirsiniz. ATX konnektör düzeni.

    LCD ekran

    Tüm eylemler LCD ekran aracılığıyla görüntülenir. Jeneratör beş tuşla kontrol edilir

    Yukarı/aşağı tuşları menüde gezinmek için, sol/sağ tuşları ise frekans değerini değiştirmek için kullanılır. Orta tuşa basıldığında seçilen sinyal üretilmeye başlar. Tuşa tekrar basıldığında jeneratör durdurulur.

    Frekans değişim adımını ayarlamak için ayrı bir değer sağlanır. Frekansı geniş bir aralıkta değiştirmeniz gerekiyorsa bu kullanışlıdır.

    Gürültü üretecinin herhangi bir ayarı yoktur. Sürekli olarak DDS üretecinin çıkışına beslenen olağan Rand() fonksiyonunu kullanır.

    HS yüksek hızlı çıkışının 4 frekans modu vardır: 1, 2, 4 ve 8 MHz.

    Şematik diyagram

    Fonksiyon üreteci devresi basittir ve kolayca erişilebilen öğeler içerir:
    - 16 MHz'de harici kuvarslı AVR Atmega16 mikro denetleyici;
    - standart HD44780 tipi LCD ekran 2×16;
    - Sıradan dirençlerden yapılmış R2R DAC matrisi;
    - işlemsel amplifikatör LM358N (KR1040UD1'in yerli analogu);
    - iki potansiyometre;
    - beş anahtar;
    - birkaç konektör.

    Ödemek:

    Fonksiyonel jeneratör plastik bir kutuya monte edilmiştir:


    Yazılım

    Yukarıda da söylediğim gibi programımı Jesper DDS üreteç algoritması üzerine kurdum. Üretim durdurmayı uygulamak için birkaç satır montaj kodu ekledim. Artık algoritma 9 yerine 10 CPU döngüsü içeriyor.

    void statik satır içi Signal_OUT(const uint8_t *signal, uint8_t ad2, uint8_t ad1, uint8_t ad0)(
    asm volatile("eor r18, r18 ;r18<-0″ "\n\t"
    "veya r19, r19 ;r19<-0″ "\n\t"
    "1:" "\n\t"
    "r18 ekle, %0 ;1 çevrim" "\n\t"
    "adc r19, %1 ;1 çevrim" "\n\t"
    "adc %A3, %2 ;1 çevrim" "\n\t"
    "lpm ;3 döngü" "\n\t"
    "out %4, __tmp_reg__ ;1 döngü" "\n\t"
    "sbis %5, 2 ;1 döngü, eğer atlama yoksa" "\n\t"
    "rjmp 1b ;2 döngü. Toplam 10 döngü" "\n\t"
    :
    :"r" (ad0),"r" (ad1),"r" (ad2),,"e" (sinyal),,"I" (_SFR_IO_ADDR(PORTA)), "I" (_SFR_IO_ADDR(SPCR) ))
    :"r18", "r19"
    );}

    DDS sinyal formlarının tablosu, adresi 0xXX00 ile başlayan MK'nin flash belleğinde bulunur. Bu bölümler makefile'da uygun hafıza konumlarında tanımlanmıştır:
    #Sinyal tablolarının saklanacağı bölümleri tanımlayın
    LDFLAGS += -Wl,-section-start=.MySection1=0x3A00
    LDFLAGS += -Wl,-section-start=.MySection2=0x3B00
    LDFLAGS += -Wl,-section-start=.MySection3=0x3C00
    LDFLAGS += -Wl,-section-start=.MySection4=0x3D00
    LDFLAGS += -Wl,-section-start=.MySection5=0x3E00
    LDFLAGS += -Wl,-section-start=.MySection6=0x3F00