สารบัญ:

Arduino Waveform Generator: 5 ขั้นตอน (พร้อมรูปภาพ)
Arduino Waveform Generator: 5 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: Arduino Waveform Generator: 5 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: Arduino Waveform Generator: 5 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: How to build an Arduino Signal Generator 2024, พฤศจิกายน
Anonim
Arduino Waveform Generator
Arduino Waveform Generator

อัปเดต ก.พ. 2021: ลองใช้เวอร์ชันใหม่ที่มีอัตราการสุ่มตัวอย่าง 300x ตาม Raspberry Pi Pico

ในห้องปฏิบัติการ เรามักต้องการสัญญาณซ้ำๆ ของความถี่ รูปร่าง และแอมพลิจูดที่แน่นอน อาจเป็นการทดสอบเครื่องขยายเสียง ตรวจสอบวงจร ส่วนประกอบหรือแอคทูเอเตอร์ เครื่องกำเนิดสัญญาณรูปคลื่นอันทรงพลังมีวางจำหน่ายทั่วไป แต่การสร้างเครื่องกำเนิดสัญญาณที่มีประโยชน์ด้วยตนเองด้วย Arduino Uno หรือ Arduino Nano นั้นค่อนข้างง่าย ดูตัวอย่าง:

www.instructables.com/id/Arduino-Waveform-…

www.instructables.com/id/10-Resister-Ardui…

นี่คือคำอธิบายของอีกอันหนึ่งที่มีคุณสมบัติดังต่อไปนี้:

* รูปคลื่นที่แม่นยำ: เอาต์พุต 8 บิตโดยใช้ R2R DAC, รูปร่างตัวอย่าง 256 ตัวอย่าง

* เร็ว: อัตราการสุ่มตัวอย่าง 381 kHz

* แม่นยำ: ช่วงความถี่ขั้นตอน 1mHz แม่นยำเหมือนคริสตัล Arduino

* ใช้งานง่าย: ตั้งค่ารูปคลื่นและความถี่ได้ด้วยตัวเข้ารหัสแบบหมุนเดี่ยว

* ช่วงกว้างของแอมพลิจูด: มิลลิโวลต์ถึง 20V

* 20 รูปคลื่นที่กำหนดไว้ล่วงหน้า ตรงไปตรงมาเพื่อเพิ่มมากขึ้น

* ทำง่าย: Arduino Uno หรือ Nano plus ส่วนประกอบมาตรฐาน

ขั้นตอนที่ 1: ข้อควรพิจารณาทางเทคนิค

การสร้างสัญญาณแอนะล็อก

ข้อบกพร่องประการหนึ่งของ Arduino Uno และ Nano คือไม่มีตัวแปลงสัญญาณดิจิทัลเป็นแอนะล็อก (DAC) ดังนั้นจึงเป็นไปไม่ได้ที่จะส่งสัญญาณแรงดันแอนะล็อกบนพินโดยตรง ทางออกหนึ่งคือบันได R2R: 8 พินดิจิตอลเชื่อมต่อกับเครือข่ายตัวต้านทานเพื่อให้สามารถเข้าถึงเอาต์พุต 256 ระดับ ด้วยการเข้าถึงพอร์ตโดยตรง Arduino สามารถตั้งค่า 8 พินพร้อมกันด้วยคำสั่งเดียว สำหรับเครือข่ายตัวต้านทาน จำเป็นต้องมีตัวต้านทาน 9 ตัวที่มีค่า R และ 8 ตัวที่มีค่า 2R ฉันใช้ 10kOhm เป็นค่า R ซึ่งเก็บกระแสจากพินเป็น 0.5mA หรือน้อยกว่า ฉันเดาว่า R=1kOhm ก็ใช้งานได้เช่นกัน เนื่องจาก Arduino สามารถส่ง 5mA ต่อพิน, 40mA ต่อพอร์ตได้อย่างง่ายดาย เป็นสิ่งสำคัญที่อัตราส่วนระหว่างตัวต้านทาน R และ 2R จริงๆ คือ 2 ซึ่งทำได้ง่ายที่สุดโดยใส่ตัวต้านทานค่า R 2 ตัวในอนุกรม รวมเป็นตัวต้านทานทั้งหมด 25 ตัว

ตัวสะสมเฟส

จากนั้นสร้างรูปคลื่นเพื่อส่งลำดับตัวเลข 8 บิตซ้ำๆ ไปยังพิน Arduino รูปแบบของคลื่นถูกเก็บไว้ในอาร์เรย์ขนาด 256 ไบต์ และอาร์เรย์นี้จะถูกสุ่มตัวอย่างและส่งไปยังพิน ความถี่ของสัญญาณเอาท์พุตถูกกำหนดโดยความเร็วที่สัญญาณผ่านอาร์เรย์ วิธีที่มีประสิทธิภาพ แม่นยำ และสง่างามในการทำเช่นนั้นคือการใช้ Phase accumulator: ตัวเลข 32 บิตจะเพิ่มขึ้นตามช่วงเวลาปกติ และเราใช้ 8 บิตที่สำคัญที่สุดเป็นดัชนีของอาร์เรย์

สุ่มตัวอย่างอย่างรวดเร็ว

อินเตอร์รัปต์อนุญาตให้สุ่มตัวอย่างในเวลาที่กำหนดไว้อย่างดี แต่โอเวอร์เฮดของการขัดจังหวะจะจำกัดความถี่การสุ่มตัวอย่างไว้ที่ ~100kHz การวนซ้ำแบบไม่สิ้นสุดเพื่ออัปเดตเฟส สุ่มตัวอย่างรูปคลื่นและตั้งค่าพินใช้เวลา 42 รอบสัญญาณนาฬิกา เพื่อให้ได้อัตราการสุ่มตัวอย่างที่ 16MHz/42=381kHz การหมุนหรือผลักตัวเข้ารหัสแบบหมุนทำให้เกิดการเปลี่ยนพินและการขัดจังหวะที่ออกจากลูปเพื่อเปลี่ยนการตั้งค่า (รูปคลื่นหรือความถี่) ในขั้นตอนนี้ ตัวเลข 256 ตัวในอาร์เรย์จะถูกคำนวณใหม่ เพื่อไม่ให้มีการคำนวณรูปคลื่นตามจริงในลูปหลัก ความถี่สูงสุดสัมบูรณ์ที่สามารถสร้างได้คือ 190kHz (ครึ่งหนึ่งของอัตราการสุ่มตัวอย่าง) แต่หลังจากนั้นจะมีตัวอย่างเพียงสองตัวอย่างต่อช่วงเวลา ดังนั้นจึงไม่ค่อยมีการควบคุมรูปร่าง อินเทอร์เฟซจึงไม่อนุญาตให้ตั้งค่าความถี่ที่สูงกว่า 100kHz ที่ 50kHz มี 7-8 ตัวอย่างต่อคาบและที่ 1.5 kHz และต่ำกว่า 256 ตัวเลขทั้งหมดที่จัดเก็บไว้ในอาร์เรย์จะได้รับการสุ่มตัวอย่างในแต่ละช่วง สำหรับรูปคลื่นที่สัญญาณเปลี่ยนแปลงอย่างราบรื่น เช่น คลื่นไซน์ การข้ามตัวอย่างไม่มีปัญหา แต่สำหรับรูปคลื่นที่มีหนามแหลมแคบ เช่น คลื่นสี่เหลี่ยมที่มีวัฏจักรหน้าที่เล็ก ๆ อาจมีอันตรายที่ความถี่ที่สูงกว่า 1.5 kHz ขาดตัวอย่างเดียวอาจส่งผลให้รูปคลื่นไม่เป็นไปตามที่คาดไว้

ความแม่นยำของความถี่

จำนวนที่เฟสเพิ่มขึ้นในแต่ละตัวอย่างจะเป็นสัดส่วนกับความถี่ ความถี่สามารถตั้งค่าได้อย่างแม่นยำที่ 381kHz/2^32=0.089mHz ในทางปฏิบัติแทบไม่จำเป็นต้องมีความแม่นยำดังกล่าว ดังนั้นอินเทอร์เฟซจึงจำกัดการตั้งค่าความถี่เป็นขั้นละ 1mHz ความแม่นยำแน่นอนของความถี่ถูกกำหนดโดยความแม่นยำของความถี่สัญญาณนาฬิกา Arduino ขึ้นอยู่กับประเภทของ Arduino แต่ส่วนใหญ่ระบุความถี่ที่ 16.000MHz ดังนั้นความแม่นยำ ~ 10 ^ -4 รหัสนี้อนุญาตให้แก้ไขอัตราส่วนของความถี่และการเพิ่มเฟสเพื่อแก้ไขการเบี่ยงเบนเล็กน้อยของสมมติฐาน 16MHz

การบัฟเฟอร์และการขยายเสียง

เครือข่ายตัวต้านทานมีอิมพีแดนซ์เอาต์พุตสูง ดังนั้นแรงดันเอาต์พุตจะลดลงอย่างรวดเร็วหากมีการต่อโหลด ที่สามารถแก้ไขได้โดยการบัฟเฟอร์หรือขยายเอาต์พุต ที่นี่ การบัฟเฟอร์และการขยายเสียงทำได้ด้วย opamp ฉันใช้ LM358 เพราะฉันมีอยู่บ้าง มันเป็นออปแอมป์ที่ช้า (อัตราการฆ่า 0.5V ต่อไมโครวินาที) ดังนั้นที่ความถี่สูงและแอมพลิจูดสูง สัญญาณจะบิดเบี้ยว ข้อดีคือมันสามารถรองรับแรงดันไฟฟ้าได้ใกล้เคียงกับ 0V อย่างไรก็ตาม แรงดันเอาต์พุตถูกจำกัดไว้ที่ ~2V ใต้ราง ดังนั้นการใช้กำลังไฟ +5V จะจำกัดแรงดันเอาต์พุตไว้ที่ 3V โมดูลแบบเป็นขั้นมีขนาดกะทัดรัดและราคาถูก ป้อน +20V ให้กับ opamp สามารถสร้างสัญญาณที่มีแรงดันไฟฟ้าสูงถึง 18V (หมายเหตุ แผนผังบอกว่า LTC3105 เพราะนั่นเป็นขั้นตอนเดียวที่ฉันพบใน Fritzing อันที่จริง ฉันใช้โมดูล MT3608 ดูภาพในขั้นตอนต่อไป) ฉันเลือกใช้การลดทอนแบบแปรผันกับเอาต์พุตของ R2R DAC จากนั้นใช้หนึ่งใน opamps เพื่อบัฟเฟอร์สัญญาณโดยไม่มีการขยายและอีกตัวหนึ่งเพื่อขยาย 5.7 เพื่อให้สัญญาณสามารถเข้าถึงเอาต์พุตสูงสุดประมาณ 20V กระแสไฟขาออกค่อนข้างจำกัด ~ 10mA ดังนั้นอาจจำเป็นต้องใช้แอมพลิฟายเออร์ที่แรงกว่าหากสัญญาณนั้นขับลำโพงขนาดใหญ่หรือแม่เหล็กไฟฟ้า

ขั้นตอนที่ 2: ส่วนประกอบที่จำเป็น

สำหรับเครื่องกำเนิดสัญญาณหลัก

Arduino Uno หรือ Nano

จอ LCD 16x2 + ทริมเมอร์ 20kOhm และตัวต้านทานซีรีย์ 100Ohm สำหรับแบ็คไลท์

ตัวเข้ารหัสแบบหมุน 5 พิน (พร้อมปุ่มกดในตัว)

ตัวต้านทาน 25 ตัวที่ 10kOhm

สำหรับบัฟเฟอร์/เครื่องขยายเสียง

LM358 หรือออปแอมป์คู่อื่นๆ

โมดูล step-up ตาม MT3608

ตัวต้านทานปรับค่าได้ 50kOhm

ตัวต้านทาน 10kOhm

ตัวต้านทาน 47kOhm

ตัวเก็บประจุ 1muF

ขั้นตอนที่ 3: การก่อสร้าง

การก่อสร้าง
การก่อสร้าง
การก่อสร้าง
การก่อสร้าง

ฉันบัดกรีทุกอย่างบนบอร์ดต้นแบบขนาด 7x9 ซม. ดังที่แสดงในภาพ เนื่องจากมันเลอะเทอะเล็กน้อยกับสายไฟทั้งหมด ฉันจึงพยายามระบายสีสายนำที่มีแรงดันไฟฟ้าบวกเป็นสีแดงและสายที่มีสีดำกราวด์

ตัวเข้ารหัสที่ฉันใช้มี 5 พิน ด้านหนึ่ง 3 อัน อีกด้านหนึ่ง 2 อัน ด้านที่มี 3 พินคือตัวเข้ารหัสจริง ด้านที่มี 2 พินคือปุ่มกดในตัว ด้าน 3 พิน พินกลางควรเชื่อมต่อกับกราวด์ อีกสองพินกับ D10 และ D11 ด้าน 2 พิน ควรต่อพินหนึ่งพินกับกราวด์และอีกพินหนึ่งกับ D12

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

R - สัญญาณดิบจาก R2R DAC

B - สัญญาณบัฟเฟอร์

A - ขยายสัญญาณ

T - สัญญาณจับเวลาจากพิน 9

G - กราวด์

+ - แรงดันบวก 'สูง' จากโมดูลสเต็ปอัพ

ขั้นตอนที่ 4: รหัส

แนบโค้ดซึ่งเป็นแบบร่าง Arduino และควรอัปโหลดไปยัง Arduino

20 รูปคลื่นถูกกำหนดไว้ล่วงหน้าแล้ว ควรตรงไปตรงมาเพื่อเพิ่มคลื่นอื่น ๆ โปรดทราบว่าคลื่นสุ่มจะเติมอาร์เรย์ 256 ค่าด้วยค่าสุ่ม แต่รูปแบบเดียวกันจะซ้ำกันทุกช่วงเวลา สัญญาณสุ่มที่แท้จริงนั้นฟังดูเหมือนเสียง แต่รูปคลื่นนี้ฟังดูเหมือนเสียงนกหวีดมากกว่า

รหัสตั้งค่าสัญญาณ 1kHz บนพิน D9 พร้อม TIMER1 ซึ่งจะเป็นประโยชน์ในการตรวจสอบจังหวะเวลาของสัญญาณแอนะล็อก นั่นคือวิธีที่ฉันคิดออกว่าจำนวนรอบสัญญาณนาฬิกาคือ 42: ถ้าฉันถือว่า 41 หรือ 43 และสร้างสัญญาณ 1kHz แสดงว่ามีความถี่ที่แตกต่างจากสัญญาณบนพิน D9 อย่างชัดเจน ด้วยค่า 42 ที่เข้ากันได้อย่างลงตัว

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

คอมไพเลอร์กล่าวว่า: "Sketch ใช้พื้นที่จัดเก็บโปรแกรม 7254 ไบต์ (23%) สูงสุดคือ 30720 ไบต์ ตัวแปรส่วนกลางใช้หน่วยความจำไดนามิก 483 ไบต์ (23%) เหลือ 1565 ไบต์สำหรับตัวแปรในเครื่อง สูงสุดคือ 2048 ไบต์" ดังนั้นจึงมีพื้นที่เพียงพอสำหรับโค้ดที่ซับซ้อนยิ่งขึ้น ระวังว่าคุณอาจต้องเลือก "ATmega328P (bootloader เก่า)" เพื่ออัปโหลดไปยัง Nano ได้สำเร็จ

ขั้นตอนที่ 5: การใช้งาน

เครื่องกำเนิดสัญญาณสามารถจ่ายไฟได้ง่ายๆ ผ่านสาย mini-USB ของ Arduino Nano ควรใช้พาวเวอร์แบงค์ดีที่สุด เพื่อไม่ให้มีกราวด์กราวด์โดยไม่ได้ตั้งใจกับอุปกรณ์ที่อาจเชื่อมต่ออยู่

เมื่อเปิดเครื่องจะสร้างคลื่นไซน์ 100Hz โดยการหมุนปุ่ม จะสามารถเลือกคลื่นอีก 20 แบบได้ โดยการหมุนขณะกด เคอร์เซอร์สามารถตั้งค่าให้เป็นตัวเลขใดๆ ของความถี่ ซึ่งสามารถเปลี่ยนเป็นค่าที่ต้องการได้

แอมพลิจูดสามารถควบคุมได้ด้วยโพเทนชิออมิเตอร์และสามารถใช้สัญญาณบัฟเฟอร์หรือสัญญาณขยายได้

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

สำหรับความถี่ต่ำมาก สามารถมองเห็นเอาต์พุตด้วย LED แบบอนุกรมที่มีตัวต้านทาน 10kOhm สามารถได้ยินความถี่เสียงด้วยลำโพง ตรวจสอบให้แน่ใจว่าได้ตั้งค่าสัญญาณให้มีขนาดเล็กมาก ~0.5V มิฉะนั้น กระแสไฟจะสูงเกินไปและสัญญาณจะเริ่มตัด

แนะนำ: