คำตอบที่ได้รับการยอมรับของ jfpoilpret นั้นดีมากถูกต้องสมบูรณ์และใน 99% ของกรณีที่ฉันจะทำสิ่งที่เขาอธิบาย การแก้ปัญหาของเขานั้นดีในพารามิเตอร์ที่คุณกำหนดดังนั้นพวกเขาควรจะทำงานได้ดีมาก แต่อะไรจะดีไปกว่า " ดีมาก "? ความสมบูรณ์แบบ! ท้ายที่สุดคำถามนี้เกี่ยวกับการสร้างมูลค่าที่แน่นอน ดังที่กล่าวไว้ใกล้พอเป็นสิ่งที่ดีในกรณีส่วนใหญ่ (ทุกอย่าง) และแม้กระทั่งเมื่อต้องรับมือกับบางสิ่งบางอย่างในเวลาที่ 1 วินาทีต้องเป็น 1 วินาทีคุณยังต้องทนทุกข์กับความไม่สมบูรณ์ของชิ้นส่วน
สิ่งที่ฉันจะแนะนำไม่สามารถทำได้เสมอไป ในบางกรณีเป็นไปได้ แต่ด้วยความยุ่งยากและความพยายามมากกว่ากรณีนี้ มันคุ้มค่าหรือไม่ขึ้นอยู่กับแต่ละกรณี เป้าหมายของฉันส่วนใหญ่จะแสดงทางเลือกสำหรับการอ้างอิงในอนาคตที่ดีกว่าในบางกรณี สิ่งนี้เขียนขึ้นโดยคำนึงถึงผู้ใช้มือใหม่ที่ไม่มีประสบการณ์ด้านอิเล็กทรอนิกส์
สำหรับคนขั้นสูงกว่านี้อาจจะดู verbose และโง่เกินไป แต่ฉันเชื่อว่าคนแบบเดียวกันนั้นคงรู้แล้วและไม่ต้องการคำตอบนี้ นอกจากนี้ยังสามารถใช้ได้กับไมโครคอนโทรลเลอร์ทุกตัวและผู้ผลิตและสถาปัตยกรรมทุกตัว แต่สำหรับไมโครคอนโทรลเลอร์อื่น ๆ คุณจะต้องศึกษาแผ่นข้อมูลที่ถูกต้องเพื่อค้นหาการลงทะเบียนที่ถูกต้องและชื่อและค่าที่ตั้งไว้ล่วงหน้า
ในกรณีของคุณคุณต้องการความถี่ที่เฉพาะเจาะจงและสิ่งที่ดีเกี่ยวกับมันคือว่าจริง ๆ แล้ว 56 kHz สามารถทำได้ง่ายมาก (ไม่นับส่วนที่ไม่สมบูรณ์ในทางปฏิบัติ) นี่ก็เป็นกรณีตัวอย่างที่สมบูรณ์แบบ
การสร้างสัญญาณขึ้นอยู่กับตัวจับเวลาและแหล่งสัญญาณนาฬิกาของไมโครคอนโทรลเลอร์ตามที่อธิบายไว้อย่างดีโดย jfpoilpret คำตอบของเขาเกี่ยวข้องกับปัญหาในมุมมองเดียวเท่านั้นและนั่นก็เล่นซอกับตัวนับ แต่คุณสามารถเล่นซอกับแหล่งสัญญาณนาฬิกาได้เช่นกันหรือดีกว่าสำหรับทั้งการทำงานร่วมกันและผลลัพธ์ที่ยอดเยี่ยม โดยการเปลี่ยนพารามิเตอร์ของสภาพแวดล้อมในกรณีนี้การแฮ็คระบบและเปลี่ยนแหล่งสัญญาณนาฬิกาทำให้เราสามารถจัดการกับปัญหาที่เฉพาะเจาะจงได้อย่างง่ายดายและง่ายขึ้น
ก่อนอื่นเพื่อเตือนเนื่องจากการสลับสถานะพินคุณจะต้องเรียกใช้ ISR มากกว่าความถี่สัญญาณสองเท่า นี่คือ 112,000 ครั้งต่อวินาที 56,000 และ 16,000,000 ไม่ได้รวมกันอย่างที่ระบุไว้แล้ว เราจำเป็นต้องเปลี่ยนความถี่สัญญาณหรือความถี่แทก ตอนนี้เราจะจัดการกับความถี่สัญญาณที่ไม่เปลี่ยนรูปและค้นหาความเร็วสัญญาณนาฬิกาที่ดีขึ้น
มันจะตรงไปตรงมาที่สุดในการเลือกนาฬิกาที่มีลำดับความสำคัญสูงกว่า 56 kHz (หรือ 112 kHz แต่ก็เหมือนกัน) เมื่อคุณเพิ่มเลขศูนย์และคณิตศาสตร์ประเภทนี้ง่ายที่สุดสำหรับคนส่วนใหญ่ น่าเสียดายที่ทุกสิ่งทุกอย่างในโลกนี้ประนีประนอมกับบางสิ่งบางอย่าง ไม่ใช่ทุกค่าที่ได้ผล
ตัวอย่างแรกคือความเร็วของเครื่องกำเนิดไฟฟ้าที่มีชั้นเชิงต่ำเกินไป
หากคุณเลือกนาฬิกา 56,000 Hz คุณจะไม่สามารถทำอะไรได้เพราะคุณจะต้องเรียก ISR ทุกรอบและไม่สามารถทำอะไรได้อีก มันไร้ประโยชน์อย่างเต็มที่ หากคุณเลือกความเร็วที่เร็วขึ้น 10 เท่า (560 kHz) คุณจะมี 9 (10 รอบสำหรับตัวจับเวลาเพื่อให้ได้ค่าสูงสุด - หนึ่งรอบเพื่อเรียกใช้ฟังก์ชั่น ISR) ไมโครคอนโทรลเลอร์เพื่อทำงานของคุณและสิ่งนี้อาจไม่เพียงพอ คุณมักจะต้องการพลังในการคำนวณมากกว่า
หากคุณเลือกค่าที่ยอดเยี่ยมเกินกว่าที่ควรในขณะที่ 56 MHz ไมโครคอนโทรลเลอร์จะไม่สามารถใช้งานได้ มันเร็วเกินไป ดังนั้นการเลือกสิ่งที่คุ้มค่าที่สุดในร้านจะไม่ลดลง
Arduino Uno R3 ดั้งเดิมมีนาฬิกาสต็อคที่ 16 MHz ดังนั้นสิ่งใดที่ช้ากว่าที่รับประกันว่าจะทำงาน ค่าถัดไปที่เป็นลำดับของขนาดที่ใหญ่กว่า 56 และต่ำกว่า 16 MHz คือ 5.6 MHz สิ่งนี้จะนำไปสู่การเรียก ISR ทุก ๆ 50 รอบและจะสร้างความถี่ตัวจับเวลา 112,000 Hz ที่สมบูรณ์แบบ และสัญญาณของคุณจะเท่ากับ 56 kHz คุณจะมีวงจร MCU จำนวน 49 รอบเพื่อเรียกใช้โปรแกรมระหว่างการเรียกใช้ ISR แต่ยังคงความเร็วประมาณ 1/3 ของนาฬิกาดั้งเดิม หนึ่งสามารถใช้ 112 เป็นฐานและใช้นาฬิกา 11.2 MHz และสิ่งนี้จะให้ประมาณ 2/3 ของ resonator 16 MHz หุ้น ฟังก์ชั่น ISR จะถูกเรียกทุก ๆ 100 รอบและยังคงสร้างสัญญาณที่สมบูรณ์ 56 kHz
อย่างไรก็ตามปัญหาที่สำคัญสองประการมีอยู่กับค่าเหล่านี้
ปัญหาแรกขึ้นอยู่กับความต้องการของคุณอย่างรุนแรง: คุณเสียสละประมาณ 1/3 (กับ 11.2 MHz) ของกำลังการคำนวณสูงสุดของคุณเพื่อรับความถี่สัญญาณที่แน่นอนซึ่งใช้ค่าลงทะเบียนที่หาง่าย (OCR iirc ) คุณอาจจะดีกับมันหรือคุณอาจไม่
ปัญหาที่สองคือshowstopper ที่ยาก : มันหาค่าได้ง่าย แต่บ่อยครั้งที่มันไม่มีอยู่ในแหล่งสัญญาณนาฬิกาที่ผลิตขึ้นมา นี่คือหน้าเว็บ resonator ของ Farnellที่ขาดทั้ง 5.6 MHz และ 11.2 MHz
เพื่อหลีกเลี่ยงสิ่งนี้เราสามารถดูค่าของแร่ที่มีอยู่และหาสิ่งอื่นที่สามารถใช้เพื่อสร้างค่าที่ต้องการ ถ้าเราหาร 56 ด้วย 4 เราจะได้ 14 และโชคดีที่มี resonator 14 MHz สิ่งนี้ทำให้เรามีความเร็วที่สูงขึ้นและพลังงานมากขึ้นและหาค่าลงทะเบียนได้ง่ายอย่างเท่าเทียมกัน ในการเรียกใช้ ISR 112,000 ครั้งต่อวินาทีเราจำเป็นต้องใส่ค่าทศนิยม 124 หรือเลขฐานสิบหก 0x7C ในการลงทะเบียน OCR ดังนั้นด้วยการนับ 124 รอบ + 1 สำหรับการเรียก ISR เราจึงได้ค่าที่สมบูรณ์แบบที่เราต้องการ
NB
- ISR - รูทีนการบริการขัดจังหวะ (นี่คือรหัสที่จะถูกดำเนินการเฉพาะในการขัดจังหวะที่สร้างขึ้น)
- โปรแกรมของคุณมีขนาดใหญ่เท่าใดขึ้นอยู่กับขนาดหน่วยความจำ! มันไม่มีส่วนเกี่ยวข้องกับความเร็วสัญญาณนาฬิกาและไม่เกี่ยวข้องกับความถี่ที่คุณเรียกว่า ISR
เมื่อไมโครคอนโทรลเลอร์เริ่มต้นด้วยคำสั่งโปรแกรมตัวนับจะเพิ่มขึ้น หากมีการสร้างอินเตอร์รัปต์ ISR จะถูกเรียกใช้และค่านี้จะถูกเก็บไว้ในรีจิสเตอร์พิเศษ เมื่อรหัส ISR เสร็จสมบูรณ์ค่าของตัวนับโปรแกรมจะถูกกู้คืนจากการลงทะเบียนพิเศษนี้และโปรแกรมจะดำเนินการต่อจากที่ที่มันถูกขัดจังหวะราวกับว่ามันไม่เคยเกิดขึ้น
ฉันจะยกตัวอย่างที่โง่เง่ามาก หากคุณเป็นคนเจ้าระเบียบฉันขอเตือนคุณว่าอาจมีเลือดออกในจมูกและตา
ลองนึกภาพคุณต้องเดินจากที่หนึ่งไปยังที่อื่น คำแนะนำเส้นทางแบบทีละขั้นตอนคือโปรแกรมหลักของคุณและคำสั่งต่าง ๆ ความเร็วในการเดินหรือวิ่งของคุณขึ้นอยู่กับ "ความเร็วสัญญาณนาฬิกา" ของคุณ แต่ไม่ได้อยู่ในคำแนะนำเส้นทาง (30 ก้าวไปข้างหน้า 1 เลี้ยว 90 องศาซ้าย, 10 ก้าวไปข้างหน้า, 10 ก้าวไปข้างหน้า 45 องศาขวา ฯลฯ ) . ทีนี้ลองนึกภาพเด็กตัวเล็ก ๆ หรือนักการเมืองท้องถิ่นที่โลภมากแล้วถอดรองเท้าของคุณออกแล้ว นี่คือเหตุการณ์ที่สร้างการขัดจังหวะ จากนั้นคุณหยุดหลังจากก้าวสุดท้ายของคุณคุกเข่าและผูกรองเท้าอีกครั้ง นี่คือโปรแกรม ISR ของคุณ
จากนั้นคุณต่อจากที่ที่คุณหยุด คุณไม่เริ่มจากจุดเริ่มต้น เมื่อคุณเดินอย่างไร้กังวลในโลกนี้และตลอดเวลาคุณไม่สนใจแม้ว่าคุณจะต้องผูกรองเท้าทุกขั้นตอน หากคุณทำเช่นนั้นด้วยการ จำกัด เวลาเช่นวิ่งในระยะ 100 เมตรในการแข่งขันกีฬาโอลิมปิก (หรือวิ่งจากนักล่าที่กินเนื้อหิว) การหยุดและผูกรองเท้าของคุณอาจทำให้เกิดผลกระทบร้ายแรง เช่นเดียวกับไมโครคอนโทรลเลอร์ แม้ว่าคุณจะรันโค้ดเพียงหนึ่งบรรทัดโปรแกรมของคุณจะทำงานต่อไปแม้ว่าจะช้า หากคุณไม่สนใจความเร็วเลยมันจะไม่มีปัญหา หากคุณต้องทำบางเวลาที่เกี่ยวข้องเช่นการใช้การกระทำที่ขึ้นอยู่กับตัวจับเวลาอื่น ๆ การรบกวนอาจไม่เป็นที่ต้องการและเป็นปัญหา
น้อยกว่ามาก! นาฬิกาที่เร็วกว่านั้นไม่ได้ดีกว่าเสมอไป อุปกรณ์ที่โอเวอร์คล็อกช้ากว่าจะใช้พลังงานน้อยกว่ามาก นี่อาจเป็นจุดสำคัญในอุปกรณ์ที่ใช้แบตเตอรี่
รอบที่ต้องการมาจากสูตรนี้:
(ความเร็วสัญญาณนาฬิกา / (ค่าพรีสเกลเลอร์ * ต้องการความถี่การโทร ISR)) - 1