Tôi đang cố gắng sử dụng Timer1 của vi điều khiển Atmel AVR, hoặc AtMega328 như được sử dụng trong Arduino, hoặc ATTiny85, để phát ra hai tín hiệu đồng hồ là hình ảnh phản chiếu của nhau. Tần số tôi đang cố gắng tạo là biến từ 1 MHz đến 2 MHz trở lên, quá cao để thực hiện điều này bằng cách sử dụng mã để chuyển đổi các chân đầu ra trừ khi tôi muốn làm hầu như không có gì khác trong bộ điều khiển. Vì vậy, tôi muốn sử dụng đầu ra bộ đếm thời gian trực tiếp trên các chân liên quan. Tôi đang sử dụng chuỗi công cụ GCC để không bị giới hạn bởi các thư viện hoặc ngôn ngữ arduino.
Timer1 trong Atmega328 có hai chân được liên kết với nó và tôi có thể nhận được hai tín hiệu 1 MHz đến 2 MHz giống hệt nhau từ chúng. Mặc dù bảng dữ liệu dường như nói rằng tôi có thể có được dạng sóng đảo ngược, nó làm tôi bối rối. Tôi cũng có thể nhận được hai tín hiệu có chu kỳ nhiệm vụ khác nhau ở 1 MHz, sử dụng cài đặt PWM với Timer1, nhưng cả hai tín hiệu đều tăng cao cùng một lúc, tín hiệu ngắn hơn xuống thấp trước đó. Điều này không phục vụ dự án của tôi. Tôi thậm chí không cần biến thể độ rộng xung PWM, tôi chỉ cần hai tín hiệu loại "đồng hồ" giống hệt nhau của pha ngược nhau, chỉ vậy thôi.
Tôi không yêu cầu ai viết mã cho tôi để làm điều này, tôi chỉ cần ai đó cho tôi biết chế độ / cờ nào của bộ hẹn giờ sẽ cho tôi một dạng sóng đảo ngược đơn giản trên một trong hai chân được liên kết với bộ hẹn giờ. Nếu có thể tôi muốn tránh sử dụng mạch đảo ngoài cho một trong các đầu ra trừ khi đó chỉ là tùy chọn.
Nếu điều này hoàn toàn có thể xảy ra trong ATTiny, điều đó sẽ còn tốt hơn nữa. ATTiny cũng có 2 chân được liên kết với một bộ đếm thời gian, nhưng tôi không chắc nó có các tùy chọn tương tự như ATMega.
Tôi đã có một tinh thể 20 MHz và các tụ điện được kết nối trên đồng hồ PCB và 20 MHz đang hoạt động đáng tin cậy trên ATMega328. Trên ATTiny85 PCB tôi có một tinh thể 8 MHz và nó cũng hoạt động đáng tin cậy.
Xin vui lòng giúp đỡ. Cảm ơn bạn.
CẬP NHẬT : Có một số giả định không hợp lệ trong các câu trả lời và nhận xét cho đến nay có lẽ tôi nên làm rõ: Lưu ý rằng trong bài viết gốc của tôi, tôi đã tuyên bố rằng tôi đang sử dụng đồng hồ 20 MHz, không phải 8 MHz và tôi cũng không cần PWM .
Chế độ duy nhất cung cấp tần số đầu ra đủ cao dường như là chế độ CTC vì chế độ PWM không hoạt động cho đầu ra 2 MHz. Có cách nào để đảo ngược đầu ra Timer 1 A, hoặc đầu ra B, trong chế độ CTC không?
Bây giờ tôi đã chuyển sang Arduino Uno tiêu chuẩn (ATMega328, 16 MHz) thay vì bảng 20 MHz của riêng tôi để kiểm tra mã của tôi và đây là mã của tôi cho đồng hồ 2 MHz ổn định ở chế độ CTC từ chân 9 và 10, Timer 1 chân đầu ra:
#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() {
}
Các dấu vết dao động cho cả hai chân là giống hệt nhau và đồng bộ, làm thế nào tôi có thể nhận được một trong hai tín hiệu đảo ngược? Chế độ đảo ngược trong biểu dữ liệu dường như không làm gì trong chế độ CTC. Tôi đang đọc bảng dữ liệu sai, hay tôi sẽ bị buộc phải sử dụng chế độ PWM và tần số thấp hơn?
Để thêm một câu hỏi "tiền thưởng" cụ thể vào truy vấn ban đầu của tôi:
Vì vậy, tôi cần thay đổi gì với mã của mình ở trên, để làm cho nó đưa ra tín hiệu đảo ngược hoàn toàn ở chân 9 và 11 ở tần số cao nhất có thể cho đồng hồ 16 MHz , cho dù đó là 2 MHz hay không?
Bây giờ tôi sẽ gắn bó với Arduino Uno tiêu chuẩn, do đó không có chế độ lỗi nào được giới thiệu bởi hội đồng quản trị của tôi và để bất kỳ ai có arduino đều có thể thử mã của tôi ở trên và xác nhận rằng nó hoạt động như tôi đã đề cập chứ không phải như tôi nhu cầu!