แผนผังของเครื่องกำเนิด dds บนไมโครคอนโทรลเลอร์ atmel เครื่องกำเนิด dds ที่ใช้งานได้บน plc การทดสอบโหมดการทำงานของเครื่องกำเนิดไฟฟ้าหลังการประกอบ

แผนผังของเครื่องกำเนิด dds บนไมโครคอนโทรลเลอร์ atmel  เครื่องกำเนิด dds ที่ใช้งานได้บน plc  การทดสอบโหมดการทำงานของเครื่องกำเนิดไฟฟ้าหลังการประกอบ
แผนผังของเครื่องกำเนิด dds บนไมโครคอนโทรลเลอร์ atmel เครื่องกำเนิด dds ที่ใช้งานได้บน plc การทดสอบโหมดการทำงานของเครื่องกำเนิดไฟฟ้าหลังการประกอบ

ความถี่สูงสุด - 65534 Hz ​​​​(และเอาต์พุต HS สูงสุด 8 MHz พร้อมคลื่นสี่เหลี่ยม) จากนั้นฉันก็คิดว่าเครื่องกำเนิดไฟฟ้าเป็นงานที่ยอดเยี่ยมที่ FPGA สามารถแสดงตัวเองได้อย่างดีที่สุด ในส่วนของกีฬา ฉันตัดสินใจที่จะทำซ้ำโปรเจ็กต์บน FPGA ในขณะที่ทำตามกำหนดเวลาภายในสองสุดสัปดาห์ และรับพารามิเตอร์ที่ไม่ได้กำหนดไว้อย่างเคร่งครัด แต่เป็นค่าสูงสุดที่เป็นไปได้ คุณสามารถค้นหาสิ่งที่ออกมาจากสิ่งนี้ได้ภายใต้การตัด

วันที่เป็นศูนย์

ก่อนที่วันหยุดสุดสัปดาห์จะมาถึง ฉันมีเวลาคิดเกี่ยวกับการนำไปปฏิบัติ เพื่อให้งานของฉันง่ายขึ้น ฉันตัดสินใจสร้างเครื่องกำเนิดไฟฟ้าไม่ใช่อุปกรณ์แยกต่างหากที่มีปุ่มและหน้าจอ LCD แต่เป็นอุปกรณ์ที่เชื่อมต่อกับพีซีผ่าน USB สำหรับสิ่งนี้ฉันมีบอร์ด USB2RS232 บอร์ดไม่ต้องการไดรเวอร์ (CDC) ดังนั้นฉันคิดว่ามันจะทำงานบน Linux ได้ (สำหรับบางคนนี่เป็นสิ่งสำคัญ) นอกจากนี้ฉันจะไม่ปิดบังว่าฉันได้ทำงานกับการรับข้อความผ่าน RS232 แล้ว ฉันจะใช้โมดูลสำเร็จรูปสำหรับการทำงานกับ RS232 จาก opencores.com

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

ฉันกำลังคิดจะเขียนโปรแกรมส่งข้อมูลผ่านพอร์ต COM อย่างไร ในอีกด้านหนึ่งคุณสามารถเขียนใน Delphi7 ได้ คุณมีประสบการณ์ในการเขียนโปรแกรมดังกล่าวแล้วและขนาดของไฟล์ปฏิบัติการจะไม่ใหญ่นัก ฉันยังพยายามร่างบางสิ่งที่จะทำงานกับ Serial ในรูปแบบของจาวาสคริปต์ในหน้า html แต่มันทำงานได้ไม่มากก็น้อยผ่าน Chrome API อนุกรมเท่านั้น แต่สำหรับสิ่งนี้คุณต้องติดตั้งปลั๊กอิน... โดยทั่วไป ก็ไม่เป็นปัญหาเช่นกัน ฉันลองใช้ PyQt5 เป็นนวัตกรรมสำหรับตัวเอง แต่เมื่อแจกจ่ายโปรเจ็กต์ดังกล่าว คุณจะต้องลากไลบรารีจำนวนมาก เมื่อพยายามรวบรวมโปรเจ็กต์ PyQt เป็นไฟล์ exe ปรากฏว่ามีขนาดมากกว่า 10 MB นั่นคือมันจะไม่ดีไปกว่าแอปพลิเคชันที่เขียนด้วย C++\Qt5 นอกจากนี้ยังควรพิจารณาด้วยว่าฉันไม่มีประสบการณ์ในการพัฒนาใน Python แต่ฉันมีประสบการณ์ใน Qt5 ดังนั้นตัวเลือกจึงตกอยู่ที่ Qt5 ตั้งแต่เวอร์ชันที่ 5 มีโมดูลสำหรับการทำงานแบบอนุกรมปรากฏขึ้นและฉันได้ใช้งานไปแล้ว และแอปพลิเคชันบน Qt5 สามารถถ่ายโอนไปยัง Linux และ Mac ได้ (สำหรับบางอย่างสิ่งนี้สำคัญ) และจากเวอร์ชัน 5.2 แอปพลิเคชันบน QWidgets ก็สามารถถ่ายโอนไปยังสมาร์ทโฟนได้!

มีอะไรอีกที่จำเป็น? โดยปกติแล้วบอร์ดจะมี FPGA ฉันมีสองตัว (Cyclone iv EP4CE10E22C8N สำหรับ 10,000 เซลล์และ Cyclone ii EP2C5 สำหรับ 5,000 เซลล์) ฉันจะเลือกอันทางซ้ายเพราะว่าขั้วต่อสะดวกกว่า ในแง่ของปริมาณ โครงการไม่ได้ตั้งใจจะมีขนาดใหญ่ ดังนั้นจึงจะพอดีกับโครงการใดโครงการหนึ่ง ก็ไม่ต่างกันในเรื่องความเร็ว บอร์ดทั้งสองมีออสซิลเลเตอร์ 50 MHz บนบอร์ดและภายใน FPGA มี PLL ซึ่งฉันสามารถเพิ่มความถี่เป็น 200 MHz ที่วางแผนไว้ได้

วันแรก

เนื่องจากฉันได้สร้างโมดูล DDS ในโปรเจ็กต์ซินธิไซเซอร์ของฉันแล้ว ฉันจึงหยิบหัวแร้งทันทีและเริ่มบัดกรี DAC ด้วยตัวต้านทาน ฉันเอาบอร์ดต้นแบบ การติดตั้งเสร็จสิ้นโดยใช้การห่อ การเปลี่ยนแปลงเดียวที่ส่งผลต่อเทคโนโลยีคือฉันละทิ้งกรด F38N เพื่อยึดขาตั้งแทนเจลฟลักซ์ตัวบ่งชี้ TT สาระสำคัญของเทคโนโลยีนั้นเรียบง่าย: ฉันประสานชั้นวางเข้ากับแผงวงจรพิมพ์และบัดกรีตัวต้านทานจากด้านแผงวงจรพิมพ์ ฉันสร้างการเชื่อมต่อที่ขาดหายไปด้วยการบิด นอกจากนี้ชั้นวางยังสะดวกเพราะฉันสามารถเสียบเข้ากับบอร์ด FPGA ได้โดยตรง

น่าเสียดายที่ที่บ้านไม่มีตัวต้านทาน 1 และ 2 กิโลโอห์ม ไม่มีเวลาไปที่ร้าน ฉันต้องละทิ้งกฎข้อหนึ่งของฉันและถอดตัวต้านทานออกจากบอร์ดเก่าที่ไม่จำเป็น มีการใช้ตัวต้านทาน 15K และ 30K ที่นั่น ผลลัพธ์คือแฟรงเกนสไตน์นี้:


หลังจากสร้างโปรเจ็กต์แล้ว คุณจะต้องตั้งค่าอุปกรณ์เป้าหมาย: การกำหนดเมนู -> อุปกรณ์


ในโครงการนี้ ฉันเขียนโค้ดโมดูล DDS หลักที่ไม่สามารถควบคุมได้ให้เป็นความถี่คงที่

โมดูลเครื่องกำเนิดไฟฟ้า 1,000 Hz

โมดูล signal_generator (clk50M, signal_out); สายอินพุต clk50M; สัญญาณเอาต์พุตลวด_ออก; ลวด clk200M; osc osc_200M reg สะสม; กำหนด signal_out = ตัวสะสม; // ลองสร้าง 1,000 Hz // 50,000,000 Hz - ความถี่สัญญาณนาฬิกาของเครื่องกำเนิดไฟฟ้าภายนอก // 2 ^ 32 = 4,294,967,296 - ความลึกบิต DDS - 32 บิต // หาร 1,000Hz / 50,000,000 Hz / 2 * 4294967296 => 42949, 67296 @ เสมอ (posge clk50M) เริ่มสะสม<= accumulator + 32"d42949; end endmodule


หลังจากนั้น ฉันคลิก “เริ่มการคอมไพล์” เพื่อให้สภาพแวดล้อมการพัฒนาถามว่าเรามีบรรทัดอินพุต/เอาท์พุตใดในโมดูลหลักของโปรเจ็กต์ และ PIN ทางกายภาพใดบ้างที่เชื่อมต่ออยู่ คุณสามารถเชื่อมต่อกับใครก็ได้หลังจากคอมไพล์แล้ว กำหนดบรรทัดที่ปรากฏให้กับ PIN จริงของชิป FPGA:

การกำหนดรายการเมนู -> Pin Planner

โปรดมองข้ามบรรทัด HS_OUT, key0 และ key1 ในตอนนี้ เนื่องจากจะปรากฏในโครงการในภายหลัง แต่ฉันไม่มีเวลาจับภาพหน้าจอตั้งแต่เริ่มต้น

โดยหลักการแล้ว การ "ลงทะเบียน" เฉพาะ PIN_nn ในคอลัมน์ตำแหน่งก็เพียงพอแล้ว และพารามิเตอร์ที่เหลือ (มาตรฐาน I/O, ระยะยืดปัจจุบัน และอัตราการสลูว์) ก็สามารถปล่อยทิ้งไว้ตามค่าเริ่มต้นได้ หรือคุณสามารถเลือกพารามิเตอร์เดียวกันที่นำเสนอโดย ค่าเริ่มต้น (ค่าเริ่มต้น) เพื่อไม่ให้มีคำเตือน "ov.

ฉันจะทราบได้อย่างไรว่า PIN ใดที่ตรงกับหมายเลขตัวเชื่อมต่อบนบอร์ด

หมายเลขพินของตัวเชื่อมต่อถูกทำเครื่องหมายไว้บนกระดาน


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




หลังจากกำหนดพินแล้ว ฉันจะคอมไพล์โปรเจ็กต์อีกครั้งและแฟลชโดยใช้โปรแกรมเมอร์ USB หากคุณไม่ได้ติดตั้งไดรเวอร์สำหรับโปรแกรมเมอร์ USB Byte Blaster ให้แจ้ง Windows ว่าไดรเวอร์เหล่านั้นอยู่ในโฟลเดอร์ที่คุณติดตั้ง Quartus แล้วเธอก็จะค้นพบมันเอง

โปรแกรมเมอร์จะต้องเชื่อมต่อกับตัวเชื่อมต่อ JTAG และรายการเมนูสำหรับการเขียนโปรแกรมคือ “Tools -> Programmer” (หรือคลิกที่ไอคอนบนแถบเครื่องมือ) ปุ่ม "Start", "Success" ที่สนุกสนาน และเฟิร์มแวร์อยู่ใน FPGA แล้วและใช้งานได้แล้ว อย่าปิด FPGA ไม่เช่นนั้นมันจะลืมทุกอย่าง

เครื่องมือ -> โปรแกรมเมอร์


DAC เชื่อมต่อกับขั้วต่อบอร์ด FPGA ฉันเชื่อมต่อออสซิลโลสโคป S1-112A เข้ากับเอาต์พุต DAC ผลลัพธ์ควรเป็น "เลื่อย" เนื่องจากส่วนที่อยู่ในลำดับสูงของคำ DDS ของตัวสะสมเฟสจะถูกส่งออกไปยังเอาต์พุต 8 บิต และมันจะเพิ่มขึ้นเรื่อยๆจนล้น

ประมาณ 1.5 ชั่วโมงและที่ความถี่ 1,000 Hz ฉันเห็นออสซิลโลแกรมต่อไปนี้:

ฉันอยากจะทราบว่า "เลื่อย" มีรอยแตกเล็กน้อยตรงกลาง เป็นเพราะตัวต้านทานมีช่วงค่าต่างๆ

จุดสำคัญอีกประการหนึ่งที่ต้องชี้แจงคือความถี่สูงสุดที่เป็นไปได้ที่เครื่องกำเนิด DDS จะทำงาน ด้วยพารามิเตอร์ TimeQuest ที่กำหนดค่าอย่างถูกต้อง หลังจากการคอมไพล์ใน "รายงานการรวบรวม" คุณจะเห็นว่าความเร็วของวงจรสูงกว่า 200 MHz โดยมีระยะขอบ ซึ่งหมายความว่าฉันจะคูณความถี่เครื่องกำเนิด 50 MHz ด้วย 4 โดยใช้ PLL ฉันจะเพิ่มค่าของตัวสะสมเฟส DDS ด้วยความถี่ 200 MHz ช่วงความถี่สุดท้ายที่สามารถรับได้ภายใต้เงื่อนไขของเราคือ 0 - 100 MHz ความแม่นยำในการตั้งค่าความถี่:

200,000,000 เฮิรตซ์ (clk) / 2^32 (DDS) = 0.047 เฮิรตซ์
นั่นคือดีกว่า ~ 0.05 Hz ฉันถือว่าความแม่นยำของเศษส่วนของเฮิรตซ์นั้นเพียงพอสำหรับเครื่องกำเนิดไฟฟ้าที่มีช่วงความถี่การทำงานดังกล่าว (0...100 MHz) หากมีคนต้องการเพิ่มความแม่นยำ คุณสามารถเพิ่มความลึกบิต DDS ได้ (อย่าลืมตรวจสอบ TimeQuest Timing Analyzer ว่าความเร็วในการทำงานของวงจรลอจิกอยู่ภายใน CLK = 200 MHz เนื่องจากนี่คือตัวบวก) หรือเพียงแค่ลดความถี่สัญญาณนาฬิกาลง หากไม่จำเป็นต้องใช้ช่วงความถี่ที่กว้างดังกล่าว

เครื่องวิเคราะห์เวลา TimeQuest


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

สำหรับความถี่ 100 kHz

สำหรับความถี่ 250 kHz

สำหรับความถี่ 500 kHz

สำหรับความถี่ 1 MHz

วันที่สอง

เนื่องจากเป็นเรื่องที่น่าสนใจว่า DAC จะทำงานอย่างไรกับตัวต้านทาน 100 และ 200 โอห์มฉันจึงหยิบหัวแร้งทันที ครั้งนี้ DAC มีความแม่นยำมากขึ้น และใช้เวลาในการติดตั้งน้อยลง

เราวาง DAC ไว้บนบอร์ด FPGA และเชื่อมต่อกับออสซิลโลสโคป

กำลังตรวจสอบ 1 MHz - VO! มันเป็นเรื่องที่แตกต่างอย่างสิ้นเชิง!

เห็น 10 MHz

เห็น 25 MHz


รูปร่างของเลื่อย 10 MHz ยังคงคล้ายกับรูปทรงที่ถูกต้อง แต่ที่ความถี่ 25 MHz จะไม่ "สวย" อีกต่อไป อย่างไรก็ตาม C1-112a มีแบนด์วิธ 10 MHz ดังนั้นในกรณีนี้ สาเหตุอาจอยู่ในออสซิลโลสโคปอยู่แล้ว

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

กำหนด hs_out = ตัวสะสม;

คลื่นสี่เหลี่ยม 1 MHz

คลื่นสี่เหลี่ยม 5 MHz

คลื่นสี่เหลี่ยม 25 MHz

คลื่นสี่เหลี่ยม 50 MHz แทบจะมองไม่เห็นแล้วในตอนนี้


แต่ฉันคิดว่าเอาต์พุต FPGA ควรโหลดด้วยความต้านทาน บางทีส่วนหน้าอาจจะชันกว่านี้

ไซน์ทำตามตาราง ขนาดตารางคือ 256 ค่า 8 บิต อาจต้องใช้เวลามากกว่านี้ แต่ฉันมีไฟล์ mif สำเร็จรูปอยู่แล้ว เมื่อใช้ตัวช่วยสร้าง เราสร้างองค์ประกอบ ROM ด้วยข้อมูลตารางไซน์จากไฟล์ mif

การสร้าง ROM - เครื่องมือ -> ตัวจัดการปลั๊กอิน Mega Wizard


เลือก ROM 1 พอร์ต และตั้งชื่อโมดูล

เราเห็นด้วย

เราเห็นด้วยที่นี่เช่นกัน

เมื่อใช้การเรียกดู เราจะค้นหาไฟล์ mif ของเราพร้อมกับตารางไซน์

เราไม่เปลี่ยนแปลงอะไรที่นี่เช่นกัน

ยกเลิกการเลือกโมดูล sine_rom_bb.v - ไม่จำเป็น จบต่อไป. Quartus จะขอเพิ่มโมดูลในโครงการ - เราเห็นด้วย หลังจากนี้ โมดูลจะสามารถใช้งานได้เหมือนกับโมดูลอื่นๆ ใน Verilog


8 บิตบนของคำสะสม DDS จะถูกใช้เป็นที่อยู่ ROM และเอาต์พุตข้อมูลจะเป็นค่าไซน์

รหัส

// ไซน์รอมลวด sine_out; sine_rom sine1(.clock(clk200M), .address(ตัวสะสม), .q(sine_out));


ออสซิลโลแกรมของคลื่นไซน์ที่ความถี่ต่างกันจะดู... เหมือนกัน

หากต้องการ คุณสามารถพิจารณาปัญหา DAC ที่เกี่ยวข้องกับการแพร่กระจายของตัวต้านทาน:

นั่นคือจุดสิ้นสุดของสุดสัปดาห์ แต่ยังไม่ได้เขียนซอฟต์แวร์สำหรับควบคุมจากพีซี ฉันถูกบังคับให้ยอมรับความจริงที่ว่าฉันไม่ตรงตามกำหนดเวลาที่วางแผนไว้

วันที่สาม

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

อินเตอร์เฟซ

เชื่อมโยงกับแอนะล็อก

ไม่ใช่รายการที่สมบูรณ์
เครื่องกำเนิด DDS ที่ใช้งานได้ สร้างจาก AVR ความถี่ 0... 65534 เฮิรตซ์
รีวิวเครื่องกำเนิด DDS GK101 สร้างโดยใช้ Altera MAX240 FPGA ความถี่สูงถึง 10 MHz
เครื่องกำเนิดไฟฟ้ามัลติฟังก์ชั่นบน PIC16F870 ช่วงความถี่: 11 เฮิรตซ์ - 60 กิโลเฮิรตซ์
เครื่องกำเนิดไฟฟ้า เพิ่มแท็ก

ความถี่สูงสุด - 65534 Hz ​​​​(และเอาต์พุต HS สูงสุด 8 MHz พร้อมคลื่นสี่เหลี่ยม) จากนั้นฉันก็คิดว่าเครื่องกำเนิดไฟฟ้าเป็นงานที่ยอดเยี่ยมที่ FPGA สามารถแสดงตัวเองได้อย่างดีที่สุด ในส่วนของกีฬา ฉันตัดสินใจที่จะทำซ้ำโปรเจ็กต์บน FPGA ในขณะที่ทำตามกำหนดเวลาภายในสองสุดสัปดาห์ และรับพารามิเตอร์ที่ไม่ได้กำหนดไว้อย่างเคร่งครัด แต่เป็นค่าสูงสุดที่เป็นไปได้ คุณสามารถค้นหาสิ่งที่ออกมาจากสิ่งนี้ได้ภายใต้การตัด

วันที่เป็นศูนย์

ก่อนที่วันหยุดสุดสัปดาห์จะมาถึง ฉันมีเวลาคิดเกี่ยวกับการนำไปปฏิบัติ เพื่อให้งานของฉันง่ายขึ้น ฉันตัดสินใจสร้างเครื่องกำเนิดไฟฟ้าไม่ใช่อุปกรณ์แยกต่างหากที่มีปุ่มและหน้าจอ LCD แต่เป็นอุปกรณ์ที่เชื่อมต่อกับพีซีผ่าน USB สำหรับสิ่งนี้ฉันมีบอร์ด USB2RS232 บอร์ดไม่ต้องการไดรเวอร์ (CDC) ดังนั้นฉันคิดว่ามันจะทำงานบน Linux ได้ (สำหรับบางคนนี่เป็นสิ่งสำคัญ) นอกจากนี้ฉันจะไม่ปิดบังว่าฉันได้ทำงานกับการรับข้อความผ่าน RS232 แล้ว ฉันจะใช้โมดูลสำเร็จรูปสำหรับการทำงานกับ RS232 จาก opencores.com

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

ฉันกำลังคิดจะเขียนโปรแกรมส่งข้อมูลผ่านพอร์ต COM อย่างไร ในอีกด้านหนึ่งคุณสามารถเขียนใน Delphi7 ได้ คุณมีประสบการณ์ในการเขียนโปรแกรมดังกล่าวแล้วและขนาดของไฟล์ปฏิบัติการจะไม่ใหญ่นัก ฉันยังพยายามร่างบางสิ่งที่จะทำงานกับ Serial ในรูปแบบของจาวาสคริปต์ในหน้า html แต่มันทำงานได้ไม่มากก็น้อยผ่าน Chrome API อนุกรมเท่านั้น แต่สำหรับสิ่งนี้คุณต้องติดตั้งปลั๊กอิน... โดยทั่วไป ก็ไม่เป็นปัญหาเช่นกัน ฉันลองใช้ PyQt5 เป็นนวัตกรรมสำหรับตัวเอง แต่เมื่อแจกจ่ายโปรเจ็กต์ดังกล่าว คุณจะต้องลากไลบรารีจำนวนมาก เมื่อพยายามรวบรวมโปรเจ็กต์ PyQt เป็นไฟล์ exe ปรากฏว่ามีขนาดมากกว่า 10 MB นั่นคือมันจะไม่ดีไปกว่าแอปพลิเคชันที่เขียนด้วย C++\Qt5 นอกจากนี้ยังควรพิจารณาด้วยว่าฉันไม่มีประสบการณ์ในการพัฒนาใน Python แต่ฉันมีประสบการณ์ใน Qt5 ดังนั้นตัวเลือกจึงตกอยู่ที่ Qt5 ตั้งแต่เวอร์ชันที่ 5 มีโมดูลสำหรับการทำงานแบบอนุกรมปรากฏขึ้นและฉันได้ใช้งานไปแล้ว และแอปพลิเคชันบน Qt5 สามารถถ่ายโอนไปยัง Linux และ Mac ได้ (สำหรับบางอย่างสิ่งนี้สำคัญ) และจากเวอร์ชัน 5.2 แอปพลิเคชันบน QWidgets ก็สามารถถ่ายโอนไปยังสมาร์ทโฟนได้!

มีอะไรอีกที่จำเป็น? โดยปกติแล้วบอร์ดจะมี FPGA ฉันมีสองตัว (Cyclone iv EP4CE10E22C8N สำหรับ 10,000 เซลล์และ Cyclone ii EP2C5 สำหรับ 5,000 เซลล์) ฉันจะเลือกอันทางซ้ายเพราะว่าขั้วต่อสะดวกกว่า ในแง่ของปริมาณ โครงการไม่ได้ตั้งใจจะมีขนาดใหญ่ ดังนั้นจึงจะพอดีกับโครงการใดโครงการหนึ่ง ก็ไม่ต่างกันในเรื่องความเร็ว บอร์ดทั้งสองมีออสซิลเลเตอร์ 50 MHz บนบอร์ดและภายใน FPGA มี PLL ซึ่งฉันสามารถเพิ่มความถี่เป็น 200 MHz ที่วางแผนไว้ได้

วันแรก

เนื่องจากฉันได้สร้างโมดูล DDS ในโปรเจ็กต์ซินธิไซเซอร์ของฉันแล้ว ฉันจึงหยิบหัวแร้งทันทีและเริ่มบัดกรี DAC ด้วยตัวต้านทาน ฉันเอาบอร์ดต้นแบบ การติดตั้งเสร็จสิ้นโดยใช้. การเปลี่ยนแปลงเดียวที่ส่งผลต่อเทคโนโลยีคือฉันละทิ้งกรด F38N เพื่อยึดขาตั้งแทนเจลฟลักซ์ตัวบ่งชี้ TT สาระสำคัญของเทคโนโลยีนั้นเรียบง่าย: ฉันประสานชั้นวางเข้ากับแผงวงจรพิมพ์และบัดกรีตัวต้านทานจากด้านแผงวงจรพิมพ์ ฉันสร้างการเชื่อมต่อที่ขาดหายไปด้วยการบิด นอกจากนี้ชั้นวางยังสะดวกเพราะฉันสามารถเสียบเข้ากับบอร์ด FPGA ได้โดยตรง

น่าเสียดายที่ที่บ้านไม่มีตัวต้านทาน 1 และ 2 กิโลโอห์ม ไม่มีเวลาไปที่ร้าน ฉันต้องละทิ้งกฎข้อหนึ่งของฉันและถอดตัวต้านทานออกจากบอร์ดเก่าที่ไม่จำเป็น มีการใช้ตัวต้านทาน 15K และ 30K ที่นั่น ผลลัพธ์คือแฟรงเกนสไตน์นี้:


หลังจากสร้างโปรเจ็กต์แล้ว คุณจะต้องตั้งค่าอุปกรณ์เป้าหมาย: การกำหนดเมนู -> อุปกรณ์


ในโครงการนี้ ฉันเขียนโค้ดโมดูล DDS หลักที่ไม่สามารถควบคุมได้ให้เป็นความถี่คงที่

โมดูลเครื่องกำเนิดไฟฟ้า 1,000 Hz

โมดูล signal_generator (clk50M, signal_out); สายอินพุต clk50M; สัญญาณเอาต์พุตลวด_ออก; ลวด clk200M; osc osc_200M reg สะสม; กำหนด signal_out = ตัวสะสม; // ลองสร้าง 1,000 Hz // 50,000,000 Hz - ความถี่สัญญาณนาฬิกาของเครื่องกำเนิดไฟฟ้าภายนอก // 2 ^ 32 = 4,294,967,296 - ความลึกบิต DDS - 32 บิต // หาร 1,000Hz / 50,000,000 Hz / 2 * 4294967296 => 42949, 67296 @ เสมอ (posge clk50M) เริ่มสะสม<= accumulator + 32"d42949; end endmodule


หลังจากนั้น ฉันคลิก “เริ่มการคอมไพล์” เพื่อให้สภาพแวดล้อมการพัฒนาถามว่าเรามีบรรทัดอินพุต/เอาท์พุตใดในโมดูลหลักของโปรเจ็กต์ และ PIN ทางกายภาพใดบ้างที่เชื่อมต่ออยู่ คุณสามารถเชื่อมต่อกับใครก็ได้หลังจากคอมไพล์แล้ว กำหนดบรรทัดที่ปรากฏให้กับ PIN จริงของชิป FPGA:

การกำหนดรายการเมนู -> Pin Planner

โปรดมองข้ามบรรทัด HS_OUT, key0 และ key1 ในตอนนี้ เนื่องจากจะปรากฏในโครงการในภายหลัง แต่ฉันไม่มีเวลาจับภาพหน้าจอตั้งแต่เริ่มต้น

โดยหลักการแล้ว การ "ลงทะเบียน" เฉพาะ PIN_nn ในคอลัมน์ตำแหน่งก็เพียงพอแล้ว และพารามิเตอร์ที่เหลือ (มาตรฐาน I/O, ระยะยืดปัจจุบัน และอัตราการสลูว์) ก็สามารถปล่อยทิ้งไว้ตามค่าเริ่มต้นได้ หรือคุณสามารถเลือกพารามิเตอร์เดียวกันที่นำเสนอโดย ค่าเริ่มต้น (ค่าเริ่มต้น) เพื่อไม่ให้มีคำเตือน "ov.

ฉันจะทราบได้อย่างไรว่า PIN ใดที่ตรงกับหมายเลขตัวเชื่อมต่อบนบอร์ด

หมายเลขพินของตัวเชื่อมต่อถูกทำเครื่องหมายไว้บนกระดาน


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




หลังจากกำหนดพินแล้ว ฉันจะคอมไพล์โปรเจ็กต์อีกครั้งและแฟลชโดยใช้โปรแกรมเมอร์ USB หากคุณไม่ได้ติดตั้งไดรเวอร์สำหรับโปรแกรมเมอร์ USB Byte Blaster ให้แจ้ง Windows ว่าไดรเวอร์เหล่านั้นอยู่ในโฟลเดอร์ที่คุณติดตั้ง Quartus แล้วเธอก็จะค้นพบมันเอง

โปรแกรมเมอร์จะต้องเชื่อมต่อกับตัวเชื่อมต่อ JTAG และรายการเมนูสำหรับการเขียนโปรแกรมคือ “Tools -> Programmer” (หรือคลิกที่ไอคอนบนแถบเครื่องมือ) ปุ่ม "Start", "Success" ที่สนุกสนาน และเฟิร์มแวร์อยู่ใน FPGA แล้วและใช้งานได้แล้ว อย่าปิด FPGA ไม่เช่นนั้นมันจะลืมทุกอย่าง

เครื่องมือ -> โปรแกรมเมอร์


DAC เชื่อมต่อกับขั้วต่อบอร์ด FPGA ฉันเชื่อมต่อออสซิลโลสโคป S1-112A เข้ากับเอาต์พุต DAC ผลลัพธ์ควรเป็น "เลื่อย" เนื่องจากส่วนที่อยู่ในลำดับสูงของคำ DDS ของตัวสะสมเฟสจะถูกส่งออกไปยังเอาต์พุต 8 บิต และมันจะเพิ่มขึ้นเรื่อยๆจนล้น

ประมาณ 1.5 ชั่วโมงและที่ความถี่ 1,000 Hz ฉันเห็นออสซิลโลแกรมต่อไปนี้:

ฉันอยากจะทราบว่า "เลื่อย" มีรอยแตกเล็กน้อยตรงกลาง เป็นเพราะตัวต้านทานมีช่วงค่าต่างๆ

จุดสำคัญอีกประการหนึ่งที่ต้องชี้แจงคือความถี่สูงสุดที่เป็นไปได้ที่เครื่องกำเนิด DDS จะทำงาน ด้วยพารามิเตอร์ TimeQuest ที่กำหนดค่าอย่างถูกต้อง หลังจากการคอมไพล์ใน "รายงานการรวบรวม" คุณจะเห็นว่าความเร็วของวงจรสูงกว่า 200 MHz โดยมีระยะขอบ ซึ่งหมายความว่าฉันจะคูณความถี่เครื่องกำเนิด 50 MHz ด้วย 4 โดยใช้ PLL ฉันจะเพิ่มค่าของตัวสะสมเฟส DDS ด้วยความถี่ 200 MHz ช่วงความถี่สุดท้ายที่สามารถรับได้ภายใต้เงื่อนไขของเราคือ 0 - 100 MHz ความแม่นยำในการตั้งค่าความถี่:

200,000,000 เฮิรตซ์ (clk) / 2^32 (DDS) = 0.047 เฮิรตซ์
นั่นคือดีกว่า ~ 0.05 Hz ฉันถือว่าความแม่นยำของเศษส่วนของเฮิรตซ์นั้นเพียงพอสำหรับเครื่องกำเนิดไฟฟ้าที่มีช่วงความถี่การทำงานดังกล่าว (0...100 MHz) หากมีคนต้องการเพิ่มความแม่นยำ คุณสามารถเพิ่มความลึกบิต DDS ได้ (อย่าลืมตรวจสอบ TimeQuest Timing Analyzer ว่าความเร็วในการทำงานของวงจรลอจิกอยู่ภายใน CLK = 200 MHz เนื่องจากนี่คือตัวบวก) หรือเพียงแค่ลดความถี่สัญญาณนาฬิกาลง หากไม่จำเป็นต้องใช้ช่วงความถี่ที่กว้างดังกล่าว

เครื่องวิเคราะห์เวลา TimeQuest


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

สำหรับความถี่ 100 kHz

สำหรับความถี่ 250 kHz

สำหรับความถี่ 500 kHz

สำหรับความถี่ 1 MHz

วันที่สอง

เนื่องจากเป็นเรื่องที่น่าสนใจว่า DAC จะทำงานอย่างไรกับตัวต้านทาน 100 และ 200 โอห์มฉันจึงหยิบหัวแร้งทันที ครั้งนี้ DAC มีความแม่นยำมากขึ้น และใช้เวลาในการติดตั้งน้อยลง

เราวาง DAC ไว้บนบอร์ด FPGA และเชื่อมต่อกับออสซิลโลสโคป

กำลังตรวจสอบ 1 MHz - VO! มันเป็นเรื่องที่แตกต่างอย่างสิ้นเชิง!

เห็น 10 MHz

เห็น 25 MHz


รูปร่างของเลื่อย 10 MHz ยังคงคล้ายกับรูปทรงที่ถูกต้อง แต่ที่ความถี่ 25 MHz จะไม่ "สวย" อีกต่อไป อย่างไรก็ตาม C1-112a มีแบนด์วิธ 10 MHz ดังนั้นในกรณีนี้ สาเหตุอาจอยู่ในออสซิลโลสโคปอยู่แล้ว

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

กำหนด hs_out = ตัวสะสม;

คลื่นสี่เหลี่ยม 1 MHz

คลื่นสี่เหลี่ยม 5 MHz

คลื่นสี่เหลี่ยม 25 MHz

คลื่นสี่เหลี่ยม 50 MHz แทบจะมองไม่เห็นแล้วในตอนนี้


แต่ฉันคิดว่าเอาต์พุต FPGA ควรโหลดด้วยความต้านทาน บางทีส่วนหน้าอาจจะชันกว่านี้

ไซน์ทำตามตาราง ขนาดตารางคือ 256 ค่า 8 บิต อาจต้องใช้เวลามากกว่านี้ แต่ฉันมีไฟล์ mif สำเร็จรูปอยู่แล้ว เมื่อใช้ตัวช่วยสร้าง เราสร้างองค์ประกอบ ROM ด้วยข้อมูลตารางไซน์จากไฟล์ mif

การสร้าง ROM - เครื่องมือ -> ตัวจัดการปลั๊กอิน Mega Wizard


เลือก ROM 1 พอร์ต และตั้งชื่อโมดูล

เราเห็นด้วย

เราเห็นด้วยที่นี่เช่นกัน

เมื่อใช้การเรียกดู เราจะค้นหาไฟล์ mif ของเราพร้อมกับตารางไซน์

เราไม่เปลี่ยนแปลงอะไรที่นี่เช่นกัน

ยกเลิกการเลือกโมดูล sine_rom_bb.v - ไม่จำเป็น จบต่อไป. Quartus จะขอเพิ่มโมดูลในโครงการ - เราเห็นด้วย หลังจากนี้ โมดูลจะสามารถใช้งานได้เหมือนกับโมดูลอื่นๆ ใน Verilog


8 บิตบนของคำสะสม DDS จะถูกใช้เป็นที่อยู่ ROM และเอาต์พุตข้อมูลจะเป็นค่าไซน์

รหัส

// ไซน์รอมลวด sine_out; sine_rom sine1(.clock(clk200M), .address(ตัวสะสม), .q(sine_out));


ออสซิลโลแกรมของคลื่นไซน์ที่ความถี่ต่างกันจะดู... เหมือนกัน

หากต้องการ คุณสามารถพิจารณาปัญหา DAC ที่เกี่ยวข้องกับการแพร่กระจายของตัวต้านทาน:

นั่นคือจุดสิ้นสุดของสุดสัปดาห์ แต่ยังไม่ได้เขียนซอฟต์แวร์สำหรับควบคุมจากพีซี ฉันถูกบังคับให้ยอมรับความจริงที่ว่าฉันไม่ตรงตามกำหนดเวลาที่วางแผนไว้

วันที่สาม

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

อินเตอร์เฟซ

เชื่อมโยงกับแอนะล็อก

ไม่ใช่รายการที่สมบูรณ์
เครื่องกำเนิด DDS ที่ใช้งานได้ สร้างจาก AVR ความถี่ 0... 65534 เฮิรตซ์
รีวิวเครื่องกำเนิด DDS GK101 สร้างโดยใช้ Altera MAX240 FPGA ความถี่สูงถึง 10 MHz
เครื่องกำเนิดไฟฟ้ามัลติฟังก์ชั่นบน PIC16F870 ช่วงความถี่: 11 เฮิรตซ์ - 60 กิโลเฮิรตซ์
เครื่องกำเนิดไฟฟ้า
  • Qt5
  • เพิ่มแท็ก

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

    ในกรณีของฉัน รายการอุปกรณ์นี้ยังห่างไกลจากความสมบูรณ์และยังขาดอยู่ เครื่องกำเนิดสัญญาณ.

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

    ดังนั้น, เครื่องกำเนิดสัญญาณมีลักษณะที่ดีและเหมาะสมกับการแก้ปัญหาง่ายๆ

    การแสดงข้อมูลใน เครื่องกำเนิดสัญญาณผลิตบนจอ LCD ขนาด 16x2 ตัวอักษรพร้อมคอนโทรลเลอร์ HD44780 เป็นที่น่าสังเกตว่าในการบันทึกพอร์ตไมโครคอนโทรลเลอร์ จอแสดงผล LCD จะถูกควบคุมผ่านสายไฟเพียงสามเส้น ซึ่งทำได้โดยใช้ shift register - อ่านเกี่ยวกับวิธีเชื่อมต่อจอแสดงผลผ่านสายสามเส้น

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

    แผนผังของเครื่องกำเนิดสัญญาณ DDSและแผงวงจรพิมพ์

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

    สำหรับ DAC ฉันซื้อตัวต้านทานที่มีความแม่นยำโดยเฉพาะซึ่งมีข้อผิดพลาด ±0.05% แต่เมื่อปรากฏออกมา ตัวต้านทานแบบธรรมดาที่มีข้อผิดพลาด ±5% ก็เพียงพอแล้ว รูปร่างของสัญญาณค่อนข้างเป็นที่ยอมรับสำหรับสัญญาณทุกประเภท

    เมื่อไร เครื่องกำเนิดไฟฟ้าประกอบและโหลดโปรแกรมลงในไมโครคอนโทรลเลอร์แล้ว ไม่จำเป็นต้องตั้งค่าใดๆ เว้นแต่คุณจะปรับคอนทราสต์ของจอแสดงผล

    การทำงานกับอุปกรณ์นั้นง่ายดาย - เลือกรูปร่างของสัญญาณ ตั้งค่าความถี่ที่ต้องการ จากนั้นคุณสามารถเปลี่ยนขั้นตอนการตั้งค่าความถี่ได้ โดยจำกัดที่ 1 - 10 - 100 - 1,000 Hz ต่อขั้นตอน จากนั้นคลิกที่เริ่มและเครื่องกำเนิดไฟฟ้าจะเริ่มทำงาน ควรสังเกตว่าเมื่อเครื่องกำเนิดไฟฟ้าเริ่มทำงาน ความถี่และรูปร่างของสัญญาณไม่สามารถเปลี่ยนแปลงได้ นี่เป็นเพราะความจริงที่ว่าโปรแกรมเข้าสู่วงวนไม่สิ้นสุดและเพื่อเพิ่มความถี่ในการสร้างสูงสุด ขั้นตอนการสำรวจปุ่ม จะต้องถูกลบออก หากต้องการหยุดการสร้าง ให้คลิกที่หยุด/รีเซ็ต เพื่อรีสตาร์ทโปรแกรมและกลับสู่เมนูการตั้งค่า นี่คือความแตกต่างกันนิดหน่อย

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

    ขั้นแรก คุณจะต้องทำการวัดทั้งหมด ขนาดของจอแสดงผล LCD และบอร์ดกำเนิดสัญญาณ แหล่งจ่ายไฟ ขั้วต่อ และปุ่ม จากนั้นวางลงบนแผ่นกระดาษที่จะอยู่ภายในเคส คุณสามารถเริ่มการผลิตได้ตามขนาดที่ได้รับ

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

    แผนผังของเครื่องกำเนิดบน MK

    การตั้งค่าอุปกรณ์

    • ช่วงความถี่: 10 เฮิรตซ์ - 60 กิโลเฮิรตซ์
    • การปรับความถี่ดิจิตอลใน 3 ขั้นตอนที่แตกต่างกัน
    • รูปคลื่น: ไซน์, สามเหลี่ยม, สี่เหลี่ยม, เลื่อย, H-pulse, L-pulse, Burst, Sweep, Noise
    • ช่วงเอาต์พุต: 15V สำหรับไซน์และสามเหลี่ยม, 0-5V สำหรับโหมดอื่นๆ
    • มีเอาต์พุตสำหรับการซิงโครไนซ์พัลส์

    อุปกรณ์นี้ใช้พลังงานจากไฟฟ้ากระแสสลับ 12 โวลต์ ซึ่งให้แรงดันไฟฟ้ากระแสตรงสูงเพียงพอ (มากกว่า 18 โวลต์) ซึ่งจำเป็นสำหรับการทำงานปกติของ 78L15 และ 79L15 ซึ่งสร้างวงจรแบบไบโพลาร์ 15 โวลต์ ซึ่งทำเพื่อให้ไมโครวงจร LF353 สามารถส่งออกเอาต์พุตได้ สัญญาณเต็มช่วงถึงโหลด 1 kOhm

    ตัวควบคุมระดับใช้ ALPS SRBM1L0800 วงจรควรใช้ตัวต้านทานที่มีค่าความคลาดเคลื่อน ±1% หรือดีกว่า ตัวจำกัดกระแสไฟ LED - ตัวต้านทานซีรีย์ 4306R ความสว่างสามารถเพิ่มขึ้นได้ขึ้นอยู่กับความชอบของนักแสดง เครื่องกำเนิดไฟฟ้าประกอบในกล่องพลาสติกขนาด 178x154x36 มม. พร้อมแผงอลูมิเนียมด้านหน้าและด้านหลัง

    ส่วนประกอบหน้าสัมผัสจำนวนมากติดตั้งอยู่ที่แผงด้านหน้าและด้านหลัง (ปุ่ม, ปุ่มหมุน, ขั้วต่อ RCA, ชุด LED, ขั้วต่อสายไฟ) แผงวงจรพิมพ์ติดอยู่กับตัวเครื่องด้วยสลักเกลียวพร้อมตัวเว้นระยะพลาสติก องค์ประกอบอื่น ๆ ทั้งหมดของเครื่องกำเนิดไฟฟ้าจะติดตั้งอยู่บนแผงวงจรพิมพ์ - แหล่งจ่ายไฟแยกจากกัน ปุ่มซ้ายตรงกลางคือเปลี่ยนโหมด ปุ่มขวาคือเลือกความถี่ของโหมด

    เครื่องกำเนิดไฟฟ้าจะสร้างสัญญาณต่างๆ และทำงานในสามโหมด ซึ่งเลือกโดยใช้ปุ่ม "เลือก" และระบุด้วยไฟ LED ด้านบนสามดวง (ในแผนภาพ) ปุ่มควบคุมแบบหมุนจะเปลี่ยนพารามิเตอร์สัญญาณตามตารางต่อไปนี้:

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

    เครื่องกำเนิดสัญญาณฟังก์ชัน DDS (เวอร์ชัน 2.0) นี้ประกอบบนไมโครคอนโทรลเลอร์ AVR มีฟังก์ชันการทำงานที่ดี มีการควบคุมแอมพลิจูด และยังประกอบบนแผงวงจรพิมพ์ด้านเดียวด้วย

    ตัวสร้างนี้ใช้อัลกอริธึมตัวสร้าง Jesper DDS โปรแกรมได้รับการปรับปรุงให้ทันสมัยสำหรับ AVR-GCC C ด้วยการแทรกโค้ดแอสเซมบลี เครื่องกำเนิดมีสัญญาณเอาต์พุตสองสัญญาณ: สัญญาณแรกคือสัญญาณ DDS สัญญาณที่สองคือเอาต์พุต "สี่เหลี่ยม" ความเร็วสูง (1..8 MHz) ซึ่งสามารถใช้เพื่อฟื้นฟู MK ด้วยฟัซซี่ที่ไม่ถูกต้องและเพื่อวัตถุประสงค์อื่น
    สัญญาณ HS ความเร็วสูง (ความเร็วสูง) นำมาโดยตรงจากไมโครคอนโทรลเลอร์ Atmega16 OC1A (PD5)
    สัญญาณ DDS ถูกสร้างขึ้นจากเอาต์พุต MC อื่นๆ ผ่านเมทริกซ์ R2R แบบต้านทานและผ่านชิป LM358N ซึ่งช่วยให้สามารถปรับแอมพลิจูดและออฟเซ็ตของสัญญาณได้ ออฟเซ็ตและแอมพลิจูดจะถูกปรับโดยใช้โพเทนชิโอมิเตอร์สองตัว สามารถปรับออฟเซ็ตได้ในช่วง +5V..-5V และแอมพลิจูดคือ 0...10V ความถี่ของสัญญาณ DDS สามารถปรับได้ในช่วง 0... 65534 Hz ​​ซึ่งเพียงพอสำหรับการทดสอบวงจรเสียงและงานวิทยุสมัครเล่นอื่น ๆ

    ลักษณะสำคัญของเครื่องกำเนิด DDS V2.0:
    - วงจรอย่างง่ายที่มีองค์ประกอบวิทยุทั่วไปและราคาไม่แพง
    - แผงวงจรพิมพ์ด้านเดียว
    - แหล่งจ่ายไฟในตัว
    - แยกเอาต์พุตความเร็วสูง (HS) สูงสุด 8 MHz;
    - สัญญาณ DDS พร้อมแอมพลิจูดและออฟเซ็ตที่แปรผัน
    - สัญญาณ DDS: ไซน์, สี่เหลี่ยม, เลื่อยและเลื่อยถอยหลัง, สามเหลี่ยม, สัญญาณ ECG และสัญญาณรบกวน
    - หน้าจอ LCD ขนาด 2×16;
    - แป้นพิมพ์ 5 ปุ่มที่ใช้งานง่าย;
    - ขั้นตอนการปรับความถี่: 1, 10, 100, 1,000, 10,000 Hz;
    - จดจำสถานะสุดท้ายหลังจากเปิดเครื่อง

    แผนภาพบล็อกด้านล่างแสดงโครงสร้างเชิงตรรกะของตัวสร้างฟังก์ชัน:

    อย่างที่คุณเห็น อุปกรณ์ต้องการแรงดันไฟฟ้าหลายระดับ: +5V, -12V, +12V แรงดันไฟฟ้า +12V และ -12V ใช้เพื่อควบคุมแอมพลิจูดและออฟเซ็ตของสัญญาณ แหล่งจ่ายไฟได้รับการออกแบบโดยใช้หม้อแปลงและชิปควบคุมแรงดันไฟฟ้าหลายตัว:

    แหล่งจ่ายไฟถูกประกอบบนบอร์ดแยกต่างหาก:

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

    หน้าจอแอลซีดี

    การกระทำทั้งหมดจะแสดงผ่านหน้าจอ LCD เครื่องกำเนิดไฟฟ้าถูกควบคุมโดยปุ่มห้าปุ่ม

    ปุ่มขึ้น/ลงใช้เพื่อเลื่อนดูเมนู ปุ่มซ้าย/ขวาใช้เพื่อเปลี่ยนค่าความถี่ เมื่อกดปุ่มกลาง สัญญาณที่เลือกจะเริ่มถูกสร้างขึ้น การกดปุ่มอีกครั้งจะหยุดเครื่องกำเนิด

    มีการจัดเตรียมค่าแยกต่างหากเพื่อกำหนดขั้นตอนการเปลี่ยนความถี่ สะดวกถ้าคุณต้องการเปลี่ยนความถี่ในช่วงกว้าง

    เครื่องกำเนิดเสียงรบกวนไม่มีการตั้งค่าใดๆ โดยจะใช้ฟังก์ชัน rand() ปกติ ซึ่งจะถูกป้อนเข้าเอาต์พุตของเครื่องกำเนิด DDS อย่างต่อเนื่อง

    เอาต์พุตความเร็วสูง HS มีโหมดความถี่ 4 โหมด: 1, 2, 4 และ 8 MHz

    แผนภาพ

    วงจรกำเนิดฟังก์ชันนั้นเรียบง่ายและมีองค์ประกอบที่เข้าถึงได้ง่าย:
    - ไมโครคอนโทรลเลอร์ AVR Atmega16 พร้อมควอตซ์ภายนอกที่ 16 MHz
    - หน้าจอ LCD ชนิด HD44780 มาตรฐาน 2 × 16;
    - เมทริกซ์ R2R DAC ทำจากตัวต้านทานธรรมดา
    - แอมพลิฟายเออร์สำหรับการดำเนินงาน LM358N (อะนาล็อกในประเทศของ KR1040UD1)
    - โพเทนชิโอมิเตอร์สองตัว
    - ห้าปุ่ม;
    - ขั้วต่อหลายอัน

    จ่าย:

    เครื่องกำเนิดไฟฟ้าใช้งานได้ประกอบในกล่องพลาสติก:


    ซอฟต์แวร์

    ดังที่ได้กล่าวไว้ข้างต้น ฉันใช้โปรแกรมของฉันโดยใช้อัลกอริธึมตัวสร้าง Jesper DDS ฉันเพิ่มโค้ดแอสเซมบลีสองสามบรรทัดเพื่อใช้การหยุดการสร้าง ตอนนี้อัลกอริธึมมี 10 รอบของ CPU แทนที่จะเป็น 9

    โมฆะอินไลน์คงที่ Signal_OUT (const uint8_t * สัญญาณ, uint8_t ad2, uint8_t ad1, uint8_t ad0) (
    asm ระเหยได้ ("eor r18, r18 ;r18<-0″ "\n\t"
    "eor r19, r19 ;r19<-0″ "\n\t"
    "1:" "\n\t"
    "เพิ่ม r18, %0 ;1 รอบ" "\n\t"
    "adc r19, %1 ;1 รอบ" "\n\t"
    "adc %A3, %2 ;1 รอบ" "\n\t"
    "lpm ;3 รอบ" "\n\t"
    "ออก %4, __tmp_reg__ ;1 รอบ" "\n\t"
    "sbis %5, 2 ;1 รอบ ถ้าไม่มีการข้าม" "\n\t"
    "rjmp 1b ;2 รอบ รวม 10 รอบ" "\n\t"
    :
    :"r" (ad0),,"r" (ad1),"r" (ad2),,"e" (สัญญาณ),,"I" (_SFR_IO_ADDR(PORTA)), "I" (_SFR_IO_ADDR(SPCR ))
    :"r18″, "r19″
    );}

    ตารางรูปแบบสัญญาณ DDS อยู่ในหน่วยความจำแฟลชของ MK ซึ่งที่อยู่เริ่มต้นที่ 0xXX00 ส่วนเหล่านี้ถูกกำหนดไว้ใน makefile ในตำแหน่งหน่วยความจำที่เหมาะสม:
    #กำหนดส่วนที่จะจัดเก็บตารางสัญญาณ
    LDFLAGS += -Wl,-section-start=.MySection1=0x3A00
    LDFLAGS += -Wl,-section-start=.MySection2=0x3B00
    LDFLAGS += -Wl,-section-start=.MySection3=0x3C00
    LDFLAGS += -Wl,-section-start=.MySection4=0x3D00
    LDFLAGS += -Wl,-section-start=.MySection5=0x3E00
    LDFLAGS += -Wl,-section-start=.MySection6=0x3F00