एटमेल माइक्रोकंट्रोलर पर डीडीएस जनरेटर का योजनाबद्ध आरेख। पीएलसी पर कार्यात्मक डीडीएस जनरेटर। असेंबली के बाद जनरेटर ऑपरेटिंग मोड का परीक्षण

एटमेल माइक्रोकंट्रोलर पर डीडीएस जनरेटर का योजनाबद्ध आरेख।  पीएलसी पर कार्यात्मक डीडीएस जनरेटर।  असेंबली के बाद जनरेटर ऑपरेटिंग मोड का परीक्षण
एटमेल माइक्रोकंट्रोलर पर डीडीएस जनरेटर का योजनाबद्ध आरेख। पीएलसी पर कार्यात्मक डीडीएस जनरेटर। असेंबली के बाद जनरेटर ऑपरेटिंग मोड का परीक्षण

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

दिन शून्य

सप्ताहांत आने से पहले, मेरे पास कार्यान्वयन के बारे में सोचने के लिए कुछ समय था। अपने कार्य को सरल बनाने के लिए, मैंने जनरेटर को बटन और एलसीडी स्क्रीन के साथ एक अलग उपकरण के रूप में नहीं, बल्कि एक उपकरण के रूप में बनाने का निर्णय लिया जो यूएसबी के माध्यम से पीसी से जुड़ता है। इसके लिए मेरे पास USB2RS232 बोर्ड है। बोर्ड को ड्राइवरों (सीडीसी) की आवश्यकता नहीं है, इसलिए, मुझे लगता है कि यह लिनक्स के तहत काम करेगा (कुछ के लिए यह महत्वपूर्ण है)। इसके अलावा, मैं यह नहीं छिपाऊंगा कि मैं पहले ही आरएस232 के माध्यम से संदेश प्राप्त करने पर काम कर चुका हूं। मैं opencores.com से RS232 के साथ काम करने के लिए तैयार मॉड्यूल लूंगा।

साइन वेव सिग्नल उत्पन्न करने के लिए आपको DAC की आवश्यकता होगी। मैंने DAC प्रकार चुना, जैसा कि मूल प्रोजेक्ट में था - R2R 8-बिट। यह आपको मेगाहर्ट्ज़ के क्रम पर उच्च आवृत्तियों पर काम करने की अनुमति देगा। मैं आश्वस्त हूं कि एफपीजीए को इससे निपटना चाहिए

मैं सोच रहा था कि COM पोर्ट के माध्यम से डेटा संचारित करने के लिए प्रोग्राम कैसे लिखा जाए। एक ओर, आप डेल्फ़ी7 में लिख सकते हैं; आपके पास पहले से ही ऐसा प्रोग्राम लिखने का अनुभव है, और इसके अलावा, निष्पादन योग्य फ़ाइल का आकार बड़ा नहीं होगा। मैंने HTML पेज में जावा स्क्रिप्ट के रूप में सीरियल के साथ काम करने के लिए कुछ स्केच करने की भी कोशिश की, लेकिन यह कमोबेश केवल क्रोम सीरियल एपीआई के माध्यम से काम करता था, लेकिन इसके लिए आपको एक प्लगइन इंस्टॉल करना होगा... सामान्य तौर पर , यह भी सवाल से बाहर है। मैंने PyQt5 को अपने लिए एक नवाचार के रूप में आज़माया, लेकिन ऐसी परियोजना को वितरित करते समय, आपको पुस्तकालयों का एक समूह खींचने की आवश्यकता होती है। एक PyQt प्रोजेक्ट को exe फ़ाइल में संकलित करने का प्रयास करने पर, यह 10 एमबी से अधिक निकला। यानी, यह C++\Qt5 में लिखे गए एप्लिकेशन से बेहतर नहीं होगा। यह भी विचार करने योग्य है कि मुझे पायथन में विकास करने का अनुभव नहीं है, लेकिन मुझे Qt5 में अनुभव है। इसलिए, विकल्प Qt5 पर पड़ा। पांचवें संस्करण के बाद से, धारावाहिक के साथ काम करने के लिए एक मॉड्यूल सामने आया और मैं पहले ही इसके साथ काम कर चुका हूं। और Qt5 पर आधारित एप्लिकेशन को लिनक्स और मैक पर स्थानांतरित किया जा सकता है (कुछ के लिए यह महत्वपूर्ण है), और संस्करण 5.2 से, QWidgets पर आधारित एप्लिकेशन को स्मार्टफोन में भी स्थानांतरित किया जा सकता है!

और क्या चाहिए? स्वाभाविक रूप से, बोर्ड के पास FPGA है। मेरे पास उनमें से दो हैं (10 हजार कोशिकाओं के लिए चक्रवात iv EP4CE10E22C8N, और 5 हजार कोशिकाओं के लिए चक्रवात ii EP2C5)। अधिक सुविधाजनक कनेक्टर के कारण मैं बाईं ओर वाले को चुनूंगा। मात्रा के संदर्भ में, परियोजना का बड़ा होने का इरादा नहीं है, इसलिए यह दोनों में से किसी एक में फिट होगा। वे गति में भिन्न नहीं हैं। दोनों बोर्डों में 50 मेगाहर्ट्ज ऑसिलेटर हैं, और एफपीजीए के अंदर एक पीएलएल है, जिसके साथ मैं आवृत्ति को नियोजित 200 मेगाहर्ट्ज तक बढ़ा सकता हूं।

पहला दिन

इस तथ्य के कारण कि मैंने पहले ही अपने सिंथेसाइज़र प्रोजेक्ट में डीडीएस मॉड्यूल बना लिया था, मैंने तुरंत सोल्डरिंग आयरन उठाया और प्रतिरोधों के साथ डीएसी को सोल्डर करना शुरू कर दिया। मैंने एक प्रोटोटाइप बोर्ड लिया। इंस्टॉलेशन रैपिंग का उपयोग करके किया गया था। प्रौद्योगिकी को प्रभावित करने वाला एकमात्र परिवर्तन यह था कि मैंने टीटी इंडिकेटर फ्लक्स जेल के पक्ष में स्टैंड को टिनिंग करने के लिए F38N एसिड को छोड़ दिया। प्रौद्योगिकी का सार सरल है: मैं एक मुद्रित सर्किट बोर्ड में रैक को मिलाप करता हूं, और मुद्रित सर्किट बोर्ड की तरफ से उन पर प्रतिरोधकों को मिलाप करता हूं। मैं छूटे हुए कनेक्शनों को घुमा-फिरा कर बनाता हूं। इसके अलावा, रैक सुविधाजनक हैं क्योंकि मैं उन्हें सीधे एफपीजीए बोर्ड में डाल सकता हूं।

दुर्भाग्य से, घर पर 1 और 2 किलो-ओम प्रतिरोधक उपलब्ध नहीं थे। दुकान पर जाने का समय नहीं था. मुझे अपना एक नियम छोड़ना पड़ा और पुराने अनावश्यक बोर्ड से प्रतिरोधों को हटाना पड़ा। वहां 15K और 30K रेसिस्टर्स का इस्तेमाल किया गया था। परिणाम यह फ्रेंकस्टीन है:


प्रोजेक्ट बनाने के बाद, आपको लक्ष्य डिवाइस सेट करना होगा: मेनू असाइनमेंट -> डिवाइस


परियोजना में, मैंने अनियंत्रित मुख्य डीडीएस मॉड्यूल को एक निश्चित आवृत्ति पर कोडित किया।

1000 हर्ट्ज जेनरेटर मॉड्यूल

मॉड्यूल सिग्नल_जेनरेटर (clk50M, सिग्नल_आउट); इनपुट तार clk50M; वायर आउटपुट सिग्नल_आउट; तार clk200M; osc osc_200M reg संचायक; सिग्नल_आउट = संचायक असाइन करें; //1000 हर्ट्ज उत्पन्न करने का प्रयास करें //50,000,000 हर्ट्ज - बाहरी जनरेटर की घड़ी आवृत्ति //2^32 = 4,294,967,296 - डीडीएस बिट गहराई - 32 बिट्स //1000 हर्ट्ज / 50,000,000 हर्ट्ज / 2 * 4294967296 => 42949, 67296 हमेशा @ विभाजित करें (possge clk50M) संचायक प्रारंभ करें<= accumulator + 32"d42949; end endmodule


उसके बाद, मैंने "संकलन प्रारंभ करें" पर क्लिक किया ताकि विकास वातावरण पूछे कि हमारे पास प्रोजेक्ट के मुख्य मॉड्यूल में कौन सी इनपुट/आउटपुट लाइनें हैं और वे किस भौतिक पिन से जुड़े हैं, आप संकलन के बाद लगभग किसी से भी जुड़ सकते हैं चिप FPGA के वास्तविक पिन पर दिखाई देने वाली लाइनें निर्दिष्ट करें:

मेनू आइटम असाइनमेंट -> पिन प्लानर

कृपया अभी के लिए HS_OUT, key0 और key1 पंक्तियों को अनदेखा करें, वे बाद में प्रोजेक्ट में दिखाई देंगे, लेकिन मेरे पास शुरुआत में स्क्रीनशॉट लेने का समय नहीं था।

सिद्धांत रूप में, स्थान कॉलम में केवल PIN_nn को "रजिस्टर" करना पर्याप्त है, और शेष पैरामीटर (I/O मानक, करंट स्ट्रेंच और स्लीव रेट) को डिफ़ॉल्ट रूप से छोड़ा जा सकता है, या आप उन्हीं का चयन कर सकते हैं जो प्रस्तावित हैं डिफ़ॉल्ट (डिफ़ॉल्ट) ताकि कोई चेतावनी न हो "ओवी।

मैं कैसे पता लगा सकता हूं कि कौन सा पिन बोर्ड पर कनेक्टर नंबर से मेल खाता है?

कनेक्टर पिन नंबर बोर्ड पर अंकित हैं


और FPGA पिन जिनसे कनेक्टर संपर्क जुड़े हुए हैं, FPGA बोर्ड के साथ आने वाले दस्तावेज़ में वर्णित हैं।




पिन आवंटित होने के बाद, मैं प्रोजेक्ट को फिर से संकलित करता हूं और यूएसबी प्रोग्रामर का उपयोग करके इसे फ्लैश करता हूं। यदि आपके पास यूएसबी बाइट ब्लास्टर प्रोग्रामर के लिए ड्राइवर स्थापित नहीं हैं, तो विंडोज़ को बताएं कि वे उस फ़ोल्डर में स्थित हैं जहां आपने क्वार्टस स्थापित किया है। फिर वह इसे स्वयं ढूंढ लेगी।

प्रोग्रामर को JTAG कनेक्टर से जुड़ा होना चाहिए। और प्रोग्रामिंग के लिए मेनू आइटम "टूल्स -> प्रोग्रामर" है (या टूलबार पर आइकन पर क्लिक करें)। "प्रारंभ" बटन, हर्षित "सफलता" और फर्मवेयर पहले से ही एफपीजीए के अंदर हैं और पहले से ही काम कर रहे हैं। बस FPGA को बंद न करें, अन्यथा यह सब कुछ भूल जाएगा।

उपकरण -> प्रोग्रामर


DAC FPGA बोर्ड कनेक्टर से जुड़ा है। मैं S1-112A ऑसिलोस्कोप को DAC आउटपुट से जोड़ता हूं। परिणाम "आरा" होना चाहिए क्योंकि चरण संचायक के डीडीएस शब्द का उच्च-क्रम भाग 8-बिट आउटपुट पर आउटपुट होता है। और यह हमेशा बढ़ता रहता है जब तक कि यह ओवरफ्लो न हो जाए।

कुछ 1.5 घंटे और 1000 हर्ट्ज़ की आवृत्ति के लिए मुझे निम्नलिखित ऑसिलोग्राम दिखाई देता है:

मैं यह नोट करना चाहूंगा कि "आरी" के बीच में एक छोटा सा फ्रैक्चर है। यह इस तथ्य के कारण है कि प्रतिरोधों के मूल्यों की एक श्रृंखला होती है।

एक और महत्वपूर्ण बिंदु जिसे स्पष्ट करने की आवश्यकता है वह अधिकतम संभव आवृत्ति है जिसके साथ डीडीएस जनरेटर संचालित होगा। सही ढंग से कॉन्फ़िगर किए गए टाइमक्वेस्ट मापदंडों के साथ, "संकलन रिपोर्ट" में संकलन के बाद आप देख सकते हैं कि सर्किट की गति मार्जिन के साथ 200 मेगाहर्ट्ज से ऊपर है। इसका मतलब है कि मैं पीएलएल का उपयोग करके 50 मेगाहर्ट्ज की जनरेटर आवृत्ति को 4 से गुणा करूंगा, मैं 200 मेगाहर्ट्ज की आवृत्ति के साथ डीडीएस चरण संचायक का मूल्य बढ़ाऊंगा। हमारी परिस्थितियों में प्राप्त की जा सकने वाली अंतिम आवृत्ति रेंज 0 - 100 मेगाहर्ट्ज है। फ़्रिक्वेंसी सेटिंग सटीकता:

200,000,000 हर्ट्ज (सीएलके) / 2^32 (डीडीएस) = 0.047 हर्ट्ज
यानी यह ~0.05 हर्ट्ज से बेहतर है। मैं ऑपरेटिंग आवृत्तियों की ऐसी सीमा (0...100 मेगाहर्ट्ज) वाले जनरेटर के लिए हर्ट्ज़ के एक अंश की सटीकता को पर्याप्त मानता हूं। यदि किसी को सटीकता बढ़ाने की आवश्यकता है, तो ऐसा करने के लिए, आप डीडीएस बिट गहराई बढ़ा सकते हैं (टाइमक्वेस्ट टाइमिंग एनालाइज़र की जांच करना याद रखें कि लॉजिक सर्किट की ऑपरेटिंग गति सीएलके = 200 मेगाहर्ट्ज के भीतर थी, क्योंकि यह एक योजक है), या बस घड़ी की आवृत्ति को कम करें, यदि इतनी विस्तृत आवृत्ति रेंज की आवश्यकता नहीं है।

टाइमक्वेस्ट समय विश्लेषक


स्क्रीन पर "देखा" देखने के बाद, पारिवारिक मामलों ने मुझे देश जाने के लिए मजबूर कर दिया (वह मेरी छुट्टी का दिन था)। वहां मैंने घास काटी, खाना बनाया, बारबेक्यू किया और शाम को जो आश्चर्य मेरा इंतजार कर रहा था, उसके बारे में मुझे कोई अंदाजा नहीं था। रात के करीब, बिस्तर पर जाने से पहले, मैंने अन्य आवृत्तियों के लिए सिग्नल के आकार को देखने का फैसला किया।

आवृत्ति 100 kHz के लिए

आवृत्ति 250 kHz के लिए

आवृत्ति 500 ​​kHz के लिए

1 मेगाहर्ट्ज आवृत्ति के लिए

दूसरा दिन

इस तथ्य के कारण कि यह दिलचस्प था कि डीएसी 100 और 200 ओम के प्रतिरोधों पर कैसे काम करेगा, मैंने तुरंत सोल्डरिंग आयरन ले लिया। इस बार DAC अधिक सटीक निकला और इसे स्थापित करने में कम समय लगा।

हम DAC को FPGA बोर्ड पर रखते हैं और इसे ऑसिलोस्कोप से जोड़ते हैं

1 मेगाहर्ट्ज की जाँच - वीओ! यह बिल्कुल अलग मामला है!

10 मेगाहर्ट्ज देखा

25 मेगाहर्ट्ज देखा


10 मेगाहर्ट्ज आरी का आकार अभी भी सही आरी के समान है। लेकिन 25 मेगाहर्ट्ज पर यह अब बिल्कुल भी "सुंदर" नहीं है। हालाँकि, C1-112a की बैंडविड्थ 10 मेगाहर्ट्ज है, इसलिए इस मामले में इसका कारण पहले से ही ऑसिलोस्कोप में हो सकता है।

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

hs_out = संचायक असाइन करें;

वर्गाकार तरंग 1 मेगाहर्ट्ज

वर्गाकार तरंग 5 मेगाहर्ट्ज

वर्गाकार तरंग 25 मेगाहर्ट्ज

50 मेगाहर्ट्ज वर्ग तरंग अब लगभग अदृश्य है


लेकिन मुझे लगता है कि एफपीजीए आउटपुट को प्रतिरोध के साथ लोड किया जाना चाहिए। शायद मोर्चे अधिक तीव्र रहे होंगे।

साइन तालिका के अनुसार किया जाता है। तालिका का आकार 8 बिट्स के 256 मान हैं। अधिक लेना संभव होता, लेकिन मेरे पास पहले से ही एक तैयार एमआईएफ फ़ाइल थी। विज़ार्ड का उपयोग करके, हम एमआईएफ फ़ाइल से साइन टेबल डेटा के साथ एक ROM तत्व बनाते हैं।

एक ROM बनाना - टूल्स -> मेगा विज़ार्ड प्लगइन मैनेजर


1 पोर्ट ROM चुनें और मॉड्यूल को एक नाम दें

हम सहमत

यहां हम भी सहमत हैं

ब्राउज का उपयोग करके, हम साइन टेबल के साथ अपनी एमआईएफ फाइल ढूंढते हैं

हम यहां भी कुछ नहीं बदलते.

मॉड्यूल sine_rom_bb.v को अनचेक करें - इसकी आवश्यकता नहीं है। अगला समापन. क्वार्टस परियोजना में एक मॉड्यूल जोड़ने के लिए कहेगा - हम सहमत हैं। इसके बाद, मॉड्यूल का उपयोग वेरिलॉग में किसी भी अन्य मॉड्यूल की तरह ही किया जा सकता है।


डीडीएस संचायक शब्द के ऊपरी 8 बिट्स को ROM पते के रूप में उपयोग किया जाएगा, और डेटा आउटपुट साइन मान होगा।

कोड

//साइन रोम वायर साइन_आउट; sine_rom sine1(.घड़ी(clk200M), .पता(संचायक), .q(sine_out));


विभिन्न आवृत्तियों पर साइन तरंग का ऑसिलोग्राम... एक जैसा दिखता है।

यदि चाहें, तो आप प्रतिरोधक प्रसार से जुड़ी DAC समस्याओं पर विचार कर सकते हैं:

खैर, यह सप्ताहांत का अंत है। लेकिन पीसी से नियंत्रण के लिए सॉफ्टवेयर अभी तक नहीं लिखा गया है। मैं इस तथ्य को स्वीकार करने के लिए मजबूर हूं कि मैं नियोजित समय सीमा को पूरा नहीं कर पाया।

तीसरा दिन

समय बहुत कम है, इसलिए हम जल्दी-जल्दी (सर्वोत्तम परंपराओं में) कार्यक्रम लिखते हैं। कुछ स्थानों पर, अक्षरों की संख्या कम करने और कीबोर्ड से जानकारी दर्ज करने में आसानी के लिए, विजेट नाम द्वारा एक इवेंट फ़िल्टर का उपयोग किया जाता है। कृपया समझें और क्षमा करें.

इंटरफेस

एनालॉग्स के साथ लिंक

पूरी सूची नहीं
कार्यात्मक डीडीएस जनरेटर। AVR के आधार पर बनाया गया. आवृत्तियाँ 0...65534 हर्ट्ज़।
डीडीएस जनरेटर GK101 की समीक्षा। Altera MAX240 FPGA का उपयोग करके बनाया गया। 10 मेगाहर्ट्ज तक की आवृत्ति।
PIC16F870 पर मल्टीफ़ंक्शन जनरेटर। फ़्रिक्वेंसी रेंज: 11 हर्ट्ज - 60 किलोहर्ट्ज़।
जेनरेटर टैग जोड़ें

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

दिन शून्य

सप्ताहांत आने से पहले, मेरे पास कार्यान्वयन के बारे में सोचने के लिए कुछ समय था। अपने कार्य को सरल बनाने के लिए, मैंने जनरेटर को बटन और एलसीडी स्क्रीन के साथ एक अलग उपकरण के रूप में नहीं, बल्कि एक उपकरण के रूप में बनाने का निर्णय लिया जो यूएसबी के माध्यम से पीसी से जुड़ता है। इसके लिए मेरे पास USB2RS232 बोर्ड है। बोर्ड को ड्राइवरों (सीडीसी) की आवश्यकता नहीं है, इसलिए, मुझे लगता है कि यह लिनक्स के तहत काम करेगा (कुछ के लिए यह महत्वपूर्ण है)। इसके अलावा, मैं यह नहीं छिपाऊंगा कि मैं पहले ही आरएस232 के माध्यम से संदेश प्राप्त करने पर काम कर चुका हूं। मैं opencores.com से RS232 के साथ काम करने के लिए तैयार मॉड्यूल लूंगा।

साइन वेव सिग्नल उत्पन्न करने के लिए आपको DAC की आवश्यकता होगी। मैंने DAC प्रकार चुना, जैसा कि मूल प्रोजेक्ट में था - R2R 8-बिट। यह आपको मेगाहर्ट्ज़ के क्रम पर उच्च आवृत्तियों पर काम करने की अनुमति देगा। मैं आश्वस्त हूं कि एफपीजीए को इससे निपटना चाहिए

मैं सोच रहा था कि COM पोर्ट के माध्यम से डेटा संचारित करने के लिए प्रोग्राम कैसे लिखा जाए। एक ओर, आप डेल्फ़ी7 में लिख सकते हैं; आपके पास पहले से ही ऐसा प्रोग्राम लिखने का अनुभव है, और इसके अलावा, निष्पादन योग्य फ़ाइल का आकार बड़ा नहीं होगा। मैंने HTML पेज में जावा स्क्रिप्ट के रूप में सीरियल के साथ काम करने के लिए कुछ स्केच करने की भी कोशिश की, लेकिन यह कमोबेश केवल क्रोम सीरियल एपीआई के माध्यम से काम करता था, लेकिन इसके लिए आपको एक प्लगइन इंस्टॉल करना होगा... सामान्य तौर पर , यह भी सवाल से बाहर है। मैंने PyQt5 को अपने लिए एक नवाचार के रूप में आज़माया, लेकिन ऐसी परियोजना को वितरित करते समय, आपको पुस्तकालयों का एक समूह खींचने की आवश्यकता होती है। एक PyQt प्रोजेक्ट को exe फ़ाइल में संकलित करने का प्रयास करने पर, यह 10 एमबी से अधिक निकला। यानी, यह C++\Qt5 में लिखे गए एप्लिकेशन से बेहतर नहीं होगा। यह भी विचार करने योग्य है कि मुझे पायथन में विकास करने का अनुभव नहीं है, लेकिन मुझे Qt5 में अनुभव है। इसलिए, विकल्प Qt5 पर पड़ा। पांचवें संस्करण के बाद से, धारावाहिक के साथ काम करने के लिए एक मॉड्यूल सामने आया और मैं पहले ही इसके साथ काम कर चुका हूं। और Qt5 पर आधारित एप्लिकेशन को लिनक्स और मैक पर स्थानांतरित किया जा सकता है (कुछ के लिए यह महत्वपूर्ण है), और संस्करण 5.2 से, QWidgets पर आधारित एप्लिकेशन को स्मार्टफोन में भी स्थानांतरित किया जा सकता है!

और क्या चाहिए? स्वाभाविक रूप से, बोर्ड के पास FPGA है। मेरे पास उनमें से दो हैं (10 हजार कोशिकाओं के लिए चक्रवात iv EP4CE10E22C8N, और 5 हजार कोशिकाओं के लिए चक्रवात ii EP2C5)। अधिक सुविधाजनक कनेक्टर के कारण मैं बाईं ओर वाले को चुनूंगा। मात्रा के संदर्भ में, परियोजना का बड़ा होने का इरादा नहीं है, इसलिए यह दोनों में से किसी एक में फिट होगा। वे गति में भिन्न नहीं हैं। दोनों बोर्डों में 50 मेगाहर्ट्ज ऑसिलेटर हैं, और एफपीजीए के अंदर एक पीएलएल है, जिसके साथ मैं आवृत्ति को नियोजित 200 मेगाहर्ट्ज तक बढ़ा सकता हूं।

पहला दिन

इस तथ्य के कारण कि मैंने पहले ही अपने सिंथेसाइज़र प्रोजेक्ट में डीडीएस मॉड्यूल बना लिया था, मैंने तुरंत सोल्डरिंग आयरन उठाया और प्रतिरोधों के साथ डीएसी को सोल्डर करना शुरू कर दिया। मैंने एक प्रोटोटाइप बोर्ड लिया। का उपयोग करके इंस्टालेशन किया गया। प्रौद्योगिकी को प्रभावित करने वाला एकमात्र परिवर्तन यह था कि मैंने टीटी इंडिकेटर फ्लक्स जेल के पक्ष में स्टैंड को टिनिंग करने के लिए F38N एसिड को छोड़ दिया। प्रौद्योगिकी का सार सरल है: मैं मुद्रित सर्किट बोर्ड में रैक को मिलाप करता हूं, और मुद्रित सर्किट बोर्ड की तरफ से उन पर प्रतिरोधकों को मिलाप करता हूं। मैं छूटे हुए कनेक्शनों को घुमाकर बनाता हूं। इसके अलावा, रैक सुविधाजनक हैं क्योंकि मैं उन्हें सीधे एफपीजीए बोर्ड में डाल सकता हूं।

दुर्भाग्य से, घर पर 1 और 2 किलो-ओम प्रतिरोधक उपलब्ध नहीं थे। दुकान पर जाने का समय नहीं था. मुझे अपना एक नियम छोड़ना पड़ा और पुराने अनावश्यक बोर्ड से प्रतिरोधों को हटाना पड़ा। वहां 15K और 30K रेसिस्टर्स का इस्तेमाल किया गया था। परिणाम यह फ्रेंकस्टीन है:


प्रोजेक्ट बनाने के बाद, आपको लक्ष्य डिवाइस सेट करना होगा: मेनू असाइनमेंट -> डिवाइस


परियोजना में, मैंने अनियंत्रित मुख्य डीडीएस मॉड्यूल को एक निश्चित आवृत्ति पर कोडित किया।

1000 हर्ट्ज जेनरेटर मॉड्यूल

मॉड्यूल सिग्नल_जेनरेटर (clk50M, सिग्नल_आउट); इनपुट तार clk50M; वायर आउटपुट सिग्नल_आउट; तार clk200M; osc osc_200M reg संचायक; सिग्नल_आउट = संचायक असाइन करें; //1000 हर्ट्ज उत्पन्न करने का प्रयास करें //50,000,000 हर्ट्ज - बाहरी जनरेटर की घड़ी आवृत्ति //2^32 = 4,294,967,296 - डीडीएस बिट गहराई - 32 बिट्स //1000 हर्ट्ज / 50,000,000 हर्ट्ज / 2 * 4294967296 => 42949, 67296 हमेशा @ विभाजित करें (possge clk50M) संचायक प्रारंभ करें<= accumulator + 32"d42949; end endmodule


उसके बाद, मैंने "संकलन प्रारंभ करें" पर क्लिक किया ताकि विकास वातावरण पूछे कि हमारे पास प्रोजेक्ट के मुख्य मॉड्यूल में कौन सी इनपुट/आउटपुट लाइनें हैं और वे किस भौतिक पिन से जुड़े हैं, आप संकलन के बाद लगभग किसी से भी जुड़ सकते हैं चिप FPGA के वास्तविक पिन पर दिखाई देने वाली लाइनें निर्दिष्ट करें:

मेनू आइटम असाइनमेंट -> पिन प्लानर

कृपया अभी के लिए HS_OUT, key0 और key1 पंक्तियों को अनदेखा करें, वे बाद में प्रोजेक्ट में दिखाई देंगे, लेकिन मेरे पास शुरुआत में स्क्रीनशॉट लेने का समय नहीं था।

सिद्धांत रूप में, स्थान कॉलम में केवल PIN_nn को "रजिस्टर" करना पर्याप्त है, और शेष पैरामीटर (I/O मानक, करंट स्ट्रेंच और स्लीव रेट) को डिफ़ॉल्ट रूप से छोड़ा जा सकता है, या आप उन्हीं का चयन कर सकते हैं जो प्रस्तावित हैं डिफ़ॉल्ट (डिफ़ॉल्ट) ताकि कोई चेतावनी न हो "ओवी।

मैं कैसे पता लगा सकता हूं कि कौन सा पिन बोर्ड पर कनेक्टर नंबर से मेल खाता है?

कनेक्टर पिन नंबर बोर्ड पर अंकित हैं


और FPGA पिन जिनसे कनेक्टर संपर्क जुड़े हुए हैं, FPGA बोर्ड के साथ आने वाले दस्तावेज़ में वर्णित हैं।




पिन आवंटित होने के बाद, मैं प्रोजेक्ट को फिर से संकलित करता हूं और यूएसबी प्रोग्रामर का उपयोग करके इसे फ्लैश करता हूं। यदि आपके पास यूएसबी बाइट ब्लास्टर प्रोग्रामर के लिए ड्राइवर स्थापित नहीं हैं, तो विंडोज़ को बताएं कि वे उस फ़ोल्डर में स्थित हैं जहां आपने क्वार्टस स्थापित किया है। फिर वह इसे स्वयं ढूंढ लेगी।

प्रोग्रामर को JTAG कनेक्टर से जुड़ा होना चाहिए। और प्रोग्रामिंग के लिए मेनू आइटम "टूल्स -> प्रोग्रामर" है (या टूलबार पर आइकन पर क्लिक करें)। "प्रारंभ" बटन, हर्षित "सफलता" और फर्मवेयर पहले से ही एफपीजीए के अंदर हैं और पहले से ही काम कर रहे हैं। बस FPGA को बंद न करें, अन्यथा यह सब कुछ भूल जाएगा।

उपकरण -> प्रोग्रामर


DAC FPGA बोर्ड कनेक्टर से जुड़ा है। मैं S1-112A ऑसिलोस्कोप को DAC आउटपुट से जोड़ता हूं। परिणाम "आरा" होना चाहिए क्योंकि चरण संचायक के डीडीएस शब्द का उच्च-क्रम भाग 8-बिट आउटपुट पर आउटपुट होता है। और यह हमेशा बढ़ता रहता है जब तक कि यह ओवरफ्लो न हो जाए।

कुछ 1.5 घंटे और 1000 हर्ट्ज़ की आवृत्ति के लिए मुझे निम्नलिखित ऑसिलोग्राम दिखाई देता है:

मैं यह नोट करना चाहूंगा कि "आरी" के बीच में एक छोटा सा फ्रैक्चर है। यह इस तथ्य के कारण है कि प्रतिरोधों के मूल्यों की एक श्रृंखला होती है।

एक और महत्वपूर्ण बिंदु जिसे स्पष्ट करने की आवश्यकता है वह अधिकतम संभव आवृत्ति है जिसके साथ डीडीएस जनरेटर संचालित होगा। सही ढंग से कॉन्फ़िगर किए गए टाइमक्वेस्ट मापदंडों के साथ, "संकलन रिपोर्ट" में संकलन के बाद आप देख सकते हैं कि सर्किट की गति मार्जिन के साथ 200 मेगाहर्ट्ज से ऊपर है। इसका मतलब है कि मैं पीएलएल का उपयोग करके 50 मेगाहर्ट्ज की जनरेटर आवृत्ति को 4 से गुणा करूंगा, मैं 200 मेगाहर्ट्ज की आवृत्ति के साथ डीडीएस चरण संचायक का मूल्य बढ़ाऊंगा। हमारी परिस्थितियों में प्राप्त की जा सकने वाली अंतिम आवृत्ति रेंज 0 - 100 मेगाहर्ट्ज है। फ़्रिक्वेंसी सेटिंग सटीकता:

200,000,000 हर्ट्ज (सीएलके) / 2^32 (डीडीएस) = 0.047 हर्ट्ज
यानी यह ~0.05 हर्ट्ज से बेहतर है। मैं ऑपरेटिंग आवृत्तियों की ऐसी सीमा (0...100 मेगाहर्ट्ज) वाले जनरेटर के लिए हर्ट्ज़ के एक अंश की सटीकता को पर्याप्त मानता हूं। यदि किसी को सटीकता बढ़ाने की आवश्यकता है, तो ऐसा करने के लिए, आप डीडीएस बिट गहराई बढ़ा सकते हैं (टाइमक्वेस्ट टाइमिंग एनालाइज़र की जांच करना याद रखें कि लॉजिक सर्किट की ऑपरेटिंग गति सीएलके = 200 मेगाहर्ट्ज के भीतर थी, क्योंकि यह एक योजक है), या बस घड़ी की आवृत्ति को कम करें, यदि इतनी विस्तृत आवृत्ति रेंज की आवश्यकता नहीं है।

टाइमक्वेस्ट समय विश्लेषक


स्क्रीन पर "देखा" देखने के बाद, पारिवारिक मामलों ने मुझे देश जाने के लिए मजबूर कर दिया (वह मेरी छुट्टी का दिन था)। वहां मैंने घास काटी, खाना बनाया, बारबेक्यू किया और शाम को जो आश्चर्य मेरा इंतजार कर रहा था, उसके बारे में मुझे कोई अंदाजा नहीं था। रात के करीब, बिस्तर पर जाने से पहले, मैंने अन्य आवृत्तियों के लिए सिग्नल के आकार को देखने का फैसला किया।

आवृत्ति 100 kHz के लिए

आवृत्ति 250 kHz के लिए

आवृत्ति 500 ​​kHz के लिए

1 मेगाहर्ट्ज आवृत्ति के लिए

दूसरा दिन

इस तथ्य के कारण कि यह दिलचस्प था कि डीएसी 100 और 200 ओम के प्रतिरोधों पर कैसे काम करेगा, मैंने तुरंत सोल्डरिंग आयरन ले लिया। इस बार DAC अधिक सटीक निकला और इसे स्थापित करने में कम समय लगा।

हम DAC को FPGA बोर्ड पर रखते हैं और इसे ऑसिलोस्कोप से जोड़ते हैं

1 मेगाहर्ट्ज की जाँच - वीओ! यह बिल्कुल अलग मामला है!

10 मेगाहर्ट्ज देखा

25 मेगाहर्ट्ज देखा


10 मेगाहर्ट्ज आरी का आकार अभी भी सही आरी के समान है। लेकिन 25 मेगाहर्ट्ज पर यह अब बिल्कुल भी "सुंदर" नहीं है। हालाँकि, C1-112a की बैंडविड्थ 10 मेगाहर्ट्ज है, इसलिए इस मामले में इसका कारण पहले से ही ऑसिलोस्कोप में हो सकता है।

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

hs_out = संचायक असाइन करें;

वर्गाकार तरंग 1 मेगाहर्ट्ज

वर्गाकार तरंग 5 मेगाहर्ट्ज

वर्गाकार तरंग 25 मेगाहर्ट्ज

50 मेगाहर्ट्ज वर्ग तरंग अब लगभग अदृश्य है


लेकिन मुझे लगता है कि एफपीजीए आउटपुट को प्रतिरोध के साथ लोड किया जाना चाहिए। शायद मोर्चे अधिक तीव्र रहे होंगे।

साइन तालिका के अनुसार किया जाता है। तालिका का आकार 8 बिट्स के 256 मान हैं। अधिक लेना संभव होता, लेकिन मेरे पास पहले से ही एक तैयार एमआईएफ फ़ाइल थी। विज़ार्ड का उपयोग करके, हम एमआईएफ फ़ाइल से साइन टेबल डेटा के साथ एक ROM तत्व बनाते हैं।

एक ROM बनाना - टूल्स -> मेगा विज़ार्ड प्लगइन मैनेजर


1 पोर्ट ROM चुनें और मॉड्यूल को एक नाम दें

हम सहमत

यहां हम भी सहमत हैं

ब्राउज का उपयोग करके, हम साइन टेबल के साथ अपनी एमआईएफ फाइल ढूंढते हैं

हम यहां भी कुछ नहीं बदलते.

मॉड्यूल sine_rom_bb.v को अनचेक करें - इसकी आवश्यकता नहीं है। अगला समापन. क्वार्टस परियोजना में एक मॉड्यूल जोड़ने के लिए कहेगा - हम सहमत हैं। इसके बाद, मॉड्यूल का उपयोग वेरिलॉग में किसी भी अन्य मॉड्यूल की तरह ही किया जा सकता है।


डीडीएस संचायक शब्द के ऊपरी 8 बिट्स को ROM पते के रूप में उपयोग किया जाएगा, और डेटा आउटपुट साइन मान होगा।

कोड

//साइन रोम वायर साइन_आउट; sine_rom sine1(.घड़ी(clk200M), .पता(संचायक), .q(sine_out));


विभिन्न आवृत्तियों पर साइन तरंग का ऑसिलोग्राम... एक जैसा दिखता है।

यदि चाहें, तो आप प्रतिरोधक प्रसार से जुड़ी DAC समस्याओं पर विचार कर सकते हैं:

खैर, यह सप्ताहांत का अंत है। लेकिन पीसी से नियंत्रण के लिए सॉफ्टवेयर अभी तक नहीं लिखा गया है। मैं इस तथ्य को स्वीकार करने के लिए मजबूर हूं कि मैं नियोजित समय सीमा को पूरा नहीं कर पाया।

तीसरा दिन

समय बहुत कम है, इसलिए हम जल्दी-जल्दी (सर्वोत्तम परंपराओं में) कार्यक्रम लिखते हैं। कुछ स्थानों पर, अक्षरों की संख्या कम करने और कीबोर्ड से जानकारी दर्ज करने में आसानी के लिए, विजेट नाम द्वारा एक इवेंट फ़िल्टर का उपयोग किया जाता है। कृपया समझें और क्षमा करें.

इंटरफेस

एनालॉग्स के साथ लिंक

पूरी सूची नहीं
कार्यात्मक डीडीएस जनरेटर। AVR के आधार पर बनाया गया. आवृत्तियाँ 0...65534 हर्ट्ज़।
डीडीएस जनरेटर GK101 की समीक्षा। Altera MAX240 FPGA का उपयोग करके बनाया गया। 10 मेगाहर्ट्ज तक की आवृत्ति।
PIC16F870 पर मल्टीफ़ंक्शन जनरेटर। फ़्रिक्वेंसी रेंज: 11 हर्ट्ज - 60 किलोहर्ट्ज़।
जेनरेटर
  • Qt5
  • टैगों को जोड़ें

    किसी भी घरेलू कार्यशाला में उपकरणों और माप उपकरणों का आवश्यक सेट होना चाहिए। शौक के तौर पर शौकिया रेडियो से जुड़े लोगों के लिए, आवश्यक उपकरण खरीदने की उच्च मौद्रिक लागत अक्सर अस्वीकार्य होती है।

    इसलिए मेरे मामले में, इस उपकरण की सूची पूरी नहीं थी और उसमें कमी थी संकेतक उत्पादक.

    संकेतक उत्पादकउपलब्ध रेडियो तत्वों से स्वयं इसे बनाना आसान साबित हुआ और अंततः महंगा भी नहीं पड़ा। इसलिए, इंटरनेट पर खोजबीन करने के बाद, मुझे विभिन्न जनरेटर के लिए बड़ी संख्या में सर्किट मिले, जिनमें डीएसी के साथ अधिक उन्नत मॉडल भी शामिल थे, लेकिन निर्माण करना पहले से ही महंगा था। आरंभ करने के लिए मैं सरल पर रुका। डीडीएस सिग्नल जनरेटरएटमेल के एटीएमईजीए8 माइक्रोकंट्रोलर पर। इसमें, मैंने कुछ भी सुधार या परिवर्तन नहीं किया - मैंने सब कुछ वैसे ही छोड़ दिया, मैंने बस एक प्रति बनाई और, विशेष रूप से, मैं इस उपकरण के लेखकत्व का दावा नहीं करता।

    इसलिए, संकेतक उत्पादकइसमें अच्छी विशेषताएं हैं और यह सरल समस्याओं को हल करने के लिए उपयुक्त है।

    में जानकारी प्रदर्शित करना संकेतक उत्पादक HD44780 नियंत्रक के साथ 16x2 कैरेक्टर के एलसीडी डिस्प्ले पर निर्मित। यह उल्लेखनीय है कि माइक्रोकंट्रोलर पोर्ट को बचाने के लिए, एलसीडी डिस्प्ले को केवल तीन तारों के माध्यम से नियंत्रित किया जाता है; यह एक शिफ्ट रजिस्टर का उपयोग करके हासिल किया गया था - तीन तारों के माध्यम से डिस्प्ले को कैसे कनेक्ट किया जाए, इसके बारे में पढ़ें।

    पोर्ट को सहेजना आवश्यक है, प्रतिरोधक DAC के लिए 8 पोर्ट, बटन के लिए 7 पोर्ट का उपयोग किया जाता है। मूल लेख में, लेखक ने पीडब्लूएम मॉड्यूलेशन का उपयोग करने का वादा किया था, लेकिन जाहिर तौर पर इसे पूरा नहीं किया, क्योंकि उन्होंने एटीएमईजीए16 पर अधिक उन्नत संस्करण विकसित करना शुरू कर दिया था।

    डीडीएस सिग्नल जनरेटर का योजनाबद्ध आरेखऔर मुद्रित सर्किट बोर्ड।

    सर्किट और बोर्ड मूल में दिखाए गए हैं; उनमें पीडब्लूएम नियंत्रण के लिए बटन भी हैं जिनका उपयोग लेखक द्वारा नहीं किया गया है।

    डीएसी के लिए, मैंने विशेष रूप से ±0.05% की त्रुटि वाले सटीक प्रतिरोधक खरीदे, लेकिन जैसा कि यह निकला, ±5% की त्रुटि वाले सरल प्रतिरोधक काफी पर्याप्त हैं। सिग्नल का आकार सभी प्रकार के सिग्नलों के लिए काफी स्वीकार्य था।

    कब जनकअसेंबल किया गया है और प्रोग्राम को माइक्रोकंट्रोलर में लोड किया गया है, तब तक किसी सेटिंग की आवश्यकता नहीं है, जब तक कि आप डिस्प्ले कंट्रास्ट को समायोजित नहीं करते।

    डिवाइस के साथ काम करना सरल है - सिग्नल आकार का चयन करें, आवश्यक आवृत्ति सेट करें, और आप आवृत्ति सेटिंग चरण को 1 - 10 - 100 - 1000 हर्ट्ज प्रति चरण की सीमा के साथ बदल सकते हैं। फिर स्टार्ट पर क्लिक करें और जनरेटर काम करना शुरू कर देता है। यह ध्यान दिया जाना चाहिए कि जब जनरेटर शुरू किया जाता है, तो सिग्नल की आवृत्ति और आकार को नहीं बदला जा सकता है, यह इस तथ्य के कारण है कि प्रोग्राम एक अंतहीन लूप में चला जाता है और अधिकतम पीढ़ी आवृत्ति को बढ़ाने के लिए, बटन मतदान प्रक्रिया हटाना पड़ा. जेनरेशन को रोकने के लिए, स्टॉप/रीसेट पर क्लिक करें, इससे प्रोग्राम पुनः आरंभ होता है और यह सेटिंग्स मेनू पर वापस आ जाता है। यहाँ बारीकियां है.

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

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

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

    एमके पर जनरेटर का योजनाबद्ध आरेख

    उपकरण सेटिंग्स

    • फ़्रिक्वेंसी रेंज: 10 हर्ट्ज - 60 किलोहर्ट्ज़
    • 3 अलग-अलग चरणों में डिजिटल आवृत्ति समायोजन
    • तरंगरूप: साइन, त्रिकोण, वर्ग, आरी, एच-पल्स, एल-पल्स, फट, स्वीप, शोर
    • आउटपुट रेंज: साइन और त्रिकोण के लिए 15V, अन्य मोड के लिए 0-5V
    • पल्स सिंक्रोनाइज़ेशन के लिए एक आउटपुट है

    डिवाइस 12 वोल्ट एसी से संचालित होता है, जो 78L15 और 79L15 के सामान्य संचालन के लिए आवश्यक पर्याप्त उच्च (18 V से अधिक) DC वोल्टेज प्रदान करता है, जो एक द्विध्रुवी 15 V सर्किट बनाता है। ऐसा इसलिए किया जाता है ताकि LF353 माइक्रोसर्किट आउटपुट कर सके लोड 1 kOhm तक सिग्नल की पूरी श्रृंखला।

    लेवल नियंत्रक ने ALPS SRBM1L0800 का उपयोग किया। सर्किट में ±1% सहनशीलता या बेहतर प्रतिरोधों का उपयोग करना चाहिए। एलईडी वर्तमान सीमक - 4306R श्रृंखला प्रतिरोधक। कलाकार की पसंद के आधार पर चमक बढ़ाई जा सकती है। जनरेटर को एल्यूमीनियम फ्रंट और रियर पैनल के साथ 178x154x36 मिमी प्लास्टिक केस में इकट्ठा किया गया है।

    कई संपर्क घटक सामने और पीछे के पैनल (बटन, नॉब, आरसीए कनेक्टर, एलईडी असेंबली, पावर कनेक्टर) पर लगे होते हैं। मुद्रित सर्किट बोर्ड प्लास्टिक स्पेसर वाले बोल्ट के साथ आवास से जुड़े होते हैं। जनरेटर के अन्य सभी तत्व मुद्रित सर्किट बोर्डों पर लगे होते हैं - बिजली की आपूर्ति अलग होती है। बीच में बायाँ बटन मोड बदलने के लिए है, दायाँ बटन मोड आवृत्ति का चयन करने के लिए है।

    जनरेटर विभिन्न सिग्नल उत्पन्न करता है और तीन मोड में संचालित होता है, जिन्हें "चयन करें" कुंजी का उपयोग करके चुना जाता है और तीन ऊपरी (आरेख में) एलईडी द्वारा इंगित किया जाता है। रोटरी नियंत्रण निम्न तालिका के अनुसार सिग्नल पैरामीटर बदलता है:

    मोड 1 में सेटिंग के तुरंत बाद, साइन जनरेशन होता है। हालाँकि, शुरुआती आवृत्ति काफी कम है और इसे बढ़ाने के लिए एनकोडर के कम से कम एक क्लिक की आवश्यकता होती है। बोर्ड में प्रोग्रामिंग के लिए डिवाइस को कनेक्ट करने के लिए एक संपर्क होता है, जो आपको आवश्यक होने पर सिग्नल जनरेटर की कार्यक्षमता को तुरंत बदलने की अनुमति देता है। सभी प्रोजेक्ट फ़ाइलें - PIC16F870 फ़र्मवेयर, बोर्ड चित्र, स्थित हैं

    सिग्नलों का यह डीडीएस फ़ंक्शन जनरेटर (संस्करण 2.0) एक एवीआर माइक्रोकंट्रोलर पर असेंबल किया गया है, इसमें अच्छी कार्यक्षमता है, इसमें आयाम नियंत्रण है, और इसे एक तरफा मुद्रित सर्किट बोर्ड पर भी असेंबल किया गया है।

    यह जनरेटर जेस्पर डीडीएस जनरेटर एल्गोरिदम पर आधारित है, प्रोग्राम को असेंबली कोड इंसर्ट के साथ एवीआर-जीसीसी सी के लिए आधुनिक बनाया गया है। जनरेटर में दो आउटपुट सिग्नल होते हैं: पहला डीडीएस सिग्नल है, दूसरा हाई-स्पीड (1..8 मेगाहर्ट्ज) "आयताकार" आउटपुट है, जिसका उपयोग गलत फ़ज़ के साथ एमके को पुनर्जीवित करने और अन्य उद्देश्यों के लिए किया जा सकता है।
    हाई-स्पीड HS (हाई स्पीड) सिग्नल सीधे Atmega16 OC1A (PD5) माइक्रोकंट्रोलर से लिया जाता है।
    डीडीएस सिग्नल अन्य एमसी आउटपुट से प्रतिरोधक आर2आर मैट्रिक्स और एलएम358एन चिप के माध्यम से उत्पन्न होते हैं, जो सिग्नल आयाम और ऑफसेट के समायोजन की अनुमति देता है। ऑफसेट और आयाम को दो पोटेंशियोमीटर का उपयोग करके समायोजित किया जाता है। ऑफसेट को +5V..-5V की रेंज में समायोजित किया जा सकता है, और आयाम 0...10V है। डीडीएस सिग्नल की आवृत्ति को 0... 65534 हर्ट्ज की सीमा के भीतर समायोजित किया जा सकता है, यह ऑडियो सर्किट और अन्य शौकिया रेडियो कार्यों के परीक्षण के लिए पर्याप्त से अधिक है।

    DDS जनरेटर V2.0 की मुख्य विशेषताएं:
    - सामान्य और सस्ते रेडियोतत्वों वाला एक सरल सर्किट;
    - एक तरफा मुद्रित सर्किट बोर्ड;
    - अंतर्निर्मित बिजली आपूर्ति;
    - 8 मेगाहर्ट्ज तक अलग हाई-स्पीड आउटपुट (एचएस);
    - परिवर्तनीय आयाम और ऑफसेट के साथ डीडीएस सिग्नल;
    - डीडीएस सिग्नल: साइन, आयताकार, आरा और रिवर्स आरा, त्रिकोण, ईसीजी सिग्नल और शोर सिग्नल;
    - 2×16 एलसीडी स्क्रीन;
    - सहज 5-बटन कीबोर्ड;
    - आवृत्ति समायोजन के चरण: 1, 10, 100, 1000, 10000 हर्ट्ज;
    - बिजली चालू करने के बाद अंतिम स्थिति को याद रखना।

    नीचे दिया गया ब्लॉक आरेख एक फ़ंक्शन जनरेटर की तार्किक संरचना दिखाता है:

    जैसा कि आप देख सकते हैं, डिवाइस को कई आपूर्ति वोल्टेज की आवश्यकता होती है: +5V, -12V, +12V। सिग्नल आयाम और ऑफसेट को विनियमित करने के लिए वोल्टेज +12V और -12V का उपयोग किया जाता है। बिजली की आपूर्ति एक ट्रांसफार्मर और कई वोल्टेज स्टेबलाइज़र चिप्स का उपयोग करके डिज़ाइन की गई है:

    बिजली की आपूर्ति एक अलग बोर्ड पर इकट्ठी की गई है:

    यदि आप स्वयं बिजली आपूर्ति को असेंबल नहीं करना चाहते हैं, तो आप कंप्यूटर से नियमित एटीएक्स बिजली आपूर्ति का उपयोग कर सकते हैं, जहां सभी आवश्यक वोल्टेज पहले से मौजूद हैं। एटीएक्स कनेक्टर लेआउट।

    एलसीडी चित्रपट

    सभी क्रियाएं एलसीडी स्क्रीन के माध्यम से प्रदर्शित की जाती हैं। जनरेटर को पांच चाबियों द्वारा नियंत्रित किया जाता है

    ऊपर/नीचे कुंजियों का उपयोग मेनू के माध्यम से जाने के लिए किया जाता है, बाएँ/दाएँ कुंजियों का उपयोग आवृत्ति मान को बदलने के लिए किया जाता है। जब केंद्र कुंजी दबाई जाती है, तो चयनित सिग्नल उत्पन्न होना शुरू हो जाता है। कुंजी को दोबारा दबाने से जनरेटर बंद हो जाता है।

    आवृत्ति परिवर्तन चरण निर्धारित करने के लिए एक अलग मान प्रदान किया गया है। यदि आपको एक विस्तृत श्रृंखला के भीतर आवृत्ति को बदलने की आवश्यकता है तो यह सुविधाजनक है।

    शोर जनरेटर में कोई सेटिंग नहीं है। यह सामान्य रैंड() फ़ंक्शन का उपयोग करता है, जिसे लगातार डीडीएस जनरेटर के आउटपुट में फीड किया जाता है।

    एचएस हाई स्पीड आउटपुट में 4 आवृत्ति मोड हैं: 1, 2, 4 और 8 मेगाहर्ट्ज।

    योजनाबद्ध आरेख

    फ़ंक्शन जनरेटर सर्किट सरल है और इसमें आसानी से सुलभ तत्व शामिल हैं:
    - AVR Atmega16 माइक्रोकंट्रोलर, 16 मेगाहर्ट्ज पर बाहरी क्वार्ट्ज के साथ;
    - मानक HD44780-प्रकार की एलसीडी स्क्रीन 2×16;
    - साधारण प्रतिरोधों से बना R2R DAC मैट्रिक्स;
    - परिचालन एम्पलीफायर LM358N (KR1040UD1 का घरेलू एनालॉग);
    - दो पोटेंशियोमीटर;
    - पाँच चाबियाँ;
    - कई कनेक्टर।

    वेतन:

    कार्यात्मक जनरेटर को एक प्लास्टिक बॉक्स में इकट्ठा किया गया है:


    सॉफ़्टवेयर

    जैसा कि मैंने ऊपर कहा, मैंने अपना प्रोग्राम जेस्पर डीडीएस जनरेटर एल्गोरिदम पर आधारित किया है। मैंने जनरेशन स्टॉप को लागू करने के लिए असेंबली कोड की कुछ पंक्तियाँ जोड़ीं। अब एल्गोरिदम में 9 के बजाय 10 सीपीयू चक्र हैं।

    शून्य स्थिर इनलाइन सिग्नल_आउट(स्थिरांक uint8_t *सिग्नल, uint8_t ad2, uint8_t ad1, uint8_t ad0)(
    एएसएम अस्थिर ("ईओआर आर18, आर18; आर18<-0″ "\n\t"
    "ईओआर आर19, आर19 ;आर19<-0″ "\n\t"
    "1:" "\n\t"
    "r18, %0 ;1 चक्र जोड़ें" "\n\t"
    "एडीसी आर19, %1 ;1 चक्र" "\n\t"
    "एडीसी %ए3, %2 ;1 चक्र" "\n\t"
    "एलपीएम ;3 चक्र" "\n\t"
    "%4 से बाहर, __tmp_reg__ ;1 चक्र" "\n\t"
    "एसबीआई %5, 2 ;1 चक्र यदि छोड़ें नहीं" "\n\t"
    "आरजेएमपी 1बी ;2 चक्र। कुल 10 चक्र" "\n\t"
    :
    :"r" (ad0),,"r" (ad1),,"r" (ad2),"e" (सिग्नल),,"I" (_SFR_IO_ADDR(PORTA)), "I" (_SFR_IO_ADDR(Sपीसीआर) ))
    :"r18″, "r19″
    );}

    डीडीएस सिग्नल फॉर्म की तालिका एमके की फ्लैश मेमोरी में स्थित है, जिसका पता 0xXX00 से शुरू होता है। इन अनुभागों को मेकफ़ाइल में, उपयुक्त मेमोरी स्थानों में परिभाषित किया गया है:
    #सिग्नल तालिकाओं को संग्रहीत करने के लिए अनुभागों को परिभाषित करें
    LDFLAGS += -Wl,-सेक्शन-स्टार्ट=.MySection1=0x3A00
    LDFLAGS += -Wl,-सेक्शन-स्टार्ट=.MySection2=0x3B00
    LDFLAGS += -Wl,-सेक्शन-स्टार्ट=.MySection3=0x3C00
    LDFLAGS += -Wl,-सेक्शन-स्टार्ट=.MySection4=0x3D00
    LDFLAGS += -Wl,-सेक्शन-स्टार्ट=.MySection5=0x3E00
    LDFLAGS += -Wl,-सेक्शन-स्टार्ट=.MySection6=0x3F00