Arduino สามารถส่งออกความถี่พาหะเฉพาะ (เช่น 56 kHz) ได้อย่างไร?


9

ฉันกำลังทำงานในโครงการทัศนศาสตร์อวกาศเพื่อส่งข้อมูลแบบไร้สายระหว่างสองจุด เพื่อให้บรรลุผลนี้ฉันใช้ IR LED เชื่อมต่อกับ Arduino Uno ที่พัลส์ด้วยความถี่ตัวส่งสัญญาณ 56 kHz สำหรับเครื่องส่งสัญญาณและ Arduino ตัวที่สองที่มีโมดูลตัวตรวจจับ IR 56 kHz สำหรับตัวรับสัญญาณ

ฉันพยายามใช้ delayMicroseconds () ระหว่างคำสั่ง pin high และ pin low เพื่อสร้างความถี่ของผู้ให้บริการ งานประเภทนี้ แต่ความถี่ไม่เหมือนกันเสมอและความล่าช้าเพิ่มเติมใด ๆ สำหรับการส่งสัญญาณ (เช่นเวลาที่ต้องใช้ในการเรียกใช้ฟังก์ชั่นและการลดลง) สามารถเปลี่ยนแปลงได้

การอ่านแผ่นข้อมูลสำหรับ ATmega328 ดูเหมือนว่ามีวิธีการตั้งค่าพัลส์ที่แม่นยำยิ่งขึ้นโดยใช้ตัวจับเวลาของชิป เป็นไปได้และถ้าเป็นเช่นนั้นคุณจะสร้างพัลส์ 56 kHz โดยใช้ตัวจับเวลาได้อย่างไร?


อะไรคือความถูกต้องที่คุณต้องการสำหรับความถี่ 56KHz ของคุณ? นั่นคือช่วงความถี่ที่ยอมรับได้ในโครงการของคุณ? ฉันถามเพราะใช้ตัวจับเวลา Arduino เพียงอย่างเดียวความแม่นยำมีข้อ จำกัด
jfpoilpret

55.5khz ถึง 56.5khz จะเหมาะสมที่สุดเพื่อรักษาระดับการตอบสนองที่สูงในเครื่องตรวจจับ
jlbnjmn

คำตอบ:


10

มันย่อมเป็นไปได้ที่จะสร้างสัญญาณ 56 เฮิร์ทซ์กับ Arduino จับเวลา

จริง ๆ ตัวจับเวลาสามารถถูกลงทะเบียนพิเศษใน MCU ที่เก็บค่า (เริ่มต้นที่ 0) ที่เพิ่มขึ้นที่ความถี่นั่นคือความถี่สัญญาณนาฬิกาของ MCU (16 MHz บน Arduino Uno) ความเป็นไปได้หารด้วยปัจจัยที่เรียกว่าพรีสเกลเลอร์ เมื่อค่านั้นถึงขีด จำกัด เรียกว่าเปรียบเทียบการจับคู่ที่คุณระบุจากนั้นเกิดขึ้นสองสิ่ง:

  • ค่ารีจิสเตอร์ตัวจับเวลาถูกรีเซ็ตเป็น 0
  • ISRหนึ่งครั้ง(รูทีนการบริการขัดจังหวะ) ฟังก์ชันเรียกกลับ (คุณสามารถกำหนดให้ชี้ไปที่รหัสของคุณเอง)

แนวคิดคือใช้ ISR นั้นเพื่อเปลี่ยนเอาต์พุตของโลจิคัลพินทุกครั้งที่ถูกเรียก ( HIGHจากLOWนั้นจากนั้นHIGH... )

ตอนนี้เพื่อสร้างคลื่นสี่เหลี่ยมที่ความถี่ 56 kHz คุณจะต้องใช้ ISR ของคุณเรียกว่า56000 * 2ครั้งต่อวินาที ( * 2เพราะคุณต้องเปลี่ยนค่าเอาต์พุตสองครั้งต่อรอบระยะเวลา)

คุณสามารถเลือกค่าพรีสเกลเลอร์ที่คุณต้องการสำหรับตัวจับเวลาในรายการต่อไปนี้:

  • 1 (ความถี่สัญญาณนาฬิกาไม่ถูกแบ่งดังนั้น 16 MHz)
  • 8 (ความถี่สัญญาณนาฬิกาถูกหารด้วย 8 ดังนั้น 2 MHz)
  • 64
  • 256
  • 1024

มีตัวจับเวลา / ตัวนับสองขนาดใน Arduino Uno (เรียกว่าตัวจับเวลา / ตัวนับจริง): 8 บิตและ 16 บิต

ใน Arduino Uno (ATmega328P) คุณมีตัวจับเวลาทั้งหมดสามตัว แต่บางตัวอาจถูกใช้โดย Arduino core library หรือไลบรารีอื่น ๆ ที่ใช้ในสเก็ตช์ของคุณ (คุณต้องตรวจสอบด้วยตัวเอง):

  • timer0 (8 บิต)
  • timer1 (16 บิต)
  • timer2 (8 บิต): อันนี้มีตัวเลือกการตั้งค่าล่วงหน้าเพิ่มเติม (1, 8, 32, 64, 128, 256 และ 1024)

ตอนนี้คุณต้องสร้างคลื่น 56 kHz จาก 16 MHz ดังนั้นโดยไม่ต้องตั้งค่าล่วงหน้าคุณจะต้องนับเป็น:

16000000 / (56000 * 2) - 1 = 141.857( - 1เนื่องจากตัวจับเวลานับจาก 0 ถึงค่านี้และรีเซ็ตเฉพาะเมื่อถึงเวลาแล้ว)

จากการคำนวณนี้เราสามารถวาดการสังเกตสองแบบ:

  1. 141.857 ไม่ใช่จำนวนเต็มดังนั้นคุณจะไม่สามารถสร้างคลื่นได้ที่ 56 kHz
  2. คุณต้องใช้ตัวจับเวลา 16 บิตเนื่องจาก 285 ไม่สามารถแทนค่าได้เป็นจำนวนเต็ม 8 บิตที่ไม่ได้ลงชื่อ

จากนี้คุณมีสองตัวเลือก:

  1. ใช้การจับเวลา 16 บิต ( timer1 ) ใช้ prescaler = 1 และเลือก142เป็นคู่เปรียบเทียบ; ที่จะให้ความถี่ต่อไปนี้:16000000 / (2 * (142 + 1)) = 55944 Hz
  2. ใช้ตัวจับเวลา 8 บิต ( timer0 ) ใช้ prescaler = 8 และเลือก17เป็นการเปรียบเทียบแบบเปรียบเทียบ ที่จะให้ความแม่นยำน้อยลงด้วยความถี่ต่อไปนี้: 16000000 / (8 * 2 * (17 + 1)) = 55555 Hzซึ่งยังอยู่ในช่วงที่ต้องการ

ตอนนี้เกี่ยวกับวิธีการเขียนแบบร่างของคุณฉันขอแนะนำให้คุณตรวจสอบคำแนะนำนี้ซึ่งสมบูรณ์มากและน่าสนใจมากที่จะอ่าน

แน่นอนว่าแผ่นข้อมูลที่สมบูรณ์ของ ATmega328Pก็มีความสำคัญเช่นกันหากคุณต้องการที่จะเข้าใจในรายละเอียดเล็ก ๆ น้อย ๆ ว่าคุณกำลังทำอะไรอยู่

หมายเหตุสำคัญบางประการ:

  • ISR จะถูกประหารด้วยการขัดจังหวะการใช้งานและจะต้องสั้นที่สุดเท่าที่จะทำได้ โดยเฉพาะอย่างยิ่งมีฟังก์ชั่นหลายอย่างจากห้องสมุด Arduino ที่จะไม่ถูกเรียกจาก ISR
  • นาฬิกา Arduino Uno นั้นไม่แม่นยำมาก (ใช้ resonator แบบเซรามิกแทนควอตซ์ซึ่งจะแม่นยำมากกว่านี้มาก) ดังนั้นนี่หมายความว่าความถี่เอาต์พุตจะเปลี่ยนไปมากขึ้น

2
นอกจากนี้เมื่อถึงขีด จำกัด ที่ระบุฮาร์ดแวร์สามารถสลับพินได้ ดังนั้นไม่จำเป็นต้องใช้ ISR เลย จะมีการกระวนกระวายใจกับ ISR เสมอเพราะคำสั่งไม่สามารถถูกขัดจังหวะเมื่อเริ่มต้น อย่างไรก็ตามฮาร์ดแวร์จะสลับเข็มในอัตราที่ต้องการเสมอ
Nick Gammon

เป็นเรื่องที่น่าแปลกใจที่ Arduino Uno ใช้ตัวสะท้อนความร้อนแบบเซรามิก แต่แหล่งที่มาของมันคือArduino UNO FAQ (ใกล้กับ"Uno ใช้ตัว resonator หรือคริสตัลสำหรับนาฬิกาตัวประมวลผลหรือไม่?" )
Peter Mortensen

3

ฉันพบว่าtone()มีประโยชน์สำหรับการสร้างพัลส์ความถี่สูงที่ขาใด ๆ มันควรจะสามารถจัดการ 56 KHz (แก้ไข: ตามที่บันทึกไว้โดย jfpoilpret ความใกล้เคียงที่สุดที่คุณจะได้รับบน Arduino 16 MHz ประมาณ 55.944 KHz)

ความยากจะรวมเข้ากับสัญญาณข้อมูลของคุณได้อย่างชัดเจน ฉันไม่คิดว่าคุณสามารถทำได้ในซอฟต์แวร์โดยไม่ต้องหันไปใช้รหัสระดับต่ำ มันควรจะง่ายในฮาร์ดแวร์แม้ว่าเนื่องจากเป็นดิจิตอล

สิ่งที่คุณต้องทำก็คือส่งสัญญาณข้อมูลของคุณบนพินที่แตกต่างจากนั้นรวมเข้ากับผู้ให้บริการโดยใช้เกทและ สัญญาณรวมสามารถตรงไปที่เครื่องส่งสัญญาณ IR ของคุณ

หากคุณไม่มีประตู AND และก็สะดวกที่จะสร้างของคุณเองโดยใช้ทรานซิสเตอร์คู่หนึ่ง เพียงค้นหาออนไลน์สำหรับ "ทรานซิสเตอร์และเกต"


ตัวรับมักจะมีเอาต์พุตที่ใช้งานต่ำโดยทั่วไป หากคุณเชื่อมต่อด้านบนของ LED ไปที่ 56khz และด้านล่างของพินข้อมูลของคุณเมื่อพินข้อมูลลดต่ำลงคุณจะได้รับเอาต์พุต IR ซึ่งควรทำให้แอมป์ต่ำ ไม่จำเป็นต้องมีเกทเพียงแค่ไฟ LED และตัวต้านทาน ปัญหาเท่านั้นที่ถูก จำกัด อยู่กับสิ่งที่หมุด io ​​ปัจจุบันสามารถขับได้
EternityForest

2

คำตอบที่ได้รับการยอมรับของ 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

  1. ISR - รูทีนการบริการขัดจังหวะ (นี่คือรหัสที่จะถูกดำเนินการเฉพาะในการขัดจังหวะที่สร้างขึ้น)
  2. โปรแกรมของคุณมีขนาดใหญ่เท่าใดขึ้นอยู่กับขนาดหน่วยความจำ! มันไม่มีส่วนเกี่ยวข้องกับความเร็วสัญญาณนาฬิกาและไม่เกี่ยวข้องกับความถี่ที่คุณเรียกว่า ISR
  3. เมื่อไมโครคอนโทรลเลอร์เริ่มต้นด้วยคำสั่งโปรแกรมตัวนับจะเพิ่มขึ้น หากมีการสร้างอินเตอร์รัปต์ ISR จะถูกเรียกใช้และค่านี้จะถูกเก็บไว้ในรีจิสเตอร์พิเศษ เมื่อรหัส ISR เสร็จสมบูรณ์ค่าของตัวนับโปรแกรมจะถูกกู้คืนจากการลงทะเบียนพิเศษนี้และโปรแกรมจะดำเนินการต่อจากที่ที่มันถูกขัดจังหวะราวกับว่ามันไม่เคยเกิดขึ้น

    ฉันจะยกตัวอย่างที่โง่เง่ามาก หากคุณเป็นคนเจ้าระเบียบฉันขอเตือนคุณว่าอาจมีเลือดออกในจมูกและตา

    ลองนึกภาพคุณต้องเดินจากที่หนึ่งไปยังที่อื่น คำแนะนำเส้นทางแบบทีละขั้นตอนคือโปรแกรมหลักของคุณและคำสั่งต่าง ๆ ความเร็วในการเดินหรือวิ่งของคุณขึ้นอยู่กับ "ความเร็วสัญญาณนาฬิกา" ของคุณ แต่ไม่ได้อยู่ในคำแนะนำเส้นทาง (30 ก้าวไปข้างหน้า 1 เลี้ยว 90 องศาซ้าย, 10 ก้าวไปข้างหน้า, 10 ก้าวไปข้างหน้า 45 องศาขวา ฯลฯ ) . ทีนี้ลองนึกภาพเด็กตัวเล็ก ๆ หรือนักการเมืองท้องถิ่นที่โลภมากแล้วถอดรองเท้าของคุณออกแล้ว นี่คือเหตุการณ์ที่สร้างการขัดจังหวะ จากนั้นคุณหยุดหลังจากก้าวสุดท้ายของคุณคุกเข่าและผูกรองเท้าอีกครั้ง นี่คือโปรแกรม ISR ของคุณ

    จากนั้นคุณต่อจากที่ที่คุณหยุด คุณไม่เริ่มจากจุดเริ่มต้น เมื่อคุณเดินอย่างไร้กังวลในโลกนี้และตลอดเวลาคุณไม่สนใจแม้ว่าคุณจะต้องผูกรองเท้าทุกขั้นตอน หากคุณทำเช่นนั้นด้วยการ จำกัด เวลาเช่นวิ่งในระยะ 100 เมตรในการแข่งขันกีฬาโอลิมปิก (หรือวิ่งจากนักล่าที่กินเนื้อหิว) การหยุดและผูกรองเท้าของคุณอาจทำให้เกิดผลกระทบร้ายแรง เช่นเดียวกับไมโครคอนโทรลเลอร์ แม้ว่าคุณจะรันโค้ดเพียงหนึ่งบรรทัดโปรแกรมของคุณจะทำงานต่อไปแม้ว่าจะช้า หากคุณไม่สนใจความเร็วเลยมันจะไม่มีปัญหา หากคุณต้องทำบางเวลาที่เกี่ยวข้องเช่นการใช้การกระทำที่ขึ้นอยู่กับตัวจับเวลาอื่น ๆ การรบกวนอาจไม่เป็นที่ต้องการและเป็นปัญหา

  4. น้อยกว่ามาก! นาฬิกาที่เร็วกว่านั้นไม่ได้ดีกว่าเสมอไป อุปกรณ์ที่โอเวอร์คล็อกช้ากว่าจะใช้พลังงานน้อยกว่ามาก นี่อาจเป็นจุดสำคัญในอุปกรณ์ที่ใช้แบตเตอรี่

  5. รอบที่ต้องการมาจากสูตรนี้:
    (ความเร็วสัญญาณนาฬิกา / (ค่าพรีสเกลเลอร์ * ต้องการความถี่การโทร ISR)) - 1


TLDR: Desolder เซรามิก oscillator 16 MHz และแทนที่ด้วยอื่นที่ช่วยให้ว่า 56 เฮิร์ทซ์โดยแบ่งจำนวนเต็ม (เช่น 14 MHz และหารด้วย 250)
Peter Mortensen

0

คุณสามารถเปิดและปิดผู้ให้บริการได้ง่ายๆโดยการสลับโหมดผู้ให้บริการพินระหว่างเอาท์พุทและอินพุต ฉันใช้สิ่งนี้เพื่อควบคุมปั๊มความร้อนผ่านพอร์ตอินฟราเรด (รีโมทควบคุม) 37KHz


0

ไม่จำเป็นต้องใช้ ISR เพื่อสร้างผู้ให้บริการ เพียงตั้งค่าตัวจับเวลาเพื่อผลิตเอาต์พุต PWM 50% ที่ความถี่ผู้ให้บริการที่ต้องการ ISR นั้นทำหน้าที่ควบคุมการขนส่ง - โดยทั่วไปจะอยู่ที่ 0.5 หรือ 1 มิลลิวินาที - อัตราที่สะดวกสบายกว่า จากประสบการณ์ของฉันข้อผิดพลาด 5% ในความถี่ของผู้ให้บริการนั้นได้รับการยอมรับจากตัวรับสัญญาณ IR ส่วนใหญ่ ฉันใช้ Freetronics EtherMega 2560 (ซึ่งมีตัวจับเวลาจำนวนมาก) แต่ฉันมั่นใจว่าซีพียูอื่น ๆ จะทำเช่นกัน


การมอดูเลตของผู้ให้บริการนั้นถูกนำมาใช้จริง ๆ การเปลี่ยนโหมดสำหรับหมุดจับเอาท์พุทตัวจับเวลาระหว่างอินพุต (ตัวยึด off) และเอาต์พุต (ตัวยึดเปิด)
Peter Mortensen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.