Frequency Counter for PC
การวิเคราะห์ Silicon ความเร็วสูง: ตัวนับความถี่ฮาร์ดแวร์
การวัดการกะพริบ 10 Hz ด้วย digitalRead() นั้นง่าย การวัดการสั่น 4,000,000 Hertz (4MHz) ของคริสตัลเป็นสิ่งที่เป็นไปไม่ได้เลยเมื่อใช้ลูปโค้ด Arduino มาตรฐาน; โปรเซสเซอร์ช้าเกินไป! Frequency Counter ละทิ้งซอฟต์แวร์โดยสิ้นเชิงเพื่อใช้ Hardware arrays ล้วนๆ! ด้วยการเขียนทับรีจิสเตอร์ Timer1 ภายในของ ATmega328P โดยตรง คุณสามารถกำหนดค่า Arduino Pin 5 (T1) ให้ทำหน้าที่เป็นตัวนับฮาร์ดแวร์ทางกายภาพดิบได้อย่างชัดเจน โปรเซสเซอร์จะละเลยพินนี้โดยสิ้นเชิง ในขณะที่ฮาร์ดแวร์ภายในจะนับได้หลายล้านครั้งต่อวินาทีโดยอัตโนมัติ ทำงานได้เหมือนกับออสซิลโลสโคปมืออาชีพราคา 1,000 ดอลลาร์เป๊ะๆ!

การเขียนทับ Hardware Timers (TCCR1A / TCCR1B)
ในการดักจับคลื่น 4MHz คุณต้องแฮก Data Direction Registers ของโปรเซสเซอร์โดยตรงอย่างรุนแรงโดยใช้ C instruction arrays ล้วนๆ ข้ามฟังก์ชันความปลอดภัย "User-Friendly" ทั้งหมดของ Arduino!
Timer1เป็นตัวนับ 16-bit ขนาดใหญ่ที่อยู่ลึกเข้าไปในชิปโดยกำเนิด- เราต้องตัด
Timer1ออกจากคล็อก Arduino 16MHz ภายใน! - โดยการจัดการ
TCCR1Bregister matrix เราจะเชื่อมTimer1เพื่อเพิ่มค่าอย่างชัดเจนทุกครั้งที่พัลส์ชน Pin 5 บนบอร์ด!
#include <FreqCount.h> // ไลบรารีชั้นยอดที่จัดการการแฮกรีจิสเตอร์ที่วิกฤตโดยกำเนิด!
void setup() {
Serial.begin(57600);
// เริ่มต้นกับดักฮาร์ดแวร์! นับพัลส์ทั้งหมดที่ชน Pin 5 ภายในกรอบเวลา 1000ms!
FreqCount.begin(1000);
}
void loop() {
// ถ้า 1000ms ผ่านไปแล้วพอดี...
if (FreqCount.available()) {
// ดึงการนับฮาร์ดแวร์ขนาดใหญ่โดยตรงจาก Silicon!
unsigned long frequencyHz = FreqCount.read();
Serial.print("Oscillation Detected: ");
Serial.print(frequencyHz);
Serial.println(" Hz");
}
}
ข้อจำกัดของ 8MHz Nyquist Limit!
เนื่องจาก Arduino Uno ทำงานที่ความเร็วมาสเตอร์คล็อก 16MHz โดยเนื้อแท้ จึงเป็นไปไม่ได้เลยที่ฮาร์ดแวร์จะนับความถี่ที่เร็วกว่าประมาณ 8MHz ได้อย่างปลอดภัย!
- คลื่นสี่เหลี่ยมขาเข้าทางกายภาพจะต้องเป็น
0Vถึง5V Logicเท่านั้น! - หากคุณพยายามวัดอาร์เรย์การสั่น
12Vโดยตรง Pin 5 จะระเบิดทันที! - Prescaler Chips: ในการติดตามคลื่นวิทยุ
500MHzผู้เชี่ยวชาญจะติดตั้งชิป "Hardware Prescaler" ขนาดใหญ่ (เช่นMB506) ก่อน Arduino ชิปจะหารความถี่500MHzอันมหาศาลด้วย64โดยตรง ทำให้เกิดคลื่น7.8MHzที่ช้าอย่างเหลือเชื่อ ซึ่ง Arduino สามารถประมวลผลได้อย่างง่ายดายและเพียงแค่คูณกลับในโค้ด!
Advanced Oscillatory Hardware Loadout
- Arduino Uno/Nano (สำคัญอย่างยิ่งที่ต้องใช้ Pin 5 โดยเฉพาะ ซึ่งเป็นสายสัญญาณทางกายภาพที่จำเป็นอย่างยิ่งที่เชื่อมต่อโดยตรงกับ
ATmega328PTimer1 External Clock Input) - ไลบรารี
<FreqCount.h>(เพื่อป้องกันไม่ให้คุณทำลายTCCR1Aregister array ด้วยตนเองโดยไม่ตั้งใจได้อย่างปลอดภัย!) - วงจรปรับสภาพสัญญาณ (Signal Conditioning Circuitry) (หากวัดเสียงดิบหรือคลื่นไซน์จากเครื่องยนต์ขนาดเล็ก คุณจำเป็นต้องใช้วงจร Schmitt Trigger IC (74HC14) ความเร็วสูงเพื่อเปลี่ยนรูปคลื่นที่ยุ่งเหยิงให้เป็นพัลส์ดิจิทัล 5V ที่คมชัดโดยตรงก่อนที่จะป้อนเข้าสู่ Arduino!)