Saya ingin membuat osilator gelombang persegi sederhana yang mirip dengan apa yang akan dilakukan dengan 555, tetapi saya ingin menggunakan dukungan PWM berbasis interupsi untuk mengontrol lebar dan frekuensi pulsa.
Saya telah mempelajari datasheet, API AVR, dan contoh PWM apa pun yang dapat saya temukan, tetapi saya belum dapat menggabungkan semuanya.
Apakah mungkin untuk membuat osilator dengan fungsi AVR PWM bawaan dan, jika ya, bagaimana? Saya teman saya melakukan sesuatu yang mirip dengan PIC 8 pin.
Alasan saya adalah bahwa saya akan mendapatkan suara yang menarik dengan mengubah lebar pulsa dan karena itu bentuk gelombang pada frekuensi yang diberikan. Mirip dengan cara Konsol Punk Atari bekerja tetapi mudah-mudahan dengan cara yang lebih stabil, yaitu mengubah lebar pulsa, tetapi membiarkan frekuensi konstan atau sebaliknya.
Jawaban:
Ini akan membuat Anda cukup jauh dan sisanya dapat Anda lakukan dengan lembar data. Mulailah membangun sepotong demi sepotong, dari blinky ke waveform ke waveform yang berubah seiring waktu menjadi nada. Beberapa sumber mungkin membantu dengan memfilter dan menggerakkan output audio (LPF aktif mungkin melakukan keduanya dengan rapi).
Saya sarankan kembali dengan pertanyaan yang lebih spesifik.
sumber
Periode PWM ditentukan oleh tingkat luapan timer Anda. Ada banyak pengaturan pada bagian Mode Operasi untuk dipikirkan. Jika semua yang ingin Anda lakukan adalah menghasilkan gelombang persegi periode konstan, dengan siklus tugas variabel, saya pikir Anda akan ingin menggunakan mode CTC (Clear Timer on Compare Match). Ide dasarnya adalah untuk menetapkan OCR0A ke jumlah kutu waktu sampai Anda ingin pin untuk beralih berikutnya, dan gunakan interupsi Bandingkan Pertandingan untuk mengubah nilai itu untuk waktu berikutnya. Jadi dalam avr-gcc akan terlihat seperti:
Peringatan, ini kode yang belum diuji tetapi saya pikir idenya benar. Tidak berarti apakah ini satu - satunya cara untuk melakukannya juga.
Ada satu hal yang harus Anda ketahui tentang ATTiny13. RC Oscillator internal hanya dijamin akurat hingga 10% dari lantai pabrik. Ada proses kalibrasi pengguna yang dapat Anda lalui (dijelaskan oleh atmel appnote ) yang akan membawa Anda ke akurasi 2% untuk ATTiny13. Jika Anda ingin melakukan yang lebih baik dari itu, Anda mungkin perlu menggunakan chip yang mengakomodasi kristal eksternal ...
sumber
Bukan jawaban langsung untuk pertanyaan Anda, tetapi ini mungkin tepat dan berikan beberapa petunjuk -
Saya baru saja membuat osilator yang dikontrol secara numerik (NCO) menggunakan ATmega UC dan DAC. Array bilangan bulat digunakan untuk menyimpan satu siklus bentuk gelombang (wavetable). Akumulator fase (long int) digunakan untuk menentukan alamat data output di wavetable. Setiap pengatur waktu menambah akumulator fase dengan nilai tetap. Peningkatan fase menentukan frekuensi.
Dalam aplikasi saya, saya menggunakan wavetable 64 byte yang berisi satu siklus gelombang sinus. Sangat mudah untuk memperpanjang goyangan dan menambahkan lebih banyak resolusi ke sampel. Catatan aplikasi saya ada di http://wiblocks.com/docs/app-notes/nb1a-nco.html
sumber
Pada dasarnya PWM tidak mengubah frekuensi. PWM sebagian besar digunakan untuk mengontrol "intensitas" suatu sinyal.
Untuk menghasilkan interupsi untuk frekuensi yang berbeda, saya sarankan Anda menggunakan timer dalam mode CTC.
Ini akan berjalan ke nilai perbandingan Anda, beralih interupsi, hapus dan mulai ulang sendiri - sampai berjalan kembali ke nilai perbandingan Anda ...
Setelah setiap interupsi, Anda dapat beralih satu atau beberapa port dan sisa waktu (timer masih berjalan secara otomatis), Anda dapat melihat input apa pun ...
Anda mungkin masih "memodulasi" gelombang persegi Anda dengan PWM untuk mengontrol "gain". Tetapi salah satu dari mereka harus dilakukan "dengan tangan" karena ATtiny13 hanya memiliki satu pengatur waktu perangkat keras ...
sumber