สารบัญ:

วิธีการวัดความถี่สูงและรอบการทำงานพร้อมกันโดยใช้ไมโครคอนโทรลเลอร์: 4 ขั้นตอน
วิธีการวัดความถี่สูงและรอบการทำงานพร้อมกันโดยใช้ไมโครคอนโทรลเลอร์: 4 ขั้นตอน

วีดีโอ: วิธีการวัดความถี่สูงและรอบการทำงานพร้อมกันโดยใช้ไมโครคอนโทรลเลอร์: 4 ขั้นตอน

วีดีโอ: วิธีการวัดความถี่สูงและรอบการทำงานพร้อมกันโดยใช้ไมโครคอนโทรลเลอร์: 4 ขั้นตอน
วีดีโอ: วิธีวัดมอสเฟต ดี หรือ เสีย ( สูตรไม่ลับสไตล์....ZimZim ) เห็นผลจริง 95....% 2024, พฤศจิกายน
Anonim
วิธีการวัดความถี่สูงและรอบการทำงานพร้อมกันโดยใช้ไมโครคอนโทรลเลอร์
วิธีการวัดความถี่สูงและรอบการทำงานพร้อมกันโดยใช้ไมโครคอนโทรลเลอร์
วิธีการวัดความถี่สูงและรอบการทำงานพร้อมกันโดยใช้ไมโครคอนโทรลเลอร์
วิธีการวัดความถี่สูงและรอบการทำงานพร้อมกันโดยใช้ไมโครคอนโทรลเลอร์
วิธีการวัดความถี่สูงและรอบการทำงานพร้อมกันโดยใช้ไมโครคอนโทรลเลอร์
วิธีการวัดความถี่สูงและรอบการทำงานพร้อมกันโดยใช้ไมโครคอนโทรลเลอร์

ฉันรู้ว่าคุณคิดอย่างไร: "ห๊ะ มีคำแนะนำมากมายเกี่ยวกับวิธีใช้ไมโครคอนโทรลเลอร์เพื่อวัดความถี่ของสัญญาณ หาว" แต่เดี๋ยวก่อน มีความแปลกใหม่ในสิ่งนี้: ฉันอธิบายวิธีการวัดความถี่ที่สูงกว่าไมโครคอนโทรลเลอร์ (MCU) ที่สามารถทนได้มากและรอบการทำงานของสัญญาณ - ทั้งหมดในเวลาเดียวกัน!

ช่วงความถี่ของอุปกรณ์มีตั้งแต่ ~43 Hz ถึง ~ 450 kHz ในขณะที่รอบการทำงานมีตั้งแต่ 1% ถึง 99%

ให้ฉันอธิบายส่วน "สามารถแบกรับ": MCU วัดระยะเวลาของสัญญาณคลื่นสี่เหลี่ยม T โดยการติดตามเวลาระหว่างสองเหตุการณ์การเปลี่ยนแปลงที่ตามมา ตัวอย่างเช่น แรงดันไฟฟ้าต่ำถึงสูงจะกระโดดบนพิน I/O อันใดอันหนึ่ง มันทำได้โดยการนับจำนวนพัลส์ของนาฬิกาภายในของมันเอง อย่างไร้เดียงสา ขีดจำกัดบนสำหรับความถี่ที่วัดได้ควรเป็นไปตามทฤษฎีบทการสุ่มตัวอย่าง Nyqvist-Shannon กล่าวคือ มันจะเท่ากับครึ่งหนึ่งของความถี่สัญญาณนาฬิกาของ MCU ในความเป็นจริง ขีดจำกัดต่ำกว่ามาก เนื่องจาก MCU ต้องรันโค้ดเพื่อจัดการกับการขัดจังหวะ บันทึกตัวแปร ทำการคำนวณทางคณิตศาสตร์ แสดงผล ฯลฯ ในการทดลองของฉันกับ MCU 48 MHz จำนวนรอบสัญญาณนาฬิกาที่น้อยที่สุดระหว่างการเปลี่ยนภาพที่วัดได้คือ ประมาณ 106 ดังนั้น ขีดจำกัดบนของช่วงความถี่ที่วัดได้ในกรณีนี้คือ 48, 000 / 212 / 2 = 226.4 kHz

ในขณะที่ MCU วัดระยะเวลาของสัญญาณ ก็สามารถกำหนดความกว้างพัลส์ได้ P: เวลาของแรงดันสัญญาณยังคงสูง กล่าวอีกนัยหนึ่งคือ เวลาระหว่างการเปลี่ยนจากต่ำไปสูงและสูงไปต่ำ รอบหน้าที่ของสัญญาณถูกกำหนดเป็นเปอร์เซ็นต์ต่อไปนี้:

ภาษี = 100% * P / T

เช่นเดียวกับในกรณีของความถี่ มีการจำกัดความกว้างของพัลส์ในทางปฏิบัติ จากตัวอย่างข้างต้น 106 รอบนาฬิกาจะจำกัดความกว้างของพัลส์ให้ไม่น้อยกว่า 2.21 ไมโครวินาที หรือไม่น้อยกว่า 50% ที่ 226.4 kHz

วิธีหนึ่งในการเพิ่มขีดจำกัดความถี่บนของสัญญาณคลื่นสี่เหลี่ยมคือการประยุกต์ใช้ตัวแบ่งดิจิทัลที่ใช้รองเท้าแตะ การแบ่งความถี่อินพุตด้วย n จะขยายช่วงบนที่วัดได้ n ครั้ง นี่เป็นข่าวดี ตัวแบ่งดิจิทัลมีข้อบกพร่องพื้นฐานอย่างหนึ่ง: สัญญาณที่แบ่งจะสูญเสียข้อมูลความกว้างพัลส์ (และรอบการทำงาน)! เนื่องจากวิธีการทำงานของตัวแบ่ง ผลผลิตจึงมีรอบการทำงาน 50% เสมอ คนเกียจคร้าน…

อย่างไรก็ตาม ในหน้าต่อไปนี้ ฉันจะแสดงวิธีแบ่งความถี่แบบดิจิทัลและรักษาความกว้างพัลส์ดั้งเดิมไว้ ทำให้ฉันวัดสัญญาณได้ดีกว่าขีดจำกัดที่กำหนดโดยการนับโดยตรง

ขั้นตอนที่ 1: กองความถี่ดิจิตอล

กองความถี่ดิจิตอล
กองความถี่ดิจิตอล
กองความถี่ดิจิตอล
กองความถี่ดิจิตอล
กองความถี่ดิจิตอล
กองความถี่ดิจิตอล

ตัวแบ่งความถี่ดิจิตอลแบบดั้งเดิมใช้รองเท้าแตะ บทช่วยสอนนี้อธิบายหลักการอย่างดีถึงวิธีสร้างตัวแบ่งโดยใช้รองเท้าแตะ JK มาตรฐาน วิธีนี้ช่วยแก้ปัญหาความถี่อินพุตสูงเกินไปสำหรับ MCU แต่มีข้อเสียเปรียบหลักประการหนึ่ง: สัญญาณที่แบ่งจะมีรอบการทำงาน 50% โดยไม่คำนึงถึงหน้าที่ของสัญญาณอินพุต! เพื่อดูว่าเหตุใดจึงเป็นกรณีนี้ ให้ดูที่ตัวเลขสองตัวแรก สัญญาณดั้งเดิมที่มีคาบ T และความกว้างของพัลส์ P จะถูกป้อนเข้าในพินนาฬิกาของฟลิปฟล็อป JK ในขณะที่พิน J และ K ของมันจะอยู่ในระดับสูงตลอดเวลา (รูปแรก) ตรรกะ 3.3V จะถือว่าตลอด สมมติว่า flip-flop ถูกกระตุ้นโดยขอบด้านบวก (เช่น ที่เพิ่มขึ้น) ของนาฬิกา ภายใต้เงื่อนไขเหล่านี้ การเปลี่ยนแปลงสถานะของพินเอาต์พุต ("flips" และ "flops แต่ละรายการ") จะเกิดขึ้นทุกครั้งที่พินนาฬิกาเปลี่ยนจากต่ำไปสูง การเปลี่ยนจากสูงไปต่ำของนาฬิกา (เช่น ขอบด้านลบ) จะถูกละเว้นโดยสิ้นเชิง ดูรูปที่สอง พินเอาต์พุต Q ส่งสัญญาณซึ่งมีคาบยาวเป็นสองเท่าของคาบเดิม นั่นคือ ความถี่จะลดลงครึ่งหนึ่ง ความกว้างพัลส์ของเอาต์พุตจะเท่ากับ T เสมอ ดังนั้น ความกว้างพัลส์ดั้งเดิม P จะหายไป

การเพิ่ม JK flip-flop อีกตัวในรูปแบบที่แสดงในรูปที่สามจะแบ่งความถี่เดิมออกเป็น 4 การเพิ่ม flip-flops ในลักษณะต่อเนื่องเดียวกันจะแบ่งความถี่ตามยกกำลัง 2: 8, 16, 32 เป็นต้น

ปัญหา: จะแบ่งความถี่ของคลื่นสี่เหลี่ยมในขณะที่คงความกว้างของพัลส์ได้อย่างไร?

แนวคิดคือการเพิ่มขอบเชิงลบที่เรียก JK flip-flop ลงในมิกซ์อย่างเหมาะสม เรียกมันว่า "เน็ก FF"; ดูรูปที่สี่ ในที่นี้ "อย่างถูกต้อง" หมายความว่าหมุด J และ K ของฟลิปฟล็อปใหม่เชื่อมโยงกับพินเอาต์พุต Q และ Qbar ตามลำดับของตัวหารด้วย-4 ("Pos FF") ที่แสดงในรูปก่อนหน้า (ในที่นี้ "แถบ" คือแถบแนวนอนเหนือสัญลักษณ์ Q ซึ่งแสดงถึงการปฏิเสธเชิงตรรกะ) หากต้องการดูว่าสิ่งนี้บรรลุผลสำเร็จหรือไม่ ให้ดูที่ตารางฟังก์ชันของ "Neg FF" ในรูปที่ห้า: หมุดเอาต์พุตของ Neg, Q และ Qbar สะท้อนสถานะของพินอินพุต J และ K ตามลำดับ ซึ่งหมายความว่าสะท้อนสถานะของ Q และ Qbar ของ Pos แต่การกระทำพลิกกลับของ Neg ต้องรอขอบลบของสัญญาณดั้งเดิมซึ่งมาถึงเวลา P หลังจากขอบบวก อ้า!

รูปคลื่นที่ได้จะแสดงในรูปที่หก "Pos Q" ส่งสัญญาณออกที่ความถี่ 1/4 "Pos Qbar" เป็นแบบผกผัน "Neg Q" ตามหลัง "Pos Q" ที่เปลี่ยนตามความกว้างพัลส์ P และ "Neg Qbar" คือผกผัน คุณสามารถตรวจสอบว่าตรรกะ AND ของ "Pos Qbar" และ "Neg Q" สร้างพัลส์เทรนที่มีความกว้างพัลส์ดั้งเดิม P และความถี่ 1/4 บิงโก!

ตอนแรกฉันใช้สัญญาณเอาท์พุตนี้เพื่อป้อน MCU อย่างไรก็ตาม มันกลับกลายเป็นปัญหาสำหรับความกว้างพัลส์ที่สั้นมาก เนื่องจากข้อจำกัด 106 รอบของ MCU ที่กล่าวถึงในบทนำ ฉันได้แก้ไขปัญหาเล็กๆ นี้โดยเลือกผลลัพธ์อื่น: "Pos Qbar" และ "Neg Qbar" แทน การดูรูปคลื่นครั้งหนึ่งควรโน้มน้าวคุณว่าความกว้างพัลส์ของรูปคลื่นเฉพาะนี้ P' จะแตกต่างกันไประหว่าง T และ 2T แทนที่จะเป็นช่วง (0, T) สำหรับ P คุณสามารถกู้คืน P ได้อย่างง่ายดายจาก P' โดย:

P = 2T - พี'

ขั้นตอนที่ 2: ฮาร์ดแวร์ที่แนะนำ

ฮาร์ดแวร์ที่แนะนำ
ฮาร์ดแวร์ที่แนะนำ
ฮาร์ดแวร์ที่แนะนำ
ฮาร์ดแวร์ที่แนะนำ
ฮาร์ดแวร์ที่แนะนำ
ฮาร์ดแวร์ที่แนะนำ

ฉันชอบผู้มาใหม่ที่เป็นญาติกับมือสมัครเล่นอิเล็กทรอนิกส์: Atmel SAM D21 MCU ที่ใช้โปรเซสเซอร์ ARM Cortex M0+ แบบ 32 บิตที่ทำงานที่อัตรานาฬิกา 48 MHz ซึ่งสูงกว่า Atmels รุ่นเก่ามาก สำหรับโครงการนี้ฉันซื้อ:

  • บอร์ด ItsyBitsy M0 Express จาก Adafruit
  • ฉันบังเอิญมีแบตเตอรี่ LiPo แบบชาร์จไฟได้จาก Adafruit
  • จอแสดงผล OLED ขาวดำ 128x32 SPI (คุณเดาว่า: Adafruit)
  • รองเท้าแตะ JK flip-flop ขอบบวก SN74HC109 จาก Texas Instruments
  • รองเท้าแตะ JK flip-flop ขอบลบแบบคู่ SN74HC112 จาก Texas Instruments
  • สี่เท่าและเกท CD74AC08E จาก Texas Instruments
  • สี่หรือประตู CD74AC32E จาก Texas Instruments

ขั้นตอนที่ 3: วงจร

The Circuit
The Circuit
The Circuit
The Circuit

รูปแรกแสดงแผนผังอย่างง่ายของเครื่องวัดความถี่/หน้าที่ ตรรกะ 3.3 V CMOS ถูกสันนิษฐานไว้ตลอด ดังนั้นแอมพลิจูดของคลื่นสี่เหลี่ยมอินพุตต้องอยู่ระหว่าง V. ที่สอดคล้องกันIH ระดับ (เช่น 2 V) และ 3.3 V หากไม่เป็นเช่นนั้น คุณต้องปรับขนาดขึ้นหรือลงตามลำดับ ในกรณีส่วนใหญ่ ตัวแบ่งแรงดันไฟฟ้าแบบธรรมดาก็เพียงพอแล้ว หากคุณต้องการออกแบบมาตรวัดในแบบของคุณในระดับตรรกะที่ต่างออกไป คุณต้องใช้ไมโครคอนโทรลเลอร์ (MCU) แบตเตอรี่ และจอแสดงผลที่ทำงานในระดับที่ต้องการ ลอจิกเกทและฟลิปฟลอปที่ใช้ในโปรเจ็กต์นี้ทำงานกับระดับลอจิกที่ใดก็ได้ระหว่าง 2 V ถึง 6 V และน่าจะใช้ได้ในกรณีส่วนใหญ่

ดังที่แสดง ItsyBitsy MCU ใช้พิน 9-13 เพื่อสื่อสารกับจอแสดงผลผ่านโปรโตคอล SPI ของซอฟต์แวร์ พิน 3V ส่งพลังงานไปยังวงจรทั้งหมด พินอินพุตดิจิตอล 3 ยอมรับสัญญาณที่วิเคราะห์แล้ว ในขณะที่พิน 2 และ 4 ควบคุมแหล่งสัญญาณ: สัญญาณตรงที่มาจากเกต AND3 (ความถี่อินพุตต่ำ) หรือสัญญาณหารด้วย 4 ผ่านเกต AND4 (ความถี่อินพุตสูง) ตามที่อธิบายไว้ในขั้นตอนที่ 2 โค้ดที่กล่าวถึงในขั้นตอนต่อไปจะตรวจจับช่วงความถี่ขาเข้าโดยอัตโนมัติและสลับแหล่งสัญญาณอย่างเหมาะสม

แผนผังไม่ได้แสดงความซับซ้อนที่แท้จริงของการเชื่อมต่อชิปดิจิทัล ภาพที่สองแสดงให้เห็นว่าโครงการจะมีลักษณะอย่างไรบนเขียงหั่นขนม สัญญาณอินพุตมาจากสายสีแดงไปยังพิน 2CLK ของฟลิปฟล็อปขอบบวกคู่ ข้อควรระวัง: โดยปกติ หมุด J และ K ทั้งหมดของฟลิปฟล็อปนี้ควรอยู่ในระดับสูง แต่ SN74HC109 มีลักษณะเฉพาะของพิน Kbar - พิน K กลับหัว - แทน ดังนั้นหมุดนี้จะต้องต่อสายดิน! ฟลิปฟล็อปขอบลบตัวแรกใน SN74HC112 มีพิน 1K และ 1J เชื่อมต่อกับพิน 1Q และ 1Qbar ของ SN74HC109 ฟลิปฟล็อปตัวที่สองใน SN74HC112 ไม่ได้ใช้งานและพินอินพุต (2K, 2J, 2CLRbar) ต่อสายดิน หมุดพิเศษอื่น ๆ ทั้งหมด PREbar (พรีเซ็ต) และ CLRbar (ชัดเจน) ในฟลิปฟลอปทั้งหมดจะต้องเชื่อมต่อกับลอจิคัลไฮ นาฬิกาที่ไม่ได้ใช้และพินเอาต์พุตจะไม่เชื่อมต่อกัน ในทำนองเดียวกัน พินอินพุตที่ไม่ได้ใช้ในเกตทั้งหมดจะถูกต่อสายดิน ในขณะที่พินเอาต์พุตที่ไม่ได้ใช้จะไม่ถูกเชื่อมต่อ ตามที่ฉันพูดถึงในคำแนะนำ "นักฆ่าที่มองไม่เห็นของเสียงเรียกเข้าโทรศัพท์" การต่อสายดินของชิปตรรกะที่ไม่ได้ใช้กราวด์จะกำจัดการสั่นแบบสุ่มและประหยัดพลังงานแบตเตอรี่

ขั้นตอนที่ 4: โค้ดและการวัดความถี่ต่ำ

โดยธรรมชาติแล้ว การดำเนินการทั้งหมดจะเกิดขึ้นในโค้ดที่ลิงก์ด้านล่าง เมื่ออินพุตขาเข้าบนพิน 3 เปลี่ยนจากดิจิตอลต่ำไปสูง MCU จะเริ่มนับพัลส์ของนาฬิกา 48 MHz ภายใน โดยจะบันทึกช่วงเวลาของการเปลี่ยนจากสูงไปต่ำและนับต่อไปจนถึงสวิตช์จากต่ำไปสูงครั้งถัดไป เมื่อรีสตาร์ทกระบวนการทั้งหมดอีกครั้ง การนับครั้งแรกแสดงถึงความกว้างของพัลส์ ในขณะที่การนับทั้งหมดแสดงถึงระยะเวลาของสัญญาณ และนั่นคือความลับทั้งหมด

CPU บันทึกการเปลี่ยนแปลงเหล่านี้ผ่านการขัดจังหวะของฮาร์ดแวร์ SAMD21 มีนาฬิกาหลายเรือน รหัสของฉันใช้รหัส TC3 เริ่มแรก ฉันเริ่มต้นด้วยการอ่านแผ่นข้อมูลของ M0 ที่ใช้ความพยายามอย่างมากในการเขียนโค้ดตัวจัดการการขัดจังหวะ แต่ในไม่ช้า ฉันก็ค้นพบโค้ดที่เกี่ยวข้องอย่างมากในโพสต์ฟอรัม Arduino โดยผู้ใช้ electro_95, MartinL และ Rucus ซึ่งมีส่วนร่วม รับทราบโดยถูกต้อง ฉันรวมและแก้ไขรหัสที่รวมกันเป็นของฉัน ช่วยฉันประหยัดเวลาได้มาก!

ดังที่ฉันได้กล่าวไว้ก่อนหน้านี้ ความละเอียดของสัญญาณถูกจำกัดโดย ~106 รอบของ CPU เพื่อรันโค้ดระหว่างอินเตอร์รัปต์ แผนกดิจิตอลพร้อมการรักษาความกว้างพัลส์ดูแลความถี่สูง ในทางกลับกัน ความถี่ต่ำทำให้เกิดความท้าทายอีกประการหนึ่ง เนื่องจากตัวนับนาฬิกา TC3 ยาว 16 บิต จึงล้นหลังจากผ่านขีดจำกัด 65, 536 จำนวนนับ หนึ่งสามารถจัดการกับสถานการณ์นี้โดยการเพิ่มอินเตอร์รัปต์ล้น แต่เลือกโซลูชันอื่น: TC3 สามารถใช้นาฬิกา CPU แบบ prescaled (เช่นซอฟต์แวร์แบ่ง) แทนฮาร์ดแวร์ 48 MHz หนึ่ง ดังนั้น หากระยะเวลาของสัญญาณใกล้ถึงขีดจำกัดโอเวอร์โฟลว์ โค้ดสามารถสั่งให้ TC3 ใช้การนับ 24 MHz สำหรับช่วงเวลาถัดไป และ voila ตัวนับจะลดลงต่ำกว่า 32, 768 นับ สำหรับความถี่ที่ต่ำกว่านั้น TC3 สามารถสั่งให้นับพัลส์ 12 MHz เป็นต้น พรีสเกลเลอร์ที่เหมาะสมจะถูกกำหนดโดยอัตโนมัติตามความถี่ของสัญญาณด้วยฮิสเทรีซิส เพื่อให้ตัวนับ TC3 อยู่ภายในขีดจำกัดโอเวอร์โฟลว์ เป็นผลให้ช่วงล่างสุดของอุปกรณ์อยู่ที่ประมาณ 43 Hz

คุณสามารถแยกโค้ดและใช้ในโครงการของคุณได้ แต่โปรดระบุแหล่งที่มาเมื่อเผยแพร่ผลลัพธ์

เชื่อมโยงไปยังรหัส

แนะนำ: