विषयसूची:

Arduino वेवफॉर्म जेनरेटर: 5 कदम (चित्रों के साथ)
Arduino वेवफॉर्म जेनरेटर: 5 कदम (चित्रों के साथ)

वीडियो: Arduino वेवफॉर्म जेनरेटर: 5 कदम (चित्रों के साथ)

वीडियो: Arduino वेवफॉर्म जेनरेटर: 5 कदम (चित्रों के साथ)
वीडियो: Arduino square wave generator up to 1Mhz 2024, नवंबर
Anonim
Arduino वेवफॉर्म जेनरेटर
Arduino वेवफॉर्म जेनरेटर

फरवरी 2021 अपडेट: रास्पबेरी पिको के आधार पर 300x नमूना दर के साथ नया संस्करण देखें।

प्रयोगशाला में, किसी को अक्सर एक निश्चित आवृत्ति, आकार और आयाम के दोहराव वाले संकेत की आवश्यकता होती है। यह एक एम्पलीफायर का परीक्षण करने के लिए हो सकता है, एक सर्किट, एक घटक या एक एक्ट्यूएटर की जांच कर सकता है। शक्तिशाली तरंग जनरेटर व्यावसायिक रूप से उपलब्ध हैं, लेकिन Arduino Uno या Arduino Nano के साथ स्वयं को उपयोगी बनाना अपेक्षाकृत आसान है, उदाहरण के लिए देखें:

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

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

निम्नलिखित विशेषताओं के साथ एक और का विवरण यहां दिया गया है:

* सटीक तरंग: R2R DAC, 256-नमूना आकार का उपयोग करके 8-बिट आउटपुट

* तेज: ३८१ kHz नमूना दर

* सटीक: 1mHz चरण आवृत्ति रेंज। Arduino क्रिस्टल जितना सटीक।

* आसान संचालन: एकल रोटरी एनकोडर के साथ तरंग और आवृत्ति बसने योग्य;

* आयामों की विस्तृत श्रृंखला: मिलीवोल्ट से 20V

* 20 पूर्व परिभाषित तरंग। अधिक जोड़ने के लिए सीधा।

* बनाने में आसान: Arduino Uno या Nano प्लस मानक घटक

चरण 1: तकनीकी विचार

एनालॉग सिग्नल बनाना

Arduino Uno और Nano की एक कमी यह है कि इसमें डिजिटल-से-एनालॉग (DAC) कनवर्टर नहीं है, इसलिए इसे सीधे पिन पर एक एनालॉग वोल्टेज का उत्पादन करना संभव नहीं है। एक समाधान R2R सीढ़ी है: 8 डिजिटल पिन एक प्रतिरोधक नेटवर्क से जुड़े होते हैं ताकि आउटपुट के 256 स्तरों तक पहुँचा जा सके। डायरेक्ट पोर्ट एक्सेस के माध्यम से, Arduino एक ही कमांड के साथ एक साथ 8 पिन सेट कर सकता है। रेसिस्टर नेटवर्क के लिए, R मान वाले 9 रेसिस्टर्स और 2R मान वाले 8 रेसिस्टर्स की आवश्यकता होती है। मैंने R के मान के रूप में 10kOhm का उपयोग किया, जो कि पिन से करंट को 0.5mA या उससे कम तक रखता है। मुझे लगता है कि R=1kOhm भी काम कर सकता है, क्योंकि Arduino आसानी से 5mA प्रति पिन, 40mA प्रति पोर्ट वितरित कर सकता है। यह महत्वपूर्ण है कि R और 2R प्रतिरोधों के बीच का अनुपात वास्तव में 2 है। यह कुल 25 प्रतिरोधों के लिए, मूल्य R के 2 प्रतिरोधों को श्रृंखला में रखकर सबसे आसानी से प्राप्त किया जाता है।

चरण संचायक

एक तरंग उत्पन्न करना फिर Arduino पिन को 8-बिट संख्याओं के अनुक्रम को बार-बार भेजने के लिए नीचे आता है। तरंग को 256 बाइट्स की एक सरणी में संग्रहीत किया जाता है और इस सरणी का नमूना लिया जाता है और पिन को भेजा जाता है। आउटपुट सिग्नल की आवृत्ति इस बात से निर्धारित होती है कि एरे के माध्यम से कोई कितनी तेजी से आगे बढ़ता है। ऐसा करने का एक मजबूत, सटीक और सुरुचिपूर्ण तरीका एक चरण संचायक के साथ है: एक 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 की सटीकता। कोड 16 मेगाहर्ट्ज धारणा के छोटे विचलन के लिए आवृत्ति और चरण वृद्धि के अनुपात को संशोधित करने की अनुमति देता है।

बफरिंग और प्रवर्धन

रोकनेवाला नेटवर्क में एक उच्च आउटपुट प्रतिबाधा होती है, इसलिए यदि लोड जुड़ा हुआ है तो इसका आउटपुट वोल्टेज जल्दी गिर जाता है। इसे बफ़रिंग या आउटपुट को बढ़ाकर हल किया जा सकता है। यहाँ, बफरिंग और प्रवर्धन एक opamp के साथ किया जाता है। मैंने LM358 का उपयोग किया क्योंकि मेरे पास कुछ था। यह एक धीमी ओपैंप (स्लीव रेट 0.5V प्रति माइक्रोसेकंड) है, इसलिए उच्च आवृत्ति और उच्च आयाम पर सिग्नल विकृत हो जाता है। एक अच्छी बात यह है कि यह 0V के बहुत करीब वोल्टेज को संभाल सकता है। आउटपुट वोल्टेज हालांकि रेल के नीचे ~ 2V तक सीमित है, इसलिए +5V पावर का उपयोग आउटपुट वोल्टेज को 3V तक सीमित कर देता है। स्टेप-अप मॉड्यूल कॉम्पैक्ट और सस्ते हैं। opamp को +20V खिलाकर, यह 18V तक के वोल्टेज के साथ सिग्नल उत्पन्न कर सकता है। (एनबी, योजनाबद्ध एलटीसी3105 कहता है क्योंकि फ्रिट्ज़िंग में मुझे यही एकमात्र स्टेप-अप मिला था। वास्तव में मैंने एमटी 3608 मॉड्यूल का उपयोग किया था, अगले चरणों में चित्र देखें)। मैं R2R DAC के आउटपुट के लिए एक चर क्षीणन को लागू करना चुनता हूं, फिर एक opamps का उपयोग बिना प्रवर्धन के सिग्नल को बफर करने के लिए और दूसरे को 5.7 से बढ़ाने के लिए करता हूं, ताकि सिग्नल लगभग 20V के अधिकतम आउटपुट तक पहुंच सके। आउटपुट करंट सीमित है, ~ 10mA, इसलिए यदि सिग्नल एक बड़े स्पीकर या इलेक्ट्रोमैग्नेट को चलाने के लिए है तो एक मजबूत एम्पलीफायर की आवश्यकता हो सकती है।

चरण 2: आवश्यक घटक

कोर तरंग जनरेटर के लिए

Arduino Uno या Nano

16x2 एलसीडी डिस्प्ले + 20kOhm ट्रिमर और बैकलाइट के लिए 100Ohm सीरीज रेसिस्टर

5-पिन रोटरी एनकोडर (एकीकृत पुशबटन के साथ)

10kOhm. के 25 प्रतिरोधक

बफर/एम्पलीफायर के लिए

LM358 या अन्य दोहरी opamp

MT3608. पर आधारित स्टेप-अप मॉड्यूल

50kOhm चर रोकनेवाला

10kOhm रोकनेवाला

47kOhm रोकनेवाला

1muF संधारित्र

चरण 3: निर्माण

निर्माण
निर्माण
निर्माण
निर्माण

जैसा कि चित्र में दिखाया गया है, मैंने 7x9cm प्रोटोटाइप बोर्ड पर सब कुछ मिलाप किया। चूंकि यह सभी तारों के साथ थोड़ा गड़बड़ हो गया था, इसलिए मैंने उन लीडों को रंगने की कोशिश की जो सकारात्मक वोल्टेज को लाल रंग में ले जाती हैं और जो जमीन को काला करती हैं।

मैंने जो एनकोडर इस्तेमाल किया है उसमें 5 पिन हैं, एक तरफ 3, दूसरी तरफ 2। 3 पिन वाला पक्ष वास्तविक एन्कोडर है, 2 पिन वाला पक्ष एकीकृत पुशबटन है। 3-पिन की तरफ, केंद्रीय पिन को जमीन से जोड़ा जाना चाहिए, अन्य दो पिनों को D10 और D11 से जोड़ा जाना चाहिए। 2-पिन की तरफ, एक पिन को जमीन से और दूसरे को D12 से जोड़ा जाना चाहिए।

यह अब तक की सबसे बदसूरत चीज है लेकिन यह काम करती है। एक बाड़े में रखना अच्छा होगा, लेकिन अभी के लिए अतिरिक्त काम और लागत वास्तव में इसे उचित नहीं ठहराती है। नैनो और डिस्प्ले पिन-हेडर के साथ जुड़े हुए हैं। अगर मैं एक नया निर्माण करता तो मैं ऐसा दोबारा नहीं करता। मैंने सिग्नल लेने के लिए बोर्ड पर कनेक्टर नहीं लगाए। इसके बजाय, मैं उन्हें तांबे के तार के उभरे हुए टुकड़ों से मगरमच्छ के साथ उठाता हूं, जिसे निम्नानुसार लेबल किया गया है:

R - R2R DAC से कच्चा संकेत

बी - बफर सिग्नल

ए - प्रवर्धित संकेत

टी - पिन 9. से टाइमर सिग्नल

जी - ग्राउंड

+ - स्टेप-अप मॉड्यूल से सकारात्मक 'उच्च' वोल्टेज

चरण 4: कोड

कोड, एक Arduino स्केच, संलग्न है और इसे Arduino पर अपलोड किया जाना चाहिए।

20 तरंगों को पूर्व-परिभाषित किया गया है। किसी अन्य तरंग को जोड़ना सीधा होना चाहिए। ध्यान दें कि यादृच्छिक तरंगें 256-मान सरणी को यादृच्छिक मानों से भरती हैं, लेकिन एक ही पैटर्न हर अवधि में दोहराया जाता है। सच्चे यादृच्छिक संकेत शोर की तरह लगते हैं, लेकिन यह तरंग सीटी की तरह अधिक लगती है।

कोड TIMER1 के साथ पिन D9 पर 1kHz सिग्नल सेट करता है। यह एनालॉग सिग्नल के समय की जांच करने के लिए उपयोगी है। इस तरह मुझे पता चला कि घड़ी चक्रों की संख्या 42 है: यदि मैं 41 या 43 मान लेता हूं, और 1kHz सिग्नल उत्पन्न करता हूं, तो यह स्पष्ट रूप से पिन D9 पर सिग्नल से अलग आवृत्ति है। 42 के मान के साथ वे पूरी तरह मेल खाते हैं।

आम तौर पर, Arduino मिलिस () फ़ंक्शन के साथ समय का ट्रैक रखने के लिए प्रत्येक मिलीसेकंड को बाधित करता है। यह सटीक सिग्नल जनरेशन को परेशान करेगा, इसलिए विशेष रुकावट अक्षम है।

कंपाइलर कहता है: "स्केच प्रोग्राम स्टोरेज स्पेस के 7254 बाइट्स (23%) का उपयोग करता है। अधिकतम 30720 बाइट्स है। ग्लोबल वेरिएबल डायनेमिक मेमोरी के 483 बाइट्स (23%) का उपयोग करते हैं, स्थानीय वैरिएबल के लिए 1565 बाइट्स छोड़ते हैं। अधिकतम 2048 बाइट्स है।" तो अधिक परिष्कृत कोड के लिए पर्याप्त जगह है। सावधान रहें कि नैनो में सफलतापूर्वक अपलोड करने के लिए आपको "ATmega328P (पुराना बूटलोडर)" चुनना पड़ सकता है।

चरण 5: उपयोग

सिग्नल जनरेटर को केवल Arduino नैनो के मिनी-यूएसबी केबल के माध्यम से संचालित किया जा सकता है। यह एक पावर बैंक के साथ सबसे अच्छा किया जाता है, ताकि उस उपकरण के साथ कोई आकस्मिक ग्राउंड लूप न हो जिससे इसे जोड़ा जा सके।

जब इसे चालू किया जाता है तो यह 100Hz साइन वेव उत्पन्न करेगा। घुंडी को घुमाकर, अन्य 20 तरंग प्रकारों में से एक को चुना जा सकता है। धक्का देते समय घुमाकर, कर्सर को आवृत्ति के किसी भी अंक पर सेट किया जा सकता है, जिसे बाद में वांछित मान में बदला जा सकता है।

आयाम को पोटेंशियोमीटर के साथ विनियमित किया जा सकता है और या तो बफर्ड या प्रवर्धित संकेत का उपयोग किया जा सकता है।

सिग्नल आयाम की जांच करने के लिए ऑसिलोस्कोप का उपयोग करना वास्तव में सहायक होता है, विशेष रूप से जब सिग्नल किसी अन्य डिवाइस को वर्तमान आपूर्ति करता है। यदि बहुत अधिक करंट खींचा जाता है, तो सिग्नल क्लिप हो जाएगा और सिग्नल बहुत विकृत हो जाएगा

बहुत कम आवृत्तियों के लिए, आउटपुट को 10kOhm रोकनेवाला के साथ श्रृंखला में एक एलईडी के साथ देखा जा सकता है। ऑडियो फ्रीक्वेंसी को स्पीकर से सुना जा सकता है। सिग्नल को बहुत छोटा ~0.5V सेट करना सुनिश्चित करें, अन्यथा करंट बहुत अधिक हो जाता है और सिग्नल कतरन शुरू हो जाता है।

सिफारिश की: