Diagram skema generator dds pada mikrokontroler atmel. Generator dds fungsional di plc. Uji mode operasi generator setelah perakitan

Diagram skema generator dds pada mikrokontroler atmel.  Generator dds fungsional di plc.  Uji mode operasi generator setelah perakitan
Diagram skema generator dds pada mikrokontroler atmel. Generator dds fungsional di plc. Uji mode operasi generator setelah perakitan

Frekuensi maksimum - 65534 Hz ​​(dan output HS hingga 8 MHz dengan gelombang persegi). Dan kemudian saya berpikir bahwa generator adalah tugas yang sangat baik di mana FPGA dapat menunjukkan performa terbaiknya. Dari segi olahraga, saya memutuskan untuk mengulangi proyek di FPGA, sambil memenuhi tenggat waktu dalam dua akhir pekan, dan mendapatkan parameter yang tidak ditentukan secara ketat, tetapi semaksimal mungkin. Anda dapat mengetahui apa yang dihasilkan dari pemotongan ini.

Hari nol

Sebelum akhir pekan tiba, saya punya waktu untuk memikirkan implementasinya. Untuk mempermudah tugas saya, saya memutuskan untuk menjadikan generator bukan sebagai perangkat terpisah dengan tombol dan layar LCD, tetapi sebagai perangkat yang terhubung ke PC melalui USB. Untuk ini saya memiliki papan USB2RS232. Papan ini tidak memerlukan driver (CDC), oleh karena itu, menurut saya ini akan berfungsi di Linux (bagi sebagian orang, ini penting). Selain itu, saya tidak akan menyembunyikan bahwa saya telah bekerja menerima pesan melalui RS232. Saya akan mengambil modul siap pakai untuk bekerja dengan RS232 dari opencores.com.

Untuk menghasilkan sinyal gelombang sinus Anda memerlukan DAC. Saya memilih tipe DAC, seperti pada proyek aslinya - R2R 8-bit. Ini akan memungkinkan Anda untuk beroperasi pada frekuensi tinggi, pada urutan megahertz. Saya yakin FPGA harus mengatasi hal ini

Saya sedang memikirkan cara menulis program untuk mengirimkan data melalui port COM. Di satu sisi, Anda dapat menulis di Delphi7, Anda sudah memiliki pengalaman menulis program seperti itu, dan selain itu, ukuran file yang dapat dieksekusi tidak akan besar. Saya juga mencoba membuat sketsa sesuatu untuk bekerja dengan Serial dalam bentuk skrip java di halaman html, tetapi kurang lebih hanya berfungsi melalui API serial Chrome, tetapi untuk ini Anda perlu menginstal plugin... secara umum , itu juga tidak mungkin. Saya mencoba PyQt5 sebagai inovasi untuk diri saya sendiri, tetapi ketika mendistribusikan proyek semacam itu, Anda perlu menyeret banyak perpustakaan. Setelah mencoba mengkompilasi proyek PyQt menjadi file exe, ternyata ukurannya lebih dari 10 MB. Artinya, ini tidak lebih baik dari aplikasi yang ditulis dalam C++\Qt5. Perlu juga dipertimbangkan bahwa saya tidak memiliki pengalaman mengembangkan dengan python, tetapi saya memiliki pengalaman di Qt5. Oleh karena itu, pilihan jatuh pada Qt5. Sejak versi kelima, modul untuk bekerja dengan serial telah muncul dan saya sudah mengerjakannya. Dan aplikasi berbasis Qt5 dapat ditransfer ke Linux dan Mac (bagi sebagian orang ini penting), dan mulai versi 5.2, aplikasi berbasis QWidgets bahkan dapat ditransfer ke smartphone!

Apa lagi yang dibutuhkan? Tentu saja, papan tersebut memiliki FPGA. Saya punya dua di antaranya (Cyclone iv EP4CE10E22C8N untuk 10 ribu sel, dan Cyclone ii EP2C5 untuk 5 ribu sel). Saya akan memilih yang di sebelah kiri semata-mata karena konektornya lebih nyaman. Dari segi volume, proyek ini tidak dimaksudkan untuk menjadi besar, sehingga akan cocok dengan salah satu dari keduanya. Kecepatannya tidak berbeda. Kedua papan memiliki osilator 50 MHz, dan di dalam FPGA terdapat PLL, yang dengannya saya dapat meningkatkan frekuensi ke 200 MHz yang direncanakan.

Hari pertama

Karena saya sudah membuat modul DDS di proyek synthesizer saya, saya segera mengambil besi solder dan mulai menyolder DAC dengan resistor. Saya mengambil papan prototipe. Pemasangannya dilakukan dengan menggunakan wraping. Satu-satunya perubahan yang mempengaruhi teknologi ini adalah saya meninggalkan asam F38N untuk melapisi dudukannya dan memilih gel fluks indikator TT. Inti dari teknologi ini sederhana: Saya menyolder rak ke papan sirkuit tercetak, dan menyolder resistor dari sisi papan sirkuit tercetak. Saya membuat koneksi yang hilang dengan memutar. Selain itu, raknya nyaman karena saya bisa memasukkannya langsung ke papan FPGA.

Sayangnya, resistor 1 dan 2 kilo-ohm tidak tersedia di rumah. Tidak ada waktu untuk pergi ke toko. Saya harus melepaskan salah satu aturan saya dan melepas resistor dari papan lama yang tidak perlu. Resistor 15K dan 30K digunakan di sana. Hasilnya adalah Frankenstein ini:


Setelah membuat proyek, Anda perlu mengatur perangkat target: Menu Assigments -> Device


Dalam proyek ini, saya mengkodekan modul DDS utama yang tidak dapat dikontrol ke frekuensi tetap.

Modul Pembangkit 1000 Hz

modul signal_generator(clk50M, signal_out); kabel masukan clk50M; sinyal keluaran kabel_out; kawat clk200M; osc osc_200M reg akumulator; tetapkan signal_out = akumulator; //coba menghasilkan 1000 Hz //50.000.000 Hz - frekuensi clock generator eksternal //2^32 = 4.294.967.296 - kedalaman bit DDS - 32 bit //bagi 1000Hz / 50.000.000 Hz / 2 * 4294967296 => 42949, 67296 selalu @ (Posge Clk50M) memulai akumulator<= accumulator + 32"d42949; end endmodule


Setelah itu, saya mengklik "Mulai Kompilasi" sehingga lingkungan pengembangan akan menanyakan jalur input/output apa yang kita miliki di modul utama proyek dan PIN fisik apa yang terhubung dengannya. Anda dapat terhubung ke hampir semua orang. Setelah kompilasi, kami tetapkan baris yang muncul ke PIN sebenarnya dari chip FPGA:

Penetapan item menu -> Perencana Pin

Harap abaikan baris HS_OUT, key0 dan key1 untuk saat ini, baris tersebut akan muncul di proyek nanti, tetapi saya tidak punya waktu untuk mengambil tangkapan layar di awal.

Pada prinsipnya, cukup “mendaftarkan” PIN_nn saja di kolom Lokasi, dan parameter lainnya (standar I/O, Kekuatan Saat Ini, dan Laju Perubahan Tegangan) dapat dibiarkan secara default, atau Anda dapat memilih parameter yang sama yang ditawarkan oleh default (default) sehingga tidak ada peringatan "ov.

Bagaimana cara mengetahui PIN mana yang sesuai dengan nomor konektor di papan?

Nomor pin konektor ditandai di papan


Dan pin FPGA yang dihubungkan dengan kontak konektor dijelaskan dalam dokumentasi yang disertakan dengan papan FPGA.




Setelah pin ditetapkan, saya mengkompilasi proyek lagi dan mem-flash-nya menggunakan programmer USB. Jika Anda belum menginstal driver untuk pemrogram USB Byte blaster, beri tahu Windows bahwa driver tersebut berada di folder tempat Anda menginstal Quartus. Kemudian dia akan menemukannya sendiri.

Pemrogram harus terhubung ke konektor JTAG. Dan item menu untuk pemrograman adalah “Tools -> Programmer” (atau klik ikon pada toolbar). Tombol "Start", tombol "Success" yang menggembirakan, dan firmware sudah ada di dalam FPGA dan sudah berfungsi. Hanya saja, jangan matikan FPGA, jika tidak semuanya akan terlupakan.

Alat -> Pemrogram


DAC terhubung ke konektor papan FPGA. Saya menghubungkan osiloskop S1-112A ke output DAC. Hasilnya harus berupa “gergaji” karena bagian tingkat tinggi dari kata DDS akumulator fase di-output ke output 8-bit. Dan selalu bertambah hingga meluap.

Sekitar 1,5 jam dan untuk frekuensi 1000 Hz saya melihat osilogram berikut:

Saya ingin mencatat bahwa "gergaji" memiliki retakan kecil di tengahnya. Hal ini disebabkan oleh fakta bahwa resistor memiliki kisaran nilai.

Poin penting lainnya yang perlu diklarifikasi adalah frekuensi maksimum yang mungkin digunakan generator DDS untuk beroperasi. Dengan parameter TimeQuest yang dikonfigurasi dengan benar, setelah kompilasi di "Laporan Kompilasi" Anda dapat melihat bahwa kecepatan rangkaian di atas 200 MHz dengan margin. Artinya saya akan mengalikan frekuensi generator 50 MHz dengan 4 menggunakan PLL. Saya akan meningkatkan nilai akumulator fasa DDS dengan frekuensi 200 MHz. Rentang frekuensi akhir yang dapat diperoleh dalam kondisi kami adalah 0 - 100 MHz. Akurasi pengaturan frekuensi:

200.000.000 Hz (clk) / 2^32 (DDS) = 0,047 Hz
Artinya, ini lebih baik dari ~0,05 Hz. Saya menganggap keakuratan sepersekian hertz cukup untuk generator dengan rentang frekuensi operasi seperti itu (0...100 MHz). Jika seseorang perlu meningkatkan akurasi, maka untuk ini mereka dapat meningkatkan kedalaman bit DDS (ingat untuk memeriksa TimeQuest Timing Analyzer bahwa kecepatan operasi rangkaian logika berada dalam CLK = 200 MHz, karena ini adalah penambah), atau cukup kurangi frekuensi clock jika rentang frekuensi yang lebar tidak diperlukan.

Penganalisis Waktu TimeQuest


Setelah saya melihat “saw” di layar, masalah keluarga memaksa saya untuk pergi ke pedesaan (saat itu adalah hari libur saya). Di sana saya memotong rumput, memasak, memanggang dan tidak tahu kejutan apa yang menanti saya di malam hari. Menjelang malam, sebelum tidur, saya memutuskan untuk melihat bentuk sinyal frekuensi lain.

Untuk frekuensi 100 kHz

Untuk frekuensi 250 kHz

Untuk frekuensi 500 kHz

Untuk frekuensi 1 MHz

Hari kedua

Karena menariknya cara kerja DAC pada resistor 100 dan 200 Ohm, saya segera mengambil besi solder. Kali ini DAC ternyata lebih akurat dan membutuhkan waktu lebih sedikit untuk memasangnya.

Kami memasang DAC di papan FPGA dan menghubungkannya ke osiloskop

Memeriksa 1 MHz - VO! Ini masalah yang sangat berbeda!

Melihat 10 MHz

Melihat 25 MHz


Bentuk gergaji 10 MHz masih mirip dengan aslinya. Namun pada 25 MHz tidak lagi “cantik” sama sekali. Namun C1-112a memiliki bandwidth 10 MHz, jadi dalam hal ini alasannya mungkin sudah ada di osiloskop.

Pada prinsipnya, masalah DAC ini dapat dianggap selesai. Sekarang mari kita ambil bentuk gelombang dari keluaran berkecepatan tinggi. Untuk melakukan ini, kami akan menampilkan bit paling signifikan ke PIN FPGA terpisah. Kami akan mengambil data untuk baris ini dari bit paling signifikan dari akumulator DDS.

Tetapkan hs_out = akumulator;

Gelombang persegi 1 MHz

Gelombang persegi 5 MHz

Gelombang persegi 25 MHz

Gelombang persegi 50 MHz hampir tidak terlihat sekarang


Tapi menurut saya keluaran FPGA harus diisi dengan resistansi. Mungkin bagian depannya akan lebih curam.

Sinus dibuat sesuai tabel. Ukuran tabel adalah 256 nilai 8 bit. Dimungkinkan untuk mengambil lebih banyak, tetapi saya sudah memiliki file mif yang sudah jadi. Menggunakan wizard, kami membuat elemen ROM dengan data tabel sinus dari file mif.

Membuat ROM - Alat -> Manajer Plugin Mega Wizard


Pilih 1 port ROM dan beri nama modulnya

Kami setuju

Di sini kami juga setuju

Menggunakan browsing, kami menemukan file mif kami dengan tabel sinus

Kami juga tidak mengubah apa pun di sini.

Hapus centang pada modul sine_rom_bb.v - itu tidak diperlukan. Selesai berikutnya. Quartus akan meminta Anda untuk menambahkan modul ke proyek - kami setuju. Setelah ini, modul dapat digunakan sama seperti modul lainnya di Verilog.


8 bit teratas dari kata akumulator DDS akan digunakan sebagai alamat ROM, dan output data akan menjadi nilai sinus.

Kode

//kabel sinus rom sine_out; sine_rom sine1(.clock(clk200M), .address(akumulator), .q(sine_out));


Osilogram gelombang sinus pada frekuensi berbeda terlihat... sama.

Jika diinginkan, Anda dapat mempertimbangkan masalah DAC yang terkait dengan penyebaran resistor:

Ya, itulah akhir akhir pekan. Namun perangkat lunak untuk kontrol dari PC belum ditulis. Saya terpaksa mengakui kenyataan bahwa saya tidak memenuhi tenggat waktu yang direncanakan.

Hari ketiga

Waktunya sangat sedikit, jadi kami menulis programnya dengan tergesa-gesa (dalam tradisi terbaik). Di beberapa tempat, untuk mengurangi jumlah huruf dan kenyamanan memasukkan informasi dari keyboard, filter acara digunakan dengan nama widget. Mohon pengertiannya dan maafkan.

Antarmuka

Tautan dengan analog

Bukan daftar lengkap
Generator DDS fungsional. Dibuat berdasarkan AVR. Frekuensi 0…65534Hz.
Ikhtisar generator DDS GK101. Dibuat menggunakan Altera MAX240 FPGA. Frekuensi hingga 10 MHz.
Generator multifungsi pada PIC16F870. Rentang frekuensi: 11Hz - 60kHz.
generator Tambahkan tag

Frekuensi maksimum - 65534 Hz ​​(dan output HS hingga 8 MHz dengan gelombang persegi). Dan kemudian saya berpikir bahwa generator adalah tugas yang sangat baik di mana FPGA dapat menunjukkan performa terbaiknya. Dari segi olahraga, saya memutuskan untuk mengulangi proyek di FPGA, sambil memenuhi tenggat waktu dalam dua akhir pekan, dan mendapatkan parameter yang tidak ditentukan secara ketat, tetapi semaksimal mungkin. Anda dapat mengetahui apa yang dihasilkan dari pemotongan ini.

Hari nol

Sebelum akhir pekan tiba, saya punya waktu untuk memikirkan implementasinya. Untuk mempermudah tugas saya, saya memutuskan untuk menjadikan generator bukan sebagai perangkat terpisah dengan tombol dan layar LCD, tetapi sebagai perangkat yang terhubung ke PC melalui USB. Untuk ini saya memiliki papan USB2RS232. Papan ini tidak memerlukan driver (CDC), oleh karena itu, menurut saya ini akan berfungsi di Linux (bagi sebagian orang, ini penting). Selain itu, saya tidak akan menyembunyikan bahwa saya telah bekerja menerima pesan melalui RS232. Saya akan mengambil modul siap pakai untuk bekerja dengan RS232 dari opencores.com.

Untuk menghasilkan sinyal gelombang sinus Anda memerlukan DAC. Saya memilih tipe DAC, seperti pada proyek aslinya - R2R 8-bit. Ini akan memungkinkan Anda untuk beroperasi pada frekuensi tinggi, pada urutan megahertz. Saya yakin FPGA harus mengatasi hal ini

Saya sedang memikirkan cara menulis program untuk mengirimkan data melalui port COM. Di satu sisi, Anda dapat menulis di Delphi7, Anda sudah memiliki pengalaman menulis program seperti itu, dan selain itu, ukuran file yang dapat dieksekusi tidak akan besar. Saya juga mencoba membuat sketsa sesuatu untuk bekerja dengan Serial dalam bentuk skrip java di halaman html, tetapi kurang lebih hanya berfungsi melalui API serial Chrome, tetapi untuk ini Anda perlu menginstal plugin... secara umum , itu juga tidak mungkin. Saya mencoba PyQt5 sebagai inovasi untuk diri saya sendiri, tetapi ketika mendistribusikan proyek semacam itu, Anda perlu menyeret banyak perpustakaan. Setelah mencoba mengkompilasi proyek PyQt menjadi file exe, ternyata ukurannya lebih dari 10 MB. Artinya, ini tidak lebih baik dari aplikasi yang ditulis dalam C++\Qt5. Perlu juga dipertimbangkan bahwa saya tidak memiliki pengalaman mengembangkan dengan python, tetapi saya memiliki pengalaman di Qt5. Oleh karena itu, pilihan jatuh pada Qt5. Sejak versi kelima, modul untuk bekerja dengan serial telah muncul dan saya sudah mengerjakannya. Dan aplikasi berbasis Qt5 dapat ditransfer ke Linux dan Mac (bagi sebagian orang ini penting), dan mulai versi 5.2, aplikasi berbasis QWidgets bahkan dapat ditransfer ke smartphone!

Apa lagi yang dibutuhkan? Tentu saja, papan tersebut memiliki FPGA. Saya punya dua di antaranya (Cyclone iv EP4CE10E22C8N untuk 10 ribu sel, dan Cyclone ii EP2C5 untuk 5 ribu sel). Saya akan memilih yang di sebelah kiri semata-mata karena konektornya lebih nyaman. Dari segi volume, proyek ini tidak dimaksudkan untuk menjadi besar, sehingga akan cocok dengan salah satu dari keduanya. Kecepatannya tidak berbeda. Kedua papan memiliki osilator 50 MHz, dan di dalam FPGA terdapat PLL, yang dengannya saya dapat meningkatkan frekuensi ke 200 MHz yang direncanakan.

Hari pertama

Karena saya sudah membuat modul DDS di proyek synthesizer saya, saya segera mengambil besi solder dan mulai menyolder DAC dengan resistor. Saya mengambil papan prototipe. Instalasi dilakukan dengan menggunakan . Satu-satunya perubahan yang mempengaruhi teknologi ini adalah saya meninggalkan asam F38N untuk melapisi dudukannya dan memilih gel fluks indikator TT. Inti dari teknologi ini sederhana: Saya menyolder rak ke papan sirkuit tercetak, dan menyolder resistor dari sisi papan sirkuit tercetak. Saya membuat koneksi yang hilang dengan memutar. Selain itu, raknya nyaman karena saya bisa memasukkannya langsung ke papan FPGA.

Sayangnya, resistor 1 dan 2 kilo-ohm tidak tersedia di rumah. Tidak ada waktu untuk pergi ke toko. Saya harus melepaskan salah satu aturan saya dan melepas resistor dari papan lama yang tidak perlu. Resistor 15K dan 30K digunakan di sana. Hasilnya adalah Frankenstein ini:


Setelah membuat proyek, Anda perlu mengatur perangkat target: Menu Assigments -> Device


Dalam proyek ini, saya mengkodekan modul DDS utama yang tidak dapat dikontrol ke frekuensi tetap.

Modul Pembangkit 1000 Hz

modul signal_generator(clk50M, signal_out); kabel masukan clk50M; sinyal keluaran kabel_out; kawat clk200M; osc osc_200M reg akumulator; tetapkan signal_out = akumulator; //coba menghasilkan 1000 Hz //50.000.000 Hz - frekuensi clock generator eksternal //2^32 = 4.294.967.296 - kedalaman bit DDS - 32 bit //bagi 1000Hz / 50.000.000 Hz / 2 * 4294967296 => 42949, 67296 selalu @ (Posge Clk50M) memulai akumulator<= accumulator + 32"d42949; end endmodule


Setelah itu, saya mengklik "Mulai Kompilasi" sehingga lingkungan pengembangan akan menanyakan jalur input/output apa yang kita miliki di modul utama proyek dan PIN fisik apa yang terhubung dengannya. Anda dapat terhubung ke hampir semua orang. Setelah kompilasi, kami tetapkan baris yang muncul ke PIN sebenarnya dari chip FPGA:

Penetapan item menu -> Perencana Pin

Harap abaikan baris HS_OUT, key0 dan key1 untuk saat ini, baris tersebut akan muncul di proyek nanti, tetapi saya tidak punya waktu untuk mengambil tangkapan layar di awal.

Pada prinsipnya, cukup “mendaftarkan” PIN_nn saja di kolom Lokasi, dan parameter lainnya (standar I/O, Kekuatan Saat Ini, dan Laju Perubahan Tegangan) dapat dibiarkan secara default, atau Anda dapat memilih parameter yang sama yang ditawarkan oleh default (default) sehingga tidak ada peringatan "ov.

Bagaimana cara mengetahui PIN mana yang sesuai dengan nomor konektor di papan?

Nomor pin konektor ditandai di papan


Dan pin FPGA yang dihubungkan dengan kontak konektor dijelaskan dalam dokumentasi yang disertakan dengan papan FPGA.




Setelah pin ditetapkan, saya mengkompilasi proyek lagi dan mem-flash-nya menggunakan programmer USB. Jika Anda belum menginstal driver untuk pemrogram USB Byte blaster, beri tahu Windows bahwa driver tersebut berada di folder tempat Anda menginstal Quartus. Kemudian dia akan menemukannya sendiri.

Pemrogram harus terhubung ke konektor JTAG. Dan item menu untuk pemrograman adalah “Tools -> Programmer” (atau klik ikon pada toolbar). Tombol "Start", tombol "Success" yang menggembirakan, dan firmware sudah ada di dalam FPGA dan sudah berfungsi. Hanya saja, jangan matikan FPGA, jika tidak semuanya akan terlupakan.

Alat -> Pemrogram


DAC terhubung ke konektor papan FPGA. Saya menghubungkan osiloskop S1-112A ke output DAC. Hasilnya harus berupa “gergaji” karena bagian tingkat tinggi dari kata DDS akumulator fase di-output ke output 8-bit. Dan selalu bertambah hingga meluap.

Sekitar 1,5 jam dan untuk frekuensi 1000 Hz saya melihat osilogram berikut:

Saya ingin mencatat bahwa "gergaji" memiliki retakan kecil di tengahnya. Hal ini disebabkan oleh fakta bahwa resistor memiliki kisaran nilai.

Poin penting lainnya yang perlu diklarifikasi adalah frekuensi maksimum yang mungkin digunakan generator DDS untuk beroperasi. Dengan parameter TimeQuest yang dikonfigurasi dengan benar, setelah kompilasi di "Laporan Kompilasi" Anda dapat melihat bahwa kecepatan rangkaian di atas 200 MHz dengan margin. Artinya saya akan mengalikan frekuensi generator 50 MHz dengan 4 menggunakan PLL. Saya akan meningkatkan nilai akumulator fasa DDS dengan frekuensi 200 MHz. Rentang frekuensi akhir yang dapat diperoleh dalam kondisi kami adalah 0 - 100 MHz. Akurasi pengaturan frekuensi:

200.000.000 Hz (clk) / 2^32 (DDS) = 0,047 Hz
Artinya, ini lebih baik dari ~0,05 Hz. Saya menganggap keakuratan sepersekian hertz cukup untuk generator dengan rentang frekuensi operasi seperti itu (0...100 MHz). Jika seseorang perlu meningkatkan akurasi, maka untuk ini mereka dapat meningkatkan kedalaman bit DDS (ingat untuk memeriksa TimeQuest Timing Analyzer bahwa kecepatan operasi rangkaian logika berada dalam CLK = 200 MHz, karena ini adalah penambah), atau cukup kurangi frekuensi clock jika rentang frekuensi yang lebar tidak diperlukan.

Penganalisis Waktu TimeQuest


Setelah saya melihat “saw” di layar, masalah keluarga memaksa saya untuk pergi ke pedesaan (saat itu adalah hari libur saya). Di sana saya memotong rumput, memasak, memanggang dan tidak tahu kejutan apa yang menanti saya di malam hari. Menjelang malam, sebelum tidur, saya memutuskan untuk melihat bentuk sinyal frekuensi lain.

Untuk frekuensi 100 kHz

Untuk frekuensi 250 kHz

Untuk frekuensi 500 kHz

Untuk frekuensi 1 MHz

Hari kedua

Karena menariknya cara kerja DAC pada resistor 100 dan 200 Ohm, saya segera mengambil besi solder. Kali ini DAC ternyata lebih akurat dan membutuhkan waktu lebih sedikit untuk memasangnya.

Kami memasang DAC di papan FPGA dan menghubungkannya ke osiloskop

Memeriksa 1 MHz - VO! Ini masalah yang sangat berbeda!

Melihat 10 MHz

Melihat 25 MHz


Bentuk gergaji 10 MHz masih mirip dengan aslinya. Namun pada 25 MHz tidak lagi “cantik” sama sekali. Namun C1-112a memiliki bandwidth 10 MHz, jadi dalam hal ini alasannya mungkin sudah ada di osiloskop.

Pada prinsipnya, masalah DAC ini dapat dianggap selesai. Sekarang mari kita ambil bentuk gelombang dari keluaran berkecepatan tinggi. Untuk melakukan ini, kami akan menampilkan bit paling signifikan ke PIN FPGA terpisah. Kami akan mengambil data untuk baris ini dari bit paling signifikan dari akumulator DDS.

Tetapkan hs_out = akumulator;

Gelombang persegi 1 MHz

Gelombang persegi 5 MHz

Gelombang persegi 25 MHz

Gelombang persegi 50 MHz hampir tidak terlihat sekarang


Tapi menurut saya keluaran FPGA harus diisi dengan resistansi. Mungkin bagian depannya akan lebih curam.

Sinus dibuat sesuai tabel. Ukuran tabel adalah 256 nilai 8 bit. Dimungkinkan untuk mengambil lebih banyak, tetapi saya sudah memiliki file mif yang sudah jadi. Menggunakan wizard, kami membuat elemen ROM dengan data tabel sinus dari file mif.

Membuat ROM - Alat -> Manajer Plugin Mega Wizard


Pilih 1 port ROM dan beri nama modulnya

Kami setuju

Di sini kami juga setuju

Menggunakan browsing, kami menemukan file mif kami dengan tabel sinus

Kami juga tidak mengubah apa pun di sini.

Hapus centang pada modul sine_rom_bb.v - itu tidak diperlukan. Selesai berikutnya. Quartus akan meminta Anda untuk menambahkan modul ke proyek - kami setuju. Setelah ini, modul dapat digunakan sama seperti modul lainnya di Verilog.


8 bit teratas dari kata akumulator DDS akan digunakan sebagai alamat ROM, dan output data akan menjadi nilai sinus.

Kode

//kabel sinus rom sine_out; sine_rom sine1(.clock(clk200M), .address(akumulator), .q(sine_out));


Osilogram gelombang sinus pada frekuensi berbeda terlihat... sama.

Jika diinginkan, Anda dapat mempertimbangkan masalah DAC yang terkait dengan penyebaran resistor:

Ya, itulah akhir akhir pekan. Namun perangkat lunak untuk kontrol dari PC belum ditulis. Saya terpaksa mengakui kenyataan bahwa saya tidak memenuhi tenggat waktu yang direncanakan.

Hari ketiga

Waktunya sangat sedikit, jadi kami menulis programnya dengan tergesa-gesa (dalam tradisi terbaik). Di beberapa tempat, untuk mengurangi jumlah huruf dan kenyamanan memasukkan informasi dari keyboard, filter acara digunakan dengan nama widget. Mohon pengertiannya dan maafkan.

Antarmuka

Tautan dengan analog

Bukan daftar lengkap
Generator DDS fungsional. Dibuat berdasarkan AVR. Frekuensi 0…65534Hz.
Ikhtisar generator DDS GK101. Dibuat menggunakan Altera MAX240 FPGA. Frekuensi hingga 10 MHz.
Generator multifungsi pada PIC16F870. Rentang frekuensi: 11Hz - 60kHz.
generator
  • Qt5
  • Tambahkan tanda

    Setiap bengkel rumah harus memiliki seperangkat alat dan alat ukur yang diperlukan. Bagi orang-orang yang terlibat dalam radio amatir sebagai hobi, tingginya biaya moneter untuk membeli peralatan yang diperlukan seringkali tidak dapat diterima.

    Jadi dalam kasus saya, daftar peralatan ini masih jauh dari lengkap dan kurang pembangkit sinyal.

    Generator sinyal Ternyata membuatnya sendiri mudah dari elemen radio yang tersedia dan pada akhirnya tidak mahal. Jadi, setelah mencari-cari di Internet, saya menemukan sejumlah besar sirkuit untuk berbagai generator, termasuk model yang lebih canggih dengan DAC, tetapi produksinya sudah mahal. Saya berhenti pada hal yang sederhana untuk memulai. Generator sinyal DDS pada mikrokontroler ATMEGA8 dari Atmel. Yang ini, saya tidak memperbaiki atau mengubah apa pun - saya membiarkan semuanya apa adanya, saya hanya membuat salinannya dan, yang terpenting, saya tidak mengklaim kepemilikan perangkat ini.

    Jadi, pembangkit sinyal mempunyai karakteristik yang baik dan cocok untuk memecahkan masalah sederhana.

    Menampilkan informasi di pembangkit sinyal diproduksi pada layar LCD 16x2 karakter dengan pengontrol HD44780. Patut dicatat bahwa untuk menghemat port mikrokontroler, layar LCD dikontrol hanya melalui tiga kabel; hal ini dicapai dengan menggunakan register geser - baca tentang cara menghubungkan layar melalui tiga kabel.

    Perlu menghemat port, 8 port digunakan untuk DAC resistif, 7 port untuk tombol. Pada artikel aslinya, penulis berjanji untuk menggunakan modulasi PWM, namun ternyata tidak menyelesaikannya, karena ia mulai mengembangkan versi yang lebih canggih pada ATMEGA16.

    Diagram skema generator sinyal DDS dan papan sirkuit tercetak.

    Sirkuit dan papan ditampilkan dalam aslinya; juga berisi tombol untuk kontrol PWM yang tidak digunakan oleh penulis.

    Untuk DAC, saya khusus membeli resistor presisi dengan error ±0,05%, namun ternyata yang sederhana dengan error ±5% sudah cukup. Bentuk gelombangnya cukup dapat diterima untuk semua jenis sinyal.

    Kapan generator dirakit dan program dimuat ke mikrokontroler, tidak diperlukan pengaturan, kecuali Anda menyesuaikan kontras tampilan.

    Bekerja dengan perangkat ini sederhana - pilih bentuk sinyal, atur frekuensi yang diperlukan, dan Anda dapat mengubah langkah pengaturan frekuensi dengan batas 1 - 10 - 100 - 1000 Hz per langkah. Kemudian klik Mulai dan generator mulai bekerja. Perlu dicatat bahwa ketika generator dihidupkan, frekuensi dan bentuk sinyal tidak dapat diubah, hal ini disebabkan oleh fakta bahwa program masuk ke dalam loop tanpa akhir dan untuk meningkatkan frekuensi pembangkitan maksimum, prosedur polling tombol harus dihapus. Untuk menghentikan pembuatan, klik stop/reset, ini akan memulai ulang program dan kembali ke menu pengaturan. Inilah nuansanya.

    Secara terpisah, saya ingin bercerita tentang pembuatan rumah genset. Anda dapat membeli casing yang sudah jadi di toko atau menggunakan casing yang sesuai dari perangkat lain, tetapi saya memutuskan untuk membuatnya sendiri seluruhnya. Sepotong fiberglass dua sisi tergeletak kosong, yang saya sumbangkan ke badan.

    Pertama, Anda perlu melakukan semua pengukuran, dimensi layar LCD dan papan generator sinyal, catu daya, konektor dan tombol, kemudian letakkan di selembar kertas seperti yang ada di dalam casing. Berdasarkan dimensi yang diperoleh, Anda dapat mulai memproduksinya.

    Proyek ini adalah generator fungsi berkualitas tinggi dan universal, yang, meskipun rangkaiannya rumit, setidaknya dibandingkan dengan yang lebih sederhana, memiliki fungsionalitas yang sangat luas, yang membenarkan biaya perakitannya. Ia mampu menghasilkan 9 bentuk gelombang berbeda dan juga bekerja dengan sinkronisasi pulsa.

    Diagram skema generator pada MK

    Pengaturan alat

    • Rentang frekuensi: 10 Hz - 60 kHz
    • Penyesuaian frekuensi digital dalam 3 langkah berbeda
    • Bentuk Gelombang: Sinus, Segitiga, Kotak, Gergaji, H-pulsa, L-pulsa, Burst, Sapu, Kebisingan
    • Rentang keluaran: 15V untuk sinus dan segitiga, 0-5V untuk mode lainnya
    • Ada output untuk sinkronisasi pulsa

    Perangkat ini diberi daya dari 12 volt AC, yang menyediakan tegangan DC yang cukup tinggi (lebih dari 18 V) yang diperlukan untuk pengoperasian normal 78L15 dan 79L15, yang membentuk rangkaian bipolar 15 V. Hal ini dilakukan agar rangkaian mikro LF353 dapat menghasilkan keluaran berbagai sinyal ke beban 1 kOhm.

    Pengontrol level menggunakan ALPS SRBM1L0800. Rangkaian harus menggunakan resistor dengan toleransi ±1% atau lebih baik. Pembatas arus LED - resistor seri 4306R. Kecerahan dapat ditingkatkan tergantung pada preferensi pemain. Generator dirakit dalam wadah plastik berukuran 178x154x36 mm dengan panel depan dan belakang aluminium.

    Banyak komponen kontak yang dipasang di panel depan dan belakang (tombol, kenop, konektor RCA, rakitan LED, konektor daya). Papan sirkuit tercetak dipasang ke rumahan dengan baut dengan spacer plastik. Semua elemen generator lainnya dipasang pada papan sirkuit tercetak - catu daya terpisah. Tombol kiri di tengah untuk mengubah mode, tombol kanan untuk memilih frekuensi mode.

    Generator menghasilkan berbagai sinyal dan beroperasi dalam tiga mode, yang dipilih menggunakan tombol "Pilih" dan ditunjukkan oleh tiga LED atas (dalam diagram). Kontrol putar mengubah parameter sinyal sesuai dengan tabel berikut:

    Segera setelah pengaturan di mode 1, pembangkitan sinus terjadi. Namun, frekuensi awalnya cukup rendah dan setidaknya diperlukan satu klik encoder untuk meningkatkannya. Papan memiliki kontak untuk menghubungkan perangkat untuk pemrograman, yang memungkinkan Anda dengan cepat mengubah fungsi generator sinyal, jika perlu. Semua file proyek - firmware PIC16F870, gambar papan, berada

    Generator fungsi DDS (versi 2.0) sinyal ini dirakit pada mikrokontroler AVR, memiliki fungsionalitas yang baik, memiliki kontrol amplitudo, dan juga dirakit pada papan sirkuit cetak satu sisi.

    Generator ini berbasis algoritma generator Jesper DDS, programnya sudah dimodernisasi untuk AVR-GCC C dengan sisipan kode assembly. Generator memiliki dua sinyal keluaran: yang pertama adalah sinyal DDS, yang kedua adalah keluaran “persegi panjang” berkecepatan tinggi (1,.8 MHz), yang dapat digunakan untuk menghidupkan kembali MK dengan fuzz yang salah dan untuk tujuan lain.
    Sinyal HS (High Speed) berkecepatan tinggi diambil langsung dari mikrokontroler Atmega16 OC1A (PD5).
    Sinyal DDS dihasilkan dari output MC lainnya melalui matriks R2R resistif dan melalui chip LM358N, yang memungkinkan penyesuaian amplitudo dan offset sinyal. Offset dan amplitudo disesuaikan menggunakan dua potensiometer. Offset dapat disesuaikan dalam kisaran +5V..-5V, dan amplitudonya 0...10V. Frekuensi sinyal DDS dapat diatur dalam kisaran 0...65534 Hz, ini lebih dari cukup untuk menguji sirkuit audio dan tugas radio amatir lainnya.

    Karakteristik utama generator DDS V2.0:
    - rangkaian sederhana dengan elemen radio yang umum dan murah;
    - papan sirkuit cetak satu sisi;
    - catu daya bawaan;
    - output kecepatan tinggi (HS) terpisah hingga 8 MHz;
    - Sinyal DDS dengan amplitudo dan offset variabel;
    - Sinyal DDS: sinus, persegi panjang, gergaji dan gergaji mundur, segitiga, sinyal EKG, dan sinyal kebisingan;
    - Layar LCD 2×16;
    - keyboard 5 tombol yang intuitif;
    - langkah penyesuaian frekuensi: 1, 10, 100, 1000, 10000 Hz;
    - Mengingat keadaan terakhir setelah menyalakan listrik.

    Diagram blok di bawah ini menunjukkan struktur logis dari generator fungsi:

    Seperti yang Anda lihat, perangkat memerlukan beberapa tegangan suplai: +5V, -12V, +12V. Tegangan +12V dan -12V digunakan untuk mengatur amplitudo dan offset sinyal. Catu daya dirancang menggunakan transformator dan beberapa chip penstabil tegangan:

    Catu daya dipasang pada papan terpisah:

    Jika Anda tidak ingin merakit catu daya sendiri, Anda dapat menggunakan catu daya ATX biasa dari komputer, yang sudah memiliki semua voltase yang diperlukan. Tata letak konektor ATX.

    layar LCD

    Semua tindakan ditampilkan melalui layar LCD. Generator dikendalikan oleh lima tombol

    Tombol atas/bawah digunakan untuk berpindah menu, tombol kiri/kanan digunakan untuk mengubah nilai frekuensi. Ketika tombol tengah ditekan, sinyal yang dipilih mulai dihasilkan. Menekan tombol lagi akan menghentikan generator.

    Nilai terpisah disediakan untuk mengatur langkah perubahan frekuensi. Ini berguna jika Anda perlu mengubah frekuensi dalam rentang yang luas.

    Generator kebisingan tidak memiliki pengaturan apa pun. Ia menggunakan fungsi rand() biasa, yang terus menerus diumpankan ke output generator DDS.

    Output kecepatan tinggi HS memiliki 4 mode frekuensi: 1, 2, 4 dan 8 MHz.

    Diagram skematik

    Rangkaian generator fungsi sederhana dan berisi elemen yang mudah diakses:
    - Mikrokontroler AVR Atmega16, dengan kuarsa eksternal pada 16 MHz;
    - layar LCD standar tipe HD44780 2×16;
    - Matriks R2R DAC terbuat dari resistor biasa;
    - penguat operasional LM358N (analog domestik KR1040UD1);
    - dua potensiometer;
    - lima kunci;
    - beberapa konektor.

    Membayar:

    Generator fungsional dirakit dalam kotak plastik:


    Perangkat lunak

    Seperti yang saya katakan di atas, saya mendasarkan program saya pada algoritma generator Jesper DDS. Saya menambahkan beberapa baris kode perakitan untuk mengimplementasikan penghentian generasi. Sekarang algoritme berisi 10 siklus CPU, bukan 9.

    membatalkan Signal_OUT inline statis(const uint8_t *sinyal, uint8_t ad2, uint8_t ad1, uint8_t ad0)(
    asm volatil("eor r18, r18 ;r18<-0″ "\n\t"
    "eor r19, r19 ;r19<-0″ "\n\t"
    "1:" "\n\t"
    "tambahkan r18, %0 ;1 siklus" "\n\t"
    "adc r19, %1 ;1 siklus" "\n\t"
    "adc %A3, %2 ;1 siklus" "\n\t"
    "lpm ;3 siklus" "\n\t"
    "keluar %4, __tmp_reg__ ;1 siklus" "\n\t"
    "sbis %5, 2 ;1 siklus jika tidak dilewati" "\n\t"
    "rjmp 1b ;2 siklus. Total 10 siklus" "\n\t"
    :
    :"r" (ad0),,"r" (ad1),,"r" (ad2),,"e" (sinyal),,"I" (_SFR_IO_ADDR(PORTA)), "I" (_SFR_IO_ADDR(SPCR ))
    :"r18″, "r19″
    );}

    Tabel bentuk sinyal DDS terletak di memori flash MK, yang alamatnya dimulai dari 0xXX00. Bagian-bagian ini ditentukan dalam makefile, di lokasi memori yang sesuai:
    #Tentukan bagian tempat menyimpan tabel sinyal
    LDFLAGS += -Wl,-bagian-mulai=.Bagian Saya1=0x3A00
    LDFLAGS += -Wl,-bagian-mulai=.Bagian Saya2=0x3B00
    LDFLAGS += -Wl,-bagian-mulai=.Bagian Saya3=0x3C00
    LDFLAGS += -Wl,-bagian-mulai=.Bagian Saya4=0x3D00
    LDFLAGS += -Wl,-bagian-mulai=.Bagian Saya5=0x3E00
    LDFLAGS += -Wl,-bagian-mulai=.Bagian Saya6=0x3F00