ฉันพยายามใช้ Timer1 ของไมโครคอนโทรลเลอร์ Atmel AVR ทั้ง AtMega328 ที่ใช้ใน Arduino หรือ ATTiny85 เพื่อส่งสัญญาณนาฬิกาสองสัญญาณซึ่งเป็นภาพสะท้อนของกันและกัน ความถี่ที่ฉันพยายามจะสร้างคือตัวแปร 1 MHz ถึง 2 MHz หรือสูงกว่าซึ่งสูงเกินไปที่จะทำเช่นนี้โดยใช้รหัสเพื่อสลับพินเอาต์พุตหากฉันไม่ต้องการทำสิ่งใดในคอนโทรลเลอร์ ดังนั้นฉันต้องการใช้เอาต์พุตไทม์เมอร์โดยตรงบนพินที่เกี่ยวข้อง ฉันใช้ GCC toolchain ดังนั้นไม่ จำกัด โดย arduino library หรือภาษา
ตัวจับเวลา 1 ใน Atmega328 มีสองพินที่เชื่อมโยงกับมันและฉันสามารถรับสัญญาณ 1MHz ถึง 2MHz เหมือนกันได้ แม้ว่าแผ่นข้อมูลดูเหมือนว่าฉันจะได้รับรูปคลื่นคว่ำ แต่มันทำให้ฉันสับสน ฉันยังสามารถรับสัญญาณสองสัญญาณซึ่งมีวัฏจักรหน้าที่แตกต่างกันที่ 1 MHz โดยใช้การตั้งค่า PWM กับ Timer1 แต่สัญญาณทั้งสองไปสูงในเวลาเดียวกัน นี่ไม่ได้ให้บริการโครงการของฉัน ฉันไม่ต้องการแม้แต่ความผันแปรของความกว้างพัลส์ PWM ฉันแค่ต้องการสัญญาณประเภท "นาฬิกา" ที่เหมือนกันของเฟสตรงกันข้ามนั่นคือทั้งหมด
ฉันไม่ได้ขอให้ใครเขียนโค้ดให้ฉันทำฉันแค่ต้องการใครสักคนที่จะบอกฉันว่าโหมด / ธงของตัวจับเวลาใดควรให้รูปแบบคลื่นกลับหัวที่เรียบง่ายบนหนึ่งในสองพินที่เกี่ยวข้องกับตัวจับเวลา ถ้าเป็นไปได้ฉันต้องการหลีกเลี่ยงการใช้วงจรสลับกลับภายนอกสำหรับเอาต์พุตอย่างใดอย่างหนึ่งเว้นแต่ว่าจะเป็นตัวเลือกเท่านั้น
ถ้าเป็นไปได้ใน ATTiny นั่นจะดีกว่า ATTiny ยังมี 2 พินที่เกี่ยวข้องกับการจับเวลาหนึ่งครั้ง แต่ฉันไม่แน่ใจว่ามันมีตัวเลือกเดียวกันกับ ATMega
ฉันมีผลึก 20 MHz และตัวเก็บประจุเชื่อมต่ออยู่บน PCB แล้วและนาฬิกา 20 MHz นั้นทำงานได้อย่างน่าเชื่อถือบน ATMega328 บน ATTiny85 PCB ฉันมีคริสตัลขนาด 8 MHz และนั่นก็ทำงานได้อย่างน่าเชื่อถือ
กรุณาช่วย. ขอบคุณ.
UPDATE : มีข้อสมมติฐานที่ไม่ถูกต้องในคำตอบและความคิดเห็นดังนั้นบางทีฉันควรชี้แจง: โปรดทราบว่าในโพสต์ดั้งเดิมของฉันฉันได้ระบุว่าฉันใช้นาฬิกา 20 MHz ไม่ใช่ 8 MHzและฉันไม่ต้องการ PWM .
โหมดเดียวที่ให้ความถี่เอาต์พุตสูงมากน่าจะเป็นโหมด CTCเนื่องจากโหมด PWM ไม่ทำงานสำหรับเอาต์พุต 2 MHz มีวิธีในการสลับทั้ง Timer 1 output A หรือ Output B ในโหมด CTC หรือไม่?
ตอนนี้ฉันได้เปลี่ยนเป็น Arduino Uno มาตรฐาน (ATMega328, 16 MHz) แทนที่จะเป็นบอร์ด 20 MHz ของฉันเพื่อตรวจสอบรหัสของฉันและนี่คือรหัสสำหรับนาฬิกา 2 MHz ที่เสถียรในโหมด CTC จากหมุด 9 และ 10 ตัวจับเวลา 1 ขาออก:
#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() {
}
ร่องรอยของออสซิลโลสโคปสำหรับพินทั้งสองนั้นเหมือนกันและซิงค์กันฉันจะรับสัญญาณกลับด้านใดด้านหนึ่งได้ โหมดกลับด้านในแผ่นข้อมูลดูเหมือนจะไม่ทำอะไรในโหมด CTC ฉันกำลังอ่านแผ่นข้อมูลผิดหรือฉันจะถูกบังคับให้ใช้ความถี่ต่ำและโหมด PWM หลังจากทั้งหมดหรือไม่
ในการเพิ่มคำถาม "ความชื่นชอบ" เฉพาะลงในข้อความค้นหาดั้งเดิมของฉัน:
ดังนั้นฉันต้องทำการเปลี่ยนแปลงอะไรกับรหัสของฉันด้านบนเพื่อให้สัญญาณแบบกลับด้านที่ 9 และ 11 ที่ความถี่สูงสุดที่เป็นไปได้สำหรับนาฬิกา 16 MHzไม่ว่าจะเป็น นั่นคือ 2 MHz หรือไม่
ฉันจะติดกับ Arduino Uno มาตรฐานในตอนนี้เพื่อให้ไม่มีโหมดข้อผิดพลาดถูกเปิดตัวโดยคณะกรรมการ homespun ของฉันและเพื่อให้ทุกคนที่มี arduino สามารถลองใช้รหัสของฉันด้านบนและยืนยันว่ามันทำงานตามที่ฉันได้กล่าวไว้ ความต้องการ!