- DDS फ़ंक्शन जेनरेटर क्या है?
- AD9833 फ़ंक्शन जेनरेटर आईसी के कामकाज को समझें
- AD9833 आधारित फ़ंक्शन जेनरेटर बनाने के लिए आवश्यक घटक
- AD9833 आधारित फ़ंक्शन जनरेटर - योजनाबद्ध आरेख
- AD9833 आधारित फ़ंक्शन जनरेटर - Arduino कोड
- AD9833 आधारित फ़ंक्शन जनरेटर का परीक्षण
- इसके अलावा संवर्द्धन
यदि आप मेरे जैसे इलेक्ट्रॉनिक उत्साही हैं, जो विभिन्न इलेक्ट्रॉनिक सर्किट के साथ घूमना चाहते हैं, तो एक सभ्य फ़ंक्शन जेनरेटर रखना कभी-कभी अनिवार्य हो जाता है। लेकिन एक मालिक होना एक समस्या है क्योंकि इस तरह के बुनियादी उपकरण एक भाग्य खर्च कर सकते हैं। अपने स्वयं के परीक्षण उपकरण का निर्माण न केवल सस्ता है, बल्कि आपके ज्ञान को बेहतर बनाने का एक शानदार तरीका भी है।
तो इस लेख में, हम Arduino और AD9833 DDS फ़ंक्शन जेनरेटर मॉड्यूल के साथ एक सरल सिग्नल जेनरेटर बनाने जा रहे हैं जो आउटपुट पर 12 मेगाहर्ट्ज की अधिकतम आवृत्ति के साथ साइन, स्क्वायर और त्रिकोण तरंगों का उत्पादन कर सकता है। और अंत में, हम अपने ऑसिलोस्कोप की मदद से आउटपुट आवृत्ति का परीक्षण करने जा रहे हैं।
हमने पहले एक साधारण साइन वेव जेनरेटर, एक स्क्वायर वेव जेनरेटर और एक ट्राइएंगल वेव जेनरेटर बनाया है, जिसकी मदद से बेसिक एनालॉग सर्किट की मदद ली जा सकती है। आप उन लोगों की जांच कर सकते हैं यदि आप कुछ बुनियादी वेवफॉर्म जेनरेटर सर्किट की तलाश में हैं। इसके अलावा, यदि आप AD9833 मॉड्यूल का उपयोग किए बिना एक सस्ता Arduino फंक्शन जनरेटर बनाना चाहते हैं, तो आप DIY Arduino Waveform जेनरेटर प्रोजेक्ट की जांच कर सकते हैं।
DDS फ़ंक्शन जेनरेटर क्या है?
जैसा कि नाम का अर्थ है, एक फ़ंक्शन जनरेटर एक उपकरण है जो सेटिंग पर एक विशिष्ट आवृत्ति के साथ एक विशिष्ट तरंग का उत्पादन कर सकता है। उदाहरण के लिए, विचार करें कि आपके पास एक LC फ़िल्टर है जिसके लिए आप अपनी आउटपुट आवृत्ति प्रतिक्रिया का परीक्षण करना चाहते हैं, आप आसानी से एक फ़ंक्शन जनरेटर की मदद से ऐसा कर सकते हैं। आपको केवल अपनी वांछित आउटपुट आवृत्ति और तरंग सेट करना है, फिर आप प्रतिक्रिया का परीक्षण करने के लिए इसे नीचे या ऊपर क्रैंक कर सकते हैं। यह सिर्फ एक उदाहरण था, आप इसके साथ और चीजें कर सकते हैं क्योंकि सूची जारी होती है।
DDS का मतलब डायरेक्ट डिजिटल सिंथेसिस है । यह एक प्रकार का तरंग जनरेटर है जो जमीन से ऊपर एक संकेत बनाने के लिए डिजिटल से एनालॉग कन्वर्टर्स (डीएसी) का उपयोग करता है । इस पद्धति का उपयोग विशेष रूप से साइन लहर उत्पन्न करने के लिए किया जाता है। लेकिन हम जिस आईसी का उपयोग कर रहे हैं वह स्क्वायर या त्रिकोणीय तरंग संकेतों का उत्पादन कर सकती है। डीडीएस चिप के अंदर होने वाले ऑपरेशन डिजिटल होते हैं इसलिए यह फ्रीक्वेंसी को बहुत तेजी से स्विच कर सकता है या यह एक सिग्नल से दूसरे में बहुत तेजी से स्विच कर सकता है। इस उपकरण में एक व्यापक आवृत्ति स्पेक्ट्रम के साथ एक ठीक आवृत्ति संकल्प है।
AD9833 फ़ंक्शन जेनरेटर आईसी के कामकाज को समझें
हमारी परियोजना के दिल में AD9833 प्रोग्रामेबल वेवफॉर्म जेनरेटर आईसी है जो एनालॉग उपकरणों द्वारा डिजाइन और विकसित किया गया है। यह एक कम शक्ति, प्रोग्रामेबल वेवफॉर्म जनरेटर है, जो 12 हर्ट्ज की अधिकतम आवृत्ति के साथ साइन, त्रिकोणीय, और चौकोर तरंग बनाने में सक्षम है । यह एक बहुत ही अनूठा आईसी है जो सिर्फ एक सॉफ्टवेयर प्रोग्राम के साथ आउटपुट आवृत्ति और चरण को बदलने में सक्षम है। इसमें एक 3 तार एसपीआई इंटरफ़ेस है, यही वजह है कि इस आईसी के साथ संचार करना बहुत सरल और आसान हो जाता है। इस आईसी के कार्यात्मक ब्लॉक आरेख नीचे दिखाया गया है।
इस आईसी का काम बहुत सरल है। यदि हम ऊपर दिए गए कार्यात्मक ब्लॉक आरेख पर एक नज़र डालते हैं, तो हम देखेंगे कि हमारे पास एक चरण संचायक है जिसका काम एक साइन लहर के सभी संभावित डिजिटल मूल्यों को संग्रहीत करना है, जो 0 से 2π से शुरू होता है। अगला, हमारे पास SIN ROM है जिसका काम चरण की जानकारी को परिवर्तित करना है जिसे बाद में सीधे आयाम में मैप किया जा सकता है। SIN ROM डिजिटल चरण की जानकारी को लुकअप टेबल के पते के रूप में उपयोग करता है और चरण की जानकारी को आयाम में परिवर्तित करता है। और अंत में, हमारे पास 10-बिट डिजिटल से एनालॉग कनवर्टर है जिसका काम SIN ROM से डिजिटल डेटा प्राप्त करना है और इसे संबंधित अनुरूप वोल्टेज में बदलना है, यही हमें आउटपुट से मिलता है। आउटपुट में, हमारे पास एक स्विच भी है जिसे हम बस थोड़ा सा सॉफ़्टवेयर कोड के साथ चालू या बंद कर सकते हैं। हम इस बारे में बाद में लेख में बात करेंगे।जो विवरण आप ऊपर देख रहे हैं, वह IC के अंदर क्या हो रहा है, का एक बहुत ही नीचे छीन लिया गया संस्करण है, और आपके द्वारा ऊपर देखा गया अधिकांश विवरण AD9833 डेटाशीट से लिया गया है, आप इसे आगे की जानकारी के लिए भी देख सकते हैं।
AD9833 आधारित फ़ंक्शन जेनरेटर बनाने के लिए आवश्यक घटक
AD9833 आधारित फ़ंक्शन जनरेटर बनाने के लिए आवश्यक घटकों को नीचे सूचीबद्ध किया गया है, हमने इस सर्किट को बहुत सामान्य घटकों के साथ डिज़ाइन किया है, जो प्रतिकृति प्रक्रिया को बहुत आसान बनाता है।
- अरुडिनो नैनो - 1
- AD9833 DDS फ़ंक्शन जेनरेटर - 1
- 128 X 64 OLED डिस्प्ले - 1
- जेनेरिक रोटरी एनकोडर - 1
- डीसी बैरल जैक - 1
- LM7809 वोल्टेज नियामक - 1
- 470uF संधारित्र - 1
- 220uF संधारित्र - 1
- 104pF संधारित्र - 1
- 10K रेसिस्टर - 6
- स्पर्शक स्विच - 4
- पेंच टर्मिनल 5.04 मिमी - 1
- महिला हैडर - 1
- 12 वी पावर सोर्स - 1
AD9833 आधारित फ़ंक्शन जनरेटर - योजनाबद्ध आरेख
AD9833 और Arduino आधारित फ़ंक्शन जनरेटर के लिए पूरा सर्किट आरेख नीचे दिखाया गया है।
हम अपनी इच्छित आवृत्ति उत्पन्न करने के लिए Arduino के साथ AD9833 का उपयोग करने जा रहे हैं । और इस खंड में, हम योजनाबद्ध की मदद से सभी विवरणों की व्याख्या करेंगे; मुझे आपको सर्किट के साथ क्या हो रहा है, इसका संक्षिप्त विवरण दें। आइए AD9833 मॉड्यूल के साथ शुरू करें। AD9833 मॉड्यूल फ़ंक्शन जनरेटर मॉड्यूल है और यह योजनाबद्ध के अनुसार Arduino के साथ जुड़ा हुआ है। सर्किट को बिजली देने के लिए, हम एक सभ्य डिकम्पलिंग संधारित्र के साथ एक LM7809 वोल्टेज नियामक आईसी का उपयोग कर रहे हैं, यह आवश्यक है क्योंकि आपूर्ति शोर आउटपुट सिग्नल के साथ हस्तक्षेप कर सकता है जिसके परिणामस्वरूप अवांछित उत्पादन हो सकता है। हमेशा की तरह, Arduino इस परियोजना के लिए मस्तिष्क के रूप में काम कर रहा है। सेट आवृत्ति और अन्य मूल्यवान जानकारी प्रदर्शित करने के लिए, हमने 128 X 64 OLED डिस्प्ले मॉड्यूल कनेक्ट किया है। आवृत्ति रेंज को बदलने के लिए, हम तीन स्विच का उपयोग कर रहे हैं। पहला एक आवृत्ति हर्ट्ज के लिए सेट करता है, दूसरा एक KHz के लिए उत्पादन आवृत्ति सेट करता है, और तीसरा एक मेगाहर्ट्ज के लिए आवृत्ति सेट करता है, हमारे पास एक और बटन भी है जिसका उपयोग आउटपुट को सक्षम या अक्षम करने के लिए किया जा सकता है। अंत में, हमारे पास रोटरी एनकोडर है,और हमें इसके साथ कुछ पुल-अप रोकनेवाला संलग्न करना होगा अन्यथा वे स्विच काम नहीं करेंगे क्योंकि हम पूलिंग विधि पर बटन प्रेस घटना की जांच कर रहे हैं। रोटरी एनकोडर का उपयोग आवृत्ति को बदलने के लिए किया जाता है और रोटरी एनकोडर के अंदर स्पर्श स्विच का उपयोग सेट तरंग का चयन करने के लिए किया जाता है।
AD9833 आधारित फ़ंक्शन जनरेटर - Arduino कोड
इस परियोजना में प्रयुक्त पूरा कोड इस पृष्ठ के नीचे पाया जा सकता है। आवश्यक हेडर फ़ाइलों और स्रोत फ़ाइलों को जोड़ने के बाद, आपको सीधे Arduino फ़ाइल को संकलित करने में सक्षम होना चाहिए। आप नीचे दिए गए लिंक से ad9833 Arduino लाइब्रेरी और अन्य लाइब्रेरी डाउनलोड कर सकते हैं या फिर लाइब्रेरी स्थापित करने के लिए बोर्ड मैनेजर विधि का उपयोग कर सकते हैं।
- बिल विलियम्स द्वारा AD9833 लाइब्रेरी डाउनलोड करें
- Adafruit द्वारा SSD1306 OLED लाइब्रेरी डाउनलोड करें
- Adafruit GFX लाइब्रेरी डाउनलोड करें
इनो में कोड की व्याख्या । फ़ाइल इस प्रकार है। सबसे पहले, हम सभी आवश्यक पुस्तकालयों को शामिल करके शुरू करते हैं। AD9833 DDS मॉड्यूल के लिए लाइब्रेरी का पहली बार OLED के लिए लाइब्रेरी का अनुसरण किया जाता है और हमारी कुछ गणनाओं के लिए गणित लाइब्रेरी की आवश्यकता होती है।
AD9833 मॉड्यूल #include के लिए #include // LIbrary
अगला, हम बटन, स्विच, रोटरी एनकोडर और OLEDs के लिए सभी आवश्यक इनपुट और आउटपुट पिन को परिभाषित करते हैं।
#define SCREEN_WIDATA_PINH 128 // OLED प्रदर्शन चौड़ाई पिक्सेल में #define SCREEN_HEIGHT 64 // OLED प्रदर्शन ऊँचाई, पिक्सेल में #define SET_FREQUENCY_HIN A2_ Pushfton Hz में आवृत्ति सेट करने के लिए #Dfine SET_FREQUENCY_KY3H3H_3H3_HIDH A6 // पुशबटन को Mhz #define में फ्रीक्वेंसी सेट करने के लिए ENABLE_DISABLE_OUTPUT_PIN A7 // Pushbutton आउटपुट को सक्षम / अक्षम करने के लिए #define FNC_PIN 4 // AD9833 के मॉड्यूल #define CLK_PIN 8 / Encode # Encode #Dein के क्लॉक पिन की आवश्यकता है। / एनकोडर के डेटा पिन #define BTN_PIN 9 // एनकोडर पर आंतरिक पुश बटन
इसके बाद, हम सभी आवश्यक चर को परिभाषित करते हैं जो इस कोड में आवश्यक हैं। सबसे पहले, हम एक पूर्णांक चर काउंटर को परिभाषित करते हैं जो रोटरी एनकोडर मान को संग्रहीत करेगा। अगले दो चर क्लॉकपिन और क्लॉकपिनस्टेट पिन प्रतिमा को संग्रहीत करते हैं जो एनकोडर दिशा को समझने के लिए आवश्यक है। हमारे पास एक समय चर है जो वर्तमान टाइमर-काउंटर मान रखता है, इस चर का उपयोग बटन डिबगिंग के लिए किया जाता है। अगला, हमारे पास एक अहस्ताक्षरित लंबा चर मॉड्यूल है जिसमें गणना की गई आवृत्ति होती है जो लागू होने वाली है। अगला, हमारे पास विलम्ब की देरी है । इस देरी को आवश्यकतानुसार समायोजित किया जा सकता है। अगला, हमारे पास तीन बूलियन वैरिएबल set_frequency_hz,set_frequency_Khz, और set_frequency_Mhz इन तीन चर का उपयोग मॉड्यूल की वर्तमान सेटिंग को निर्धारित करने के लिए किया जाता है। हम इसके बारे में अधिक विस्तार से बाद में लेख में बात करेंगे। अगला, हमारे पास चर है जो आउटपुट तरंग की स्थिति को संग्रहीत करता है, डिफ़ॉल्ट आउटपुट तरंग एक साइन लहर है। और अंत में, हमारे पास एनकोडर_btn_count वैरिएबल है जो एनकोडर-बटन की गिनती रखता है जो आउटपुट तरंग को सेट करने के लिए उपयोग किया जाता है।
int काउंटर = 1; // जब रोटरी एनकोडर को इंट क्लॉकपिन चालू किया जाता है तो यह काउंटर वैल्यू बढ़ेगा या घटेगा; // रोटरी एनकोडर int clockPinState द्वारा उपयोग किए जाने वाले पिन स्टेटस के लिए प्लेसहोल्डर; // रोटरी एनकोडर द्वारा लंबे समय तक उपयोग किए गए पिन स्थिति के लिए प्लेसहोल्डर = 0; // अहस्ताक्षरित लंबे मॉड्यूल के लिए उपयोग किया जाता हैफ्रीक्वेंसी; // आउटपुट फ्रीक्वेंसी लॉन्ग डेब्यू = 220 सेट करने के लिए उपयोग किया जाता है; // विलम्ब देरी बूल btn_state; // AD98333 मॉड्यूल बूल set_frequency_hz = 1 के अक्षम आउटपुट को सक्षम करने के लिए उपयोग किया जाता है; // AD9833 की खराबी की आवृत्ति मॉड्यूल set_frequency_khz; bool set_frequency_mhz; स्ट्रिंग waveSelect = "SIN"; // मॉड्यूल int एनकोडर_btn_count = 0 का स्टार्टअप तरंग; // एनकोडर बटन प्रेस की जांच करने के लिए उपयोग किया जाता है अगला, हमारे पास हमारे दो ऑब्जेक्ट हैं एक ओएलईडी डिस्प्ले के लिए है और दूसरा एडी AD3333 मॉड्यूल के लिए है।Adafruit_SSD1306 प्रदर्शन (SCREEN_WIDATA_PINH, SCREEN_HEIGHT, और वायर, -1); AD9833 जीन (FNC_PIN);
अगला, हमारा सेटअप () फ़ंक्शन है, उस सेटअप फ़ंक्शन में, हम डीबगिंग के लिए सीरियल को सक्षम करने के साथ शुरू करते हैं। हम शुरू () विधि की मदद से AD9833 मॉड्यूल को इनिशियलाइज़ करते हैं । अगला, हम इनपुट के रूप में सभी निर्दिष्ट रोटरी एनकोडर पिन सेट करते हैं। और हम घड़ी पिन के मूल्य को घड़ीपिनस्टेट चर में संग्रहीत करते हैं, यह रोटरी एनकोडर के लिए एक आवश्यक कदम है।
अगला, हम सभी बटन पिन को इनपुट के रूप में सेट करते हैं और डिस्प्ले.बेगिन () पद्धति की मदद से ओएलईडी डिस्प्ले को सक्षम करते हैं, और हम एक if स्टेटमेंट के साथ किसी भी त्रुटि के लिए भी जांचते हैं । जब ऐसा किया जाता है, तो हम स्टार्टअप स्प्लैश स्क्रीन को डिस्प्ले और प्रिंट करते हैं, हम 2 सेकंड की देरी जोड़ते हैं जो स्प्लैश स्क्रीन के लिए भी देरी है, और अंत में, हम अपडेट_डिसप्ले () फ़ंक्शन को कॉल करते हैं जो स्क्रीन को साफ़ करता है और अपडेट करता है एक बार फिर से प्रदर्शित करें। अपडेट_डिसप्ले () विधि के विवरण पर लेख में बाद में चर्चा की जाएगी।
शून्य सेटअप () {Serial.begin (9600); // सीरियल सीरियल को सक्षम करें @ 9600 बॉड जीन।बेगिन (); // AD9833 ऑब्जेक्ट पिनकोड (CLK_PIN, INPUT) घोषित करने के बाद यह पहला आदेश होना चाहिए; // पिन पिनोड के रूप में सेट करना (DATA_PIN, INPUT); pinMode (BTN_PIN, INPUT_PULLUP); clockPinState = digitalRead (CLK_PIN); पिनमोड (SET_FREQUENCY_HZ, INPUT); // पिन को इनपुट पिनोड के रूप में सेट करना (SET_FREQUENCY_KHZ, INPUT); पिनमोड (SET_FREQUENCY_MHZ, INPUT); pinMode (ENABLE_DISABLE_OUTPUT_PIN, INPUT); अगर (प्रदर्शन.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// पता 0x3D 128x64 के लिए Serial.println (F ("SSD1306 आवंटन विफल)); के लिये (;;); } display.clearDisplay (); // स्क्रीन डिस्प्ले को साफ़ करें ।setTextSize (2); // टेक्स्ट साइज़ डिस्प्ले सेट करें ।setTextColor (WHITE); // सेट एलसीडी कलर डिस्प्ले.सेटकसर (30, 0); // सेट कर्सर की स्थिति display.println ("AD9833"); // इस टेक्स्ट डिस्प्ले को प्रिंट करें।setCursor (17, 20); // सेट कर्सर स्थिति display.println ("फ़ंक्शन"); // इस टेक्स्ट डिस्प्ले को प्रिंट करें ।setCursor (13, 40); // सेट कर्सर स्थिति display.println ("जनरेटर"); // इस टेक्स्ट डिस्प्ले को प्रिंट करें ।isplay (); // प्रदर्शन देरी (2000) को अपडेट करें; // 2 SEC अपडेट_डिसप्ले () की देरी; // कॉल update_display फ़ंक्शन}
अगला, हमारे पास हमारा लूप () फ़ंक्शन है, सभी प्रमुख फ़ंक्शंस लूप अनुभाग में लिखे गए हैं।
सबसे पहले, हम रोटरी एनकोडर के क्लॉक पिन को पढ़ते हैं और इसे क्लॉकपिन चर में संग्रहीत करते हैं जिसे हमने पहले घोषित किया है। अगला, यदि स्टेटमेंट में, हम देखते हैं कि पिन का पिछला मान और पिन का वर्तमान मूल्य समान है या नहीं और हम पिन के वर्तमान मूल्य की भी जांच करते हैं। यदि यह सब सच है, तो हम डेटा पिन की जांच करते हैं, यदि यह सच है कि इसका मतलब है कि एनकोडर वामावर्त घूम रहा है और हम काउंटर - कमांड की सहायता से काउंटर मान को घटाते हैं । इसके अलावा हम काउंटर ++ कमांड के साथ काउंटर वैल्यू बढ़ाते हैं । अंत में, हम एक और डाल अगर बयान 1. अगले करने के लिए न्यूनतम मूल्य निर्धारित करने के लिए, हम अद्यतन clockPinState वर्तमान के साथ clockPinभविष्य के उपयोग के लिए मूल्य।
शून्य लूप () {घड़ीपिन = digitalRead (CLK_PIN); if (clockPin! = clockPinState && clockPin == 1) {if (digitalRead (DATA_PIN)! = clockPin) {काउंटर -; } और {काउंटर ++; // एनकोडर सीडब्ल्यू को इतना बढ़ाकर घुमा रहा है} अगर (काउंटर <1) काउंटर = 1; सिरियल.प्रिंटल (काउंटर); update_display (); }
अगला, हमारे पास एक बटन प्रेस का पता लगाने के लिए हमारा कोड है। इस खंड में, हमने कुछ नेस्टेड की मदद से एनकोडर के अंदर बटन का पता लगाया है यदि स्टेटमेंट्स, अगर (digitalRead (BTN_PIN) == LOW && मिलिस () - समय> निंदा), इस कथन में, हम पहले बटन की जांच करते हैं पिन कम है या नहीं, अगर यह कम है, तो इसे दबाया जाता है। तब फिर से हम विवादास्पद देरी के साथ टाइमर मान की जांच करते हैं, यदि दोनों कथन सत्य हैं, तो हम इसे एक सफल बटन प्रेस कार्रवाई घोषित करते हैं यदि हम एन्कोडर_btn_count मान बढ़ाते हैं । अगला, हम एक और घोषणा करते हैं यदि कथन अधिकतम काउंटर मान को 2 पर सेट करने के लिए है, तो हमें इसकी आवश्यकता है क्योंकि हम इसका उपयोग आउटपुट तरंग को सेट करने के लिए कर रहे हैं ।लगातार तीन यदि कथन ऐसा करते हैं, यदि मान शून्य है, तो साइन तरंग का चयन किया जाता है, यदि यह एक है, तो यह एक वर्ग तरंग है, और यदि मान 2 है, तो यह त्रिकोणीय लहर है। इन तीनों में यदि कथनों में, हम update_display () फ़ंक्शन के साथ डिस्प्ले को अपडेट करते हैं । और अंत में, हम वर्तमान टाइमर काउंटर मूल्य के साथ समय चर को अपडेट करते हैं।
// अगर हम एक LOW सिग्नल का पता लगाते हैं, तो बटन दबाया जाता है अगर (digitalRead (BTN_PIN) == LOW && मिलिस () - समय> बहस) {एनकोडर_btn_count ++; // मान बढ़ाएँ यदि (एनकोडर_btn_count> 2) // यदि मान 2 से अधिक है, तो इसे 0 पर रीसेट करें {encoder_btn_count = 0; } अगर (एनकोडर_btn_count == 0) {// यदि मान 0 साइन लहर है, तो तरंग का चयन किया जाता है = "SIN"; // पाप मूल्य अपडेट_डिसप्ले () के साथ स्ट्रिंग चर को अपडेट करें; // प्रदर्शन को अपडेट करें} यदि (एनकोडर_बीटीएन_काउंट == 1) {// यदि मान १ वर्ग तरंग चयनित तरंग तरंग है = "SQR"; // SQR मान update_display () के साथ स्ट्रिंग चर अद्यतन; // प्रदर्शन प्रदर्शित करें} यदि (एनकोडर_बीटीएन_काउंट == 2) {// यदि मान १ है तो त्रिकोणीय तरंग का चयन किया जाता है तरंग = "टीआरआई"; // TRI मान update_display () के साथ स्ट्रिंग चर अद्यतन;// प्रदर्शन को अपडेट करें} समय = मिली (); // समय चर अद्यतन करें}
अगला, हम सभी आवश्यक कोड को परिभाषित करते हैं जो एक विलम्ब देरी के साथ सभी बटन को सेट करने के लिए आवश्यक है। चूंकि बटन Arduino के एनालॉग पिन से जुड़े होते हैं, हम एक बटन प्रेस की पहचान करने के लिए एनालॉग रीड कमांड का उपयोग कर रहे हैं यदि एनालॉग रीड वैल्यू 30 से नीचे पहुंचता है, तो हम इसके सफल बटन प्रेस का पता लगाते हैं, और हम 200 एमएस तक प्रतीक्षा करते हैं। जांचें कि क्या यह एक वास्तविक बटन प्रेस या केवल एक शोर है। यदि यह कथन सत्य है, तो हम बूलियन चर को उन मानों के साथ असाइन करते हैं जो फ़ंक्शन जनरेटर के हर्ट्ज, खज़ और मेज़ मानों को सेट करने के लिए उपयोग किए जाते हैं। अगला, हम डिस्प्ले को अपडेट करते हैं और टाइम वेरिएबल को अपडेट करते हैं। हम Arduino के साथ जुड़े सभी चार बटन के लिए करते हैं।
अगर (analogRead (SET_FREQUENCY_HZ) <30 && मिली () - समय> पराजय) {set_frequency_hz = 1; // अद्यतन बूलियन मान set_frequency_khz = 0; set_frequency_mhz = 0; update_display (); // डिस्प्ले टाइम = मिली () अपडेट करें; // टाइम वेरिएबल को अपडेट करें} अगर (analogRead (SET_FREQUENCY_KHZ) <30 && मिलिस () - टाइम - डेब्यू) {set_frequency_hz = 0; // अद्यतन बूलियन मान set_frequency_khz = 1; set_frequency_mhz = 0; मॉड्यूलफ्रीक्वेंसी = काउंटर * 1000; update_display (); // डिस्प्ले टाइम = मिलिस () अपडेट करें; // टाइम वेरिएबल को अपडेट करें} अगर (analogRead (SET_FREQUENCY_MHZ) <30 && मिली () - समय - बहस) {// डिबेट देरी के साथ एनालॉग पिन की जांच करें set_frequency_hz = 0; // अद्यतन बूलियन मान set_frequency_khz = 0; set_frequency_mhz = 1; मॉड्यूलफ्रीक्वेंसी = काउंटर * 1000000; update_display ();// अपडेट टाइम = मिलिस (); // टाइम वेरिएबल को अपडेट करें} अगर (analogRead (ENABLE_DISABLE_OUTPUT_PIN) <30 && मिली () - टाइम> डेब्यू) {// चेक पिन के साथ एनालॉग पिन डिबेट में देरी btn_state =! btn_state; // बटन राज्य जीन को उल्टा कर दें। EnableOutput (btn_state); // बटन जनरेटर अद्यतन / अद्यतन () के आधार पर फ़ंक्शन जनरेटर के आउटपुट को सक्षम / अक्षम करें; // प्रदर्शन समय =is () अपडेट करें; // समय चर अपडेट करें}}// समय चर अपडेट करें}}// समय चर अपडेट करें}}
अंत में, हमारे पास हमारा update_display () फ़ंक्शन है। इस फ़ंक्शन में, हमने इस डिस्प्ले को अपडेट करने के अलावा और भी बहुत कुछ किया क्योंकि डिस्प्ले के एक निश्चित हिस्से को OLED में अपडेट नहीं किया जा सकता है। इसे अपडेट करने के लिए, आपको इसे नए मूल्यों के साथ फिर से लिखना होगा। इससे कोडिंग प्रक्रिया बहुत अधिक कठिन हो जाती है।
इस फ़ंक्शन के अंदर, हम प्रदर्शन को साफ़ करने के साथ शुरू करते हैं। अगला, हम अपना आवश्यक पाठ आकार निर्धारित करते हैं। तत्पश्चात, हम अपने कर्सर और प्रिंट फंक्शन जेनरेटर को display.println ("फंक्शन फंक्शन") के साथ सेट करते हैं; आज्ञा। हमने फिर से टेक्स्ट साइज़ को 2 पर सेट किया, और कर्सर को (0,20) डिस्प्ले की मदद से ।सेट्सकोर (0, 20) फंक्शन।
यह वह जगह है जहां हम जानकारी को प्रिंट करते हैं कि यह क्या लहर है।
display.clearDisplay (); // FIrst ने डिस्प्ले डिस्प्ले को साफ़ किया ।setTextSize (1); // सेट टेक्स्ट साइज़ डिस्प्ले.सेटकसर (10, 0); // सेट कर्सर स्थिति display.println ("फंक्शन जेनरेटर"); // टेक्स्ट डिसप्ले प्रिंट करें। tsetTizeSize (2); // सेट टेक्स्ट साइज़ डिस्प्ले ।सेटकॉरसर (0, 20); // सेट कर्सर स्थिति;
अगला, हम आवृत्ति विवरणों के लिए बूलियन चर की जांच करते हैं और मॉड्यूलफ्रैक्वेंसी चर में मूल्य को अपडेट करते हैं । हम Hz, kHz और MHz मानों के लिए ऐसा करते हैं। अगला, हम waveSelect चर की जांच करते हैं और पहचानते हैं कि कौन सी तरंग चयनित है। अब, हमारे पास तरंग प्रकार और आवृत्ति सेट करने के लिए मान हैं।
if (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {// चेक करें यदि Hz में फ्रीक्वेंसी सेट करने के लिए बटन को दबाया जाए मॉड्यूलFrequency = counter; // मॉड्यूल को मौजूदा काउंटर मान के साथ चर में अपडेट करें} यदि (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz = 0: 0) // // चेक करें कि क्या KHz में फ्रीक्वेंसी सेट करने के लिए बटन दबाया गया है मॉड्यूलFrequency = काउंटर * 1000; मॉड्यूल काउंटर वैल्यू को मौजूदा काउंटर वैल्यू के साथ अपडेट करें लेकिन हम इसे केएचजेड पर सेट करने के लिए 1000 गुणा करते हैं। अगर (सेट_फ्रीक्वेंसी_हेज़ == 0 && set_frequency_khz == 0 && set_reququency_mhz == 1) {// चेक करें तो मेगाहर्ट्ज में फ्रीक्वेंसी सेट करने के लिए बटन दबाएँ। = काउंटर * 1000000; if (मॉड्यूलफ्रीक्वेंसी> 12000000) {मॉड्यूलफ्रीक्वेंसी = 12000000;// आवृत्ति को ग्रेटर होने न दें कि 12Mhz काउंटर = 12; }} यदि (waveSelect == "SIN") {// साइन वेव को चुना गया है ।println ("SIN"); gen.ApplySignal (SINE_WAVE, REG0, मॉड्यूलफ्रीक्वेंसी); Serial.println (मॉड्यूलफ्रीक्वेंसी); } अगर (waveSelect == "SQR") {// Sqr वेव को डिस्प्ले किया गया है ।println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, मॉड्यूलफ्रीक्वेंसी); Serial.println (मॉड्यूलफ्रीक्वेंसी); } अगर (waveSelect == "TRI") {// त्रि तरंग को डिस्प्ले चुना गया है ।println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, मॉड्यूलफ्रीक्वेंसी); // AD9833 मॉड्यूल को अपडेट करें। Serial.println (मॉड्यूलफ्रीक्वेंसी); }} अगर (waveSelect == "SQR") {// Sqr वेव को डिस्प्ले किया गया है ।println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, मॉड्यूलफ्रीक्वेंसी); Serial.println (मॉड्यूलफ्रीक्वेंसी); } अगर (waveSelect == "TRI") {// त्रि तरंग को डिस्प्ले चुना गया है ।println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, मॉड्यूलफ्रीक्वेंसी); // AD9833 मॉड्यूल को अपडेट करें। Serial.println (मॉड्यूलफ्रीक्वेंसी); }} अगर (waveSelect == "SQR") {// Sqr वेव को डिस्प्ले किया गया है ।println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, मॉड्यूलफ्रीक्वेंसी); Serial.println (मॉड्यूलफ्रीक्वेंसी); } अगर (waveSelect == "TRI") {// त्रि तरंग को डिस्प्ले चुना गया है ।println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, मॉड्यूलफ्रीक्वेंसी); // AD9833 मॉड्यूल को अपडेट करें। Serial.println (मॉड्यूलफ्रीक्वेंसी); }
हम कर्सर को फिर से सेट करते हैं और काउंटर वैल्यू को अपडेट करते हैं। फिर से हम डिस्प्ले पर फ्रिक्वेंसी रेंज को अपडेट करने के लिए बूलियन की जांच करते हैं, हमें ऐसा करना होगा क्योंकि ओएलईडी का कार्य सिद्धांत बहुत अजीब है।
display.setCursor (45, 20); display.println (काउंटर); // प्रदर्शन पर काउंटर जानकारी प्रिंट करें। if (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Hz"); // डिस्प्ले Hz को प्रिंट करें डिस्प्ले ।isplay (); // जब सभी सेट डिस्प्ले को अपडेट करते हैं} यदि (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {display.setcursor (90, 20); display.println ("खज़"); display.display (); // जब सभी सेट डिस्प्ले को अपडेट करते हैं} यदि (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {display.setcursor (90, 20); display.println ("Mhz"); display.display (); // जब सभी सेट डिस्प्ले को अपडेट करते हैं}
अगला, हम आउटपुट पर / आउटपुट ओएलईडी पर प्रिंट करने के लिए बटन प्रेस चर की जांच करते हैं। OLED मॉड्यूल की वजह से फिर से ऐसा करने की जरूरत है।
if (btn_state) {display.setTextSize (1); display.setCursor (65, 45); display.print ("आउटपुट ऑन"); // डिस्प्ले आउटपुट पर प्रिंट डिस्प्ले.display (); display.setTextSize (2); } और {display.setTextSize (1); display.setCursor (65, 45); display.print ("आउटपुट ऑफ़"); // प्रिंट उत्पादन बंद प्रदर्शन display.display () के लिए; display.setTextSize (2); }
यह हमारी कोडिंग प्रक्रिया के अंत का प्रतीक है। यदि आप इस बिंदु पर भ्रमित हैं, तो आप आगे की समझ के लिए कोड में टिप्पणियों की जांच कर सकते हैं।
AD9833 आधारित फ़ंक्शन जनरेटर का परीक्षण
सर्किट का परीक्षण करने के लिए, उपरोक्त सेटअप का उपयोग किया जाता है। जैसा कि आप देख सकते हैं, हमने डीसी बैरल जैक के लिए 12 वी डीसी पावर एडॉप्टर कनेक्ट किया है और हमने सर्किट के आउटपुट के लिए हंटेक ऑस्किलोस्कोप कनेक्ट किया है। हमने ऑक्सिलोस्कोप को आउटपुट आवृत्ति की कल्पना करने और मापने के लिए लैपटॉप से जोड़ा है।
एक बार यह हो जाने के बाद, हमने रोटरी एनकोडर की मदद से आउटपुट फ्रीक्वेंसी को 5Khz पर सेट किया और हम आउटपुट साइन वेव का परीक्षण करते हैं और पर्याप्त रूप से सुनिश्चित करते हैं, यह आउटपुट पर 5Khz साइन वेव है।
अगला, हमने आउटपुट तरंग को त्रिकोणीय तरंग में बदल दिया है, लेकिन आवृत्ति समान रही, आउटपुट तरंग नीचे दिखाया गया है।
फिर हमने आउटपुट को एक वर्ग तरंग में बदल दिया और आउटपुट का अवलोकन किया, और यह एक पूर्ण वर्ग तरंग थी।
हमने फ़्रीक्वेंसी रेंज में भी बदलाव किया और आउटपुट का परीक्षण किया, और यह अच्छी तरह से काम कर रहा था।
इसके अलावा संवर्द्धन
यह सर्किट केवल अवधारणा का प्रमाण है और इसे और बढ़ाने की आवश्यकता है। सबसे पहले, हमें आउटपुट के लिए एक अच्छी गुणवत्ता वाले पीसीबी और कुछ अच्छी गुणवत्ता वाले BNC कनेक्टर की आवश्यकता है अन्यथा हम उच्च आवृत्ति प्राप्त नहीं कर सकते। मॉड्यूल का आयाम बहुत कम है, इसलिए इसे बढ़ाने के लिए, हमें आउटपुट वोल्टेज को बढ़ाने के लिए कुछ op-amp सर्किट की आवश्यकता होती है। आउटपुट आयाम को अलग करने के लिए एक पोटेंशियोमीटर को जोड़ा जा सकता है। सिग्नल को ऑफसेट करने के लिए एक स्विच कनेक्ट किया जा सकता है; यह भी एक सुविधा होनी चाहिए। और आगे, कोड में बहुत सुधार की आवश्यकता है क्योंकि यह थोड़ा छोटा है। अंत में, OLED डिस्प्ले को बदलना होगा अन्यथा आसानी से समझने योग्य कोड लिखना असंभव है।
यह इस ट्यूटोरियल के अंत का प्रतीक है, मुझे उम्मीद है कि आपको लेख पसंद आया होगा और कुछ नया सीखा जाएगा। यदि आपके पास लेख के बारे में कोई प्रश्न हैं, तो आप उन्हें नीचे टिप्पणी अनुभाग में छोड़ सकते हैं या आप हमारे इलेक्ट्रॉनिक्स फोरम का उपयोग कर सकते हैं।