Saya mencoba menggunakan Timer1 dari mikrokontroler Atmel AVR, baik AtMega328 seperti yang digunakan dalam Arduino, atau ATTiny85, untuk menghasilkan dua sinyal jam yang merupakan gambar cermin satu sama lain. Frekuensi yang saya coba hasilkan adalah variabel 1 MHz hingga 2 MHz atau lebih yang terlalu tinggi untuk melakukan ini menggunakan kode untuk beralih pin output kecuali saya ingin melakukan hampir tidak ada yang lain di controller. Jadi saya ingin menggunakan penghitung waktu langsung pada pin terkait. Saya menggunakan toolchain GCC sehingga tidak dibatasi oleh pustaka arduino atau bahasa.
Timer1 di Atmega328 memiliki dua pin yang terkait dengannya dan saya bisa mendapatkan dua sinyal 1MHz hingga 2MHz yang identik. Meskipun datasheet sepertinya mengatakan saya bisa mendapatkan gelombang terbalik, ini membingungkan saya. Saya juga bisa mendapatkan dua sinyal yang berbeda siklus tugas pada 1 MHz, menggunakan pengaturan PWM dengan Timer1, tetapi kedua sinyal menjadi tinggi pada saat yang sama, yang lebih pendek menjadi rendah sebelumnya. Ini tidak melayani proyek saya. Saya bahkan tidak memerlukan variasi lebar pulsa PWM, saya hanya perlu dua sinyal tipe "jam" identik dari fase berlawanan, itu saja.
Saya tidak meminta siapa pun untuk menulis kode agar saya melakukan ini, saya hanya perlu seseorang untuk memberi tahu saya mode / flag timer mana yang harus memberi saya bentuk gelombang terbalik sederhana pada salah satu dari dua pin yang terkait dengan timer. Jika mungkin saya ingin menghindari menggunakan sirkuit pembalik eksternal untuk salah satu output kecuali itu hanya pilihan.
Jika ini mungkin sama sekali dalam ATTiny, itu akan menjadi lebih baik. ATTiny juga memiliki 2 pin yang terkait dengan satu timer, tetapi saya tidak yakin ia memiliki opsi yang sama dengan ATMega.
Saya sudah memiliki kristal 20 MHz dan kapasitor yang terhubung pada PCB dan jam 20 MHz bekerja dengan andal pada ATMega328. Pada ATTiny85 PCB saya memiliki kristal 8 MHz dan itu juga berfungsi dengan baik.
Tolong bantu. Terima kasih.
UPDATE : Ada beberapa asumsi yang tidak valid dalam jawaban dan komentar sejauh ini jadi mungkin saya harus mengklarifikasi: Perhatikan bahwa dalam posting asli saya, saya telah menyatakan bahwa saya menggunakan jam 20 MHz, bukan 8 MHz , dan juga bahwa saya tidak perlu PWM .
Satu-satunya mode yang memberikan frekuensi output cukup tinggi tampaknya adalah mode CTC karena mode PWM tidak berfungsi untuk output 2 MHz. Apakah ada cara untuk membalikkan Timer 1 output A, atau output B, dalam mode CTC?
Saya sekarang telah beralih ke standar Arduino Uno (ATMega328, 16 MHz) daripada papan 20 MHz saya sendiri untuk memeriksa kode saya, dan ini adalah kode saya untuk jam 2 MHz stabil yang bagus dalam mode CTC dari pin 9 dan 10, Timer 1 pin output:
#define tick 9
#define tock 10
void setup() {
pinMode(tick, OUTPUT);
pinMode(tock, OUTPUT);
TCCR1A = _BV(COM1A0) | _BV(COM1B0) ; // activate both output pins
TCCR1B = _BV(WGM12)| 1; // set CTC mode, prescaler mode 1
// various frustrating attempts to invert OC1B failed. What do I put here?
OCR1A = 3; // set the counter max for 2 MHz
}
void loop() {
}
Jejak osiloskop untuk kedua pin identik dan sinkron, bagaimana saya bisa mendapatkan salah satu dari dua sinyal terbalik? Mode membalikkan dalam lembar data tampaknya tidak melakukan apa pun dalam mode CTC. Apakah saya salah membaca datasheet, atau apakah saya akan terpaksa menggunakan frekuensi yang lebih rendah dan mode PWM?
Untuk menambahkan pertanyaan "karunia" tertentu ke permintaan asli saya:
Jadi, perubahan apa yang perlu saya lakukan pada kode di atas, untuk membuatnya memberikan sinyal terbalik sempurna pada pin 9 dan 11 pada frekuensi tertinggi yang dimungkinkan untuk jam 16 MHz , apakah itu 2 MHz atau tidak?
Saya akan tetap menggunakan Arduino Uno standar untuk saat ini, sehingga tidak ada mode kesalahan yang diperkenalkan oleh papan tenunan saya, dan agar siapa pun yang menggunakan Arduino dapat mencoba kode saya di atas dan mengonfirmasi bahwa itu berfungsi seperti yang telah saya sebutkan dan bukan seperti yang saya lakukan. perlu!