विषयसूची:

उच्च रिज़ॉल्यूशन फ़्रिक्वेंसी काउंटर: 5 चरण (चित्रों के साथ)
उच्च रिज़ॉल्यूशन फ़्रिक्वेंसी काउंटर: 5 चरण (चित्रों के साथ)

वीडियो: उच्च रिज़ॉल्यूशन फ़्रिक्वेंसी काउंटर: 5 चरण (चित्रों के साथ)

वीडियो: उच्च रिज़ॉल्यूशन फ़्रिक्वेंसी काउंटर: 5 चरण (चित्रों के साथ)
वीडियो: Range of human blood pressure - Normal to Hypertensive crisis 2024, नवंबर
Anonim

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

संपादित करें: कोड अब GitLab पर उपलब्ध है:

gitlab.com/WilkoL/high-resolution-फ्रीक्वेंसी-काउंटर

चरण 1: पुराने स्कूल की बारंबारता गणना

ओल्ड स्कूल फ़्रीक्वेंसी काउंटिंग
ओल्ड स्कूल फ़्रीक्वेंसी काउंटिंग
ओल्ड स्कूल फ़्रीक्वेंसी काउंटिंग
ओल्ड स्कूल फ़्रीक्वेंसी काउंटिंग

सिग्नल की आवृत्ति को मापने के लिए पुराने स्कूल का तरीका एक लॉजिक एंड-गेट का उपयोग करना है, सिग्नल को एक पोर्ट में मापा जाना है और एक सिग्नल को दूसरे पोर्ट पर ठीक 1 सेकंड के उच्च समय के साथ और आउटपुट की गणना करना है। यह कुछ kHz के संकेतों के लिए GHz में अच्छी तरह से काम करता है। लेकिन क्या होगा यदि आप कम आवृत्ति सिग्नल को अच्छे रिज़ॉल्यूशन के साथ मापना चाहते हैं? मान लें कि आप मेन की आवृत्ति (यहां 50 हर्ट्ज) मापना चाहते हैं। यदि आप भाग्यशाली हैं तो पुराने स्कूल पद्धति के साथ आप अपने डिस्प्ले पर एक स्थिर 50 देखेंगे, लेकिन अधिक संभावना है कि आप 49 से 50 या 50 से 51 तक डिस्प्ले स्विच देखेंगे। रिज़ॉल्यूशन 1 हर्ट्ज है, और बस इतना ही। आप कभी भी ५०.००२ हर्ट्ज नहीं देखेंगे जब तक कि आप गेट के समय को १००० सेकंड तक बढ़ाने के इच्छुक नहीं हैं। यह एक माप के लिए 16 मिनट से अधिक है!

कम आवृत्ति संकेतों को मापने का एक बेहतर तरीका इसकी अवधि को मापना है। एक उदाहरण के रूप में फिर से मुख्य लेना, 20 मिलीसेकंड की अवधि है। एक ही लॉजिक एंड-गेट लें, इसे 10 मेगाहर्ट्ज (0.1 यूएस पल्स) कहें और दूसरे पोर्ट पर आपका सिग्नल और 200000 पल्स आते हैं, इसलिए पीरियड टाइम 20000.0 यूएस है और यह 50 हर्ट्ज में वापस ट्रांसलेट होता है। जब आप केवल १९९६५० दालों को मापते हैं तो आवृत्ति ५०.०८७ हर्ट्ज है, यह बहुत बेहतर है, और यह केवल एक सेकंड के मापने के समय में है। दुर्भाग्य से यह उच्च आवृत्तियों के साथ अच्छी तरह से काम नहीं करता है। उदाहरण के लिए, अब हम 40 kHz मापना चाहते हैं। संदर्भ के समान 10 मेगाहर्ट्ज इनपुट आवृत्ति के साथ अब हम केवल 250 दालों को मापते हैं। जब हम सिर्फ 249 दालों की गिनती करते हैं तो गणना 40161 हर्ट्ज देती है और 251 के साथ परिणाम 39840 हर्ट्ज होता है। यह स्वीकार्य संकल्प नहीं है। बेशक संदर्भ आवृत्ति बढ़ने से परिणामों में सुधार होता है लेकिन माइक्रो नियंत्रक में आप जो उपयोग कर सकते हैं उसकी एक सीमा है।

चरण 2: पारस्परिक तरीका

पारस्परिक तरीका
पारस्परिक तरीका
पारस्परिक तरीका
पारस्परिक तरीका

एक समाधान जो कम और उच्च आवृत्तियों दोनों के लिए काम करता है, एक पारस्परिक आवृत्ति काउंटर है। मैं इसके सिद्धांत को समझाने की कोशिश करूंगा। आप एक मापने के समय के साथ शुरू करते हैं जो लगभग 1 सेकंड है, यह बहुत सटीक नहीं होना चाहिए लेकिन यह माप के लिए एक उचित समय है। इस 1 हर्ट्ज सिग्नल को डी-इनपुट पर डी-फ्लिपफ्लॉप में फीड करें। आउटपुट पर अभी तक कुछ नहीं होता है। उस सिग्नल को कनेक्ट करें जिसे आप D-flipflop के CLOCK इनपुट से मापना चाहते हैं।

जैसे ही यह सिग्नल LOW से HIGH तक जाता है, D-flipflop का आउटपुट D-इनपुट की स्थिति को आउटपुट (Q) में ट्रांसफर कर देता है। इस राइजिंग सिग्नल का उपयोग इनपुट सिग्नल के साथ-साथ संदर्भ घड़ी सिग्नल की गिनती शुरू करने के लिए किया जाता है।

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

कुछ समय बाद, कुछ मिलीसेकंड कहें, आप डी-फ्लिपफ्लॉप के डी-इनपुट को फिर से कम कर देते हैं। अगले क्लॉक-इनपुट पर आउटपुट Q इनपुट की स्थिति का अनुसरण करता है, लेकिन कुछ और नहीं होता है क्योंकि माइक्रो कंट्रोलर केवल RISING सिग्नल पर प्रतिक्रिया करने के लिए सेट होता है। फिर, मापने का समय समाप्त होने के बाद (लगभग 1 सेकंड) आप डी-इनपुट को उच्च बनाते हैं।

अगले क्लॉक-इनपुट पर फिर से क्यू आउटपुट आता है और यह राइजिंग सिग्नल माइक्रो कंट्रोलर को ट्रिगर करता है, इस बार दोनों काउंटरों की गिनती समाप्त करने के लिए।

परिणाम दो संख्याएँ हैं। पहली संख्या संदर्भ से गिने गए दालों की संख्या है। जैसा कि हम संदर्भ आवृत्ति जानते हैं, हम उन दालों को गिनने में लगने वाले समय को भी जानते हैं।

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

अब यह इनपुट सिग्नल की आवृत्ति निर्धारित करने के लिए सिर्फ एक गणना है।

एक उदाहरण, मान लीजिए कि हमारे पास ये संकेत हैं और हम एफ-इनपुट को मापना चाहते हैं। संदर्भ 10 मेगाहर्ट्ज है, जो क्वार्ट्ज क्रिस्टल ऑसीलेटर द्वारा उत्पन्न होता है। f_input = ३१.४१६ Hz f_reference = १०००००० Hz (10 MHz), मापने का समय लगभग है। 1 सेकेंड

इस दौरान हमने 32 दालों की गिनती की। अब, इस संकेत की एक अवधि 1 / 31.416 = 31830.9 यूएस लेती है। तो 32 पीरियड्स में हमें 1.0185892 सेकेंड लगे, जो कि सिर्फ 1 सेकेंड से ज्यादा है।

इस 1.0186 सेकेंड में हम रेफरेंस सिग्नल के 10185892 पल्स भी गिन चुके होंगे।

यह हमें निम्नलिखित जानकारी देता है: input_count = 32 Reference_count = १०१८५८९२ f_reference = १०००००० Hz

परिणामी आवृत्ति की गणना करने का सूत्र यह है: freq = (input_count * f_reference) / ref_count

हमारे उदाहरण में वह है: f-input = (32 * 10000000) / 10185892 = 31.416 Hz

और यह कम आवृत्तियों के साथ-साथ उच्च आवृत्तियों के लिए अच्छी तरह से काम करता है, केवल जब इनपुट सिग्नल संदर्भ आवृत्ति के करीब (या उससे भी अधिक) आता है तो मापने के मानक "गेटेड" तरीके का उपयोग करना बेहतर होता है। लेकिन तब हम इनपुट सिग्नल में केवल एक फ़्रीक्वेंसी-डिवाइडर भी जोड़ सकते थे क्योंकि इस पारस्परिक विधि में किसी भी फ़्रीक्वेंसी (फिर से संदर्भ तक) के लिए समान रिज़ॉल्यूशन होता है। तो क्या आप १०० kHz को सीधे बाहरी १०००x विभक्त द्वारा विभाजित करके मापते हैं, संकल्प समान है।

चरण 3: हार्डवेयर और इसकी योजनाबद्ध

हार्डवेयर और इसकी योजनाबद्ध
हार्डवेयर और इसकी योजनाबद्ध
हार्डवेयर और इसकी योजनाबद्ध
हार्डवेयर और इसकी योजनाबद्ध

मैंने इस प्रकार के कुछ फ़्रीक्वेंसी काउंटर बनाए हैं। बहुत पहले मैंने ATMEGA328 (एक Arduino में एक ही नियंत्रक के रूप में) के साथ एक बनाया था, बाद में ST से ARM माइक्रो नियंत्रकों के साथ। नवीनतम 168 मेगाहर्ट्ज पर देखे गए STM32F407 के साथ बनाया गया था। लेकिन अब मैं सोच रहा था कि अगर मैं एक *बहुत* छोटे वाले के साथ भी ऐसा ही करूं तो क्या होगा। मैंने एक ATTINY2313 चुना, जिसमें केवल 2kbyte FLASH मेमोरी और 128 बाइट्स RAM है। मेरे पास जो डिस्प्ले है वह MAX7219 है जिसमें 8 सात सेगमेंट डिस्प्ले हैं, ये डिस्प्ले केवल 2 यूरो के लिए eBay पर उपलब्ध हैं। एक ATTINY2313 को लगभग 1.5 यूरो में खरीदा जा सकता है, मेरे द्वारा उपयोग किए जाने वाले बाकी हिस्सों की कीमत सिर्फ एक सेंट है। सबसे महंगा शायद प्लास्टिक प्रोजेक्ट बॉक्स था। बाद में मैंने इसे लिथियम-आयन बैटरी पर चलाने का फैसला किया, इसलिए मुझे एक (एलडीओ) 3.3V वोल्टेज स्टेबलाइजर एक बैटरी-चार्जिंग-मॉड्यूल और बैटरी को जोड़ने की आवश्यकता थी। इससे कीमत कुछ बढ़ जाती है, लेकिन मुझे लगता है कि इसे 20 यूरो से कम में बनाया जा सकता है।

चरण 4: कोड

कोड
कोड
कोड
कोड

कोड सी में एटमेल (माइक्रोचिप) स्टूडियो 7 के साथ लिखा गया था और OLIMEX AVR_ISP (क्लोन?) का उपयोग करके ATTINY2313 में प्रोग्राम किया गया था। यदि आप यहां विवरण का पालन करना चाहते हैं तो नीचे ज़िप फ़ाइल में (main.c) खोलें।

प्रारंभ

पहले ATTINY2313 को बाहरी क्रिस्टल का उपयोग करने के लिए सेट किया गया था क्योंकि आंतरिक RC-थरथरानवाला कुछ भी मापने के लिए बेकार है। मैं एक 10 मेगाहर्ट्ज क्रिस्टल का उपयोग करता हूं जिसे मैं एक छोटे चर संधारित्र के साथ सही 10 000 000 हर्ट्ज आवृत्ति पर ट्यून करता हूं। इनिशियलाइज़ेशन में इनपुट और आउटपुट के लिए पोर्ट सेट करने, टाइमर सेट करने और MAX7219 के इंटरप्ट और इनिशियलाइज़ेशन को सक्षम करने का ध्यान रखा जाता है। TIMER0 को बाहरी घड़ी, TIMER1 आंतरिक घड़ी और डी-फ्लिपफ्लॉप से आने वाले आईसीपी के बढ़ते किनारे पर काउंटर के मूल्य को पकड़ने के लिए सेट किया गया है।

मैं मुख्य कार्यक्रम के बारे में आखिरी बार चर्चा करूँगा, इसलिए आगे इंटरप्ट रूटीन हैं।

TIMER0_OVF

जैसा कि TIMER0 255 (8 बिट) तक गिना जाता है और फिर 0 पर लुढ़क जाता है, हमें ओवरफ्लो की संख्या गिनने के लिए एक इंटरप्ट की आवश्यकता होती है। बस इतना ही TIMER0_OVF करता है, बस अतिप्रवाह की संख्या गिनें। बाद में इस संख्या को काउंटर के मूल्य के साथ ही जोड़ दिया जाता है।

TIMER1_OVF

TIMER1 65536 (16 बिट) तक गिन सकता है, इसलिए रुकावट TIMER1_OVF भी ओवरफ्लो की संख्या को गिनता है। लेकिन यह और अधिक करता है। यह 152 से 0 तक घटता है जिसमें लगभग 1 सेकंड का समय लगता है और फिर एक आउटपुट पिन सेट करता है, जो फ्लिपफ्लॉप के डी-इनपुट में जाता है। और आखिरी चीज जो इस इंटरप्ट रूटीन में की जाती है, वह है टाइमआउट-काउंटर को घटाना, 765 से 0 तक जाना, जिसमें लगभग 5 सेकंड लगते हैं।

TIMER1_CAPT

यह TIMER1_CAPT इंटरप्ट है जो इनपुट सिग्नल के बढ़ते किनारे पर (जैसा कि ऊपर बताया गया है) हर बार डी-फ्लिपफ्लॉप इसे सिग्नल भेजता है। कैप्चर लॉजिक कैप्चर के समय TIMER1 काउंटर के मूल्य को बचाने का ध्यान रखता है, इसे सेव किया जाता है और साथ ही ओवरफ्लो काउंटर भी। दुर्भाग्य से TIMER0 में इनपुट कैप्चर फ़ंक्शन नहीं है, इसलिए यहां इसका वर्तमान मान और ओवरफ़्लो काउंटर का वर्तमान मान पढ़ा जाता है। मुख्य कार्यक्रम के लिए एक संदेश-चर सेट किया गया है ताकि यह बताया जा सके कि यह नया डेटा है।

MAX7219. को नियंत्रित करने के लिए आगे दो कार्य हैं

एसपीआई

जबकि चिप में एक यूनिवर्सल सीरियल इंटरफेस (यूएसआई) उपलब्ध है, मैंने इसका इस्तेमाल नहीं करने का फैसला किया। MAX7219 डिस्प्ले को SPI के माध्यम से नियंत्रित करने की आवश्यकता है और यह USI के साथ संभव है। लेकिन एसपीआई को बिटबैंग करना इतना आसान है कि मैंने इसे यूएसआई के साथ करने के लिए समय नहीं लिया।

MAX7219

एक बार मैनुअल पढ़ने के बाद MAX7219 को सेटअप करने का प्रोटोकॉल भी काफी सरल है। इसे प्रत्येक अंक के लिए 16 बिट मान की आवश्यकता होती है जिसमें अंक संख्या (1 से 8) के लिए 8 बिट होते हैं और उसके बाद प्रदर्शित होने वाली संख्या के लिए 8 बिट होते हैं।

मुख्य कार्यक्रम

आखिरी बात मुख्य कार्यक्रम की व्याख्या करना है। यह एक अनंत लूप में चलता है (जबकि (1)) लेकिन वास्तव में केवल तभी कुछ करता है जब कोई संदेश (1) इंटरप्ट रूटीन से होता है या जब टाइमआउट काउंटर शून्य हो जाता है (कोई इनपुट सिग्नल नहीं)।

जब चर संदेश को एक पर सेट किया जाता है, तो सबसे पहले टाइमआउट काउंटर को रीसेट किया जाता है, आखिरकार हम जानते हैं कि एक संकेत मौजूद है। डी-फ्लिपफ्लॉप को अगले ट्रिगर के लिए तैयार करने के लिए रीसेट किया जाता है जो मापने के समय के बाद आएगा (एक सेकंड प्रतीक्षा करें)।

रेफरेंस काउंट और इनपुट-फ़्रीक्वेंसी काउंट देने के लिए कैप्चर इंटरप्ट में पंजीकृत नंबरों को जोड़ा जाता है। (हमें यह सुनिश्चित करना होगा कि संदर्भ कभी भी शून्य न हो क्योंकि हम इसे बाद में विभाजित करेंगे)

अगला वास्तविक आवृत्ति की गणना है। मैं निश्चित रूप से केवल 2kbytes फ्लैश के साथ एक माइक्रोकंट्रोलर पर फ्लोटिंग नंबरों का उपयोग नहीं करना चाहता और केवल 128 बाइट्स RAM मैं पूर्णांक का उपयोग करता हूं। लेकिन आवृत्तियां कई दशमलव के साथ 314.159 हर्ट्ज की तरह हो सकती हैं। इसलिए मैं इनपुट-फ़्रीक्वेंसी को न केवल संदर्भ आवृत्ति के साथ बल्कि गुणक के साथ भी गुणा करता हूं, और फिर एक संख्या जोड़ता हूं जहां दशमलव बिंदु जाना चाहिए। जब आप ऐसा करेंगे तो ये संख्या बहुत बड़ी हो जाएगी। उदा. ५०० kHz के इनपुट के साथ, १० MHz का संदर्भ और १०० का गुणक, यह ५ x १० ^ १४ देता है, यह वास्तव में बहुत बड़ा है! वे 32 बिट संख्या में फिट नहीं होंगे इसलिए मैं 64 बिट संख्याओं का उपयोग करता हूं जो 1.8 x 10^19 तक सभी तरह से जाएंगे (जो ATTINY2313 पर ठीक काम करता है)

और आखिरी बात यह है कि परिणाम को MAX7219 डिस्प्ले पर भेजना है।

कोड कुछ 1600 बाइट्स में संकलित होता है, इसलिए यह ATTINY2313 में उपलब्ध 2048 बाइट्स फ्लैश में फिट बैठता है।

फ्यूज-रजिस्टरों को इस तरह पढ़ना चाहिए:

विस्तारित 0xFF

उच्च 0xDF

कम 0xBF

चरण 5: सटीकता और सटीकता

परिशुद्धता और यथार्थता
परिशुद्धता और यथार्थता
परिशुद्धता और यथार्थता
परिशुद्धता और यथार्थता
परिशुद्धता और यथार्थता
परिशुद्धता और यथार्थता

सटीकता और सटीकता दो अलग-अलग जानवर हैं। यहां सटीकता सात अंकों की है, वास्तविक सटीकता क्या है यह हार्डवेयर और अंशांकन पर निर्भर करता है। मैंने 10 मेगाहर्ट्ज (परीक्षण बिंदु पर 5 मेगाहर्ट्ज) को एक अन्य आवृत्ति काउंटर के साथ कैलिब्रेट किया जिसमें एक जीपीएस अनुशासित थरथरानवाला है।

और यह काफी अच्छी तरह से काम करता है, मैंने कोशिश की सबसे कम आवृत्ति 0.2 हर्ट्ज, उच्चतम 2 मेगाहर्ट्ज है। यह हाजिर है। 2 मेगाहर्ट्ज से ऊपर नियंत्रक इंटरप्ट को ढीला करना शुरू कर देता है, वास्तव में आश्चर्य की बात नहीं है जब आप जानते हैं कि 2 मेगाहर्ट्ज इनपुट सिग्नल पर TIMER0 प्रति सेकंड 7800 से अधिक इंटरप्ट उत्पन्न करता है। और ATTINY2313 को अन्य काम भी करने हैं, TIMER1 से इंटरप्ट, प्रति सेकंड 150 अन्य इंटरप्ट पर और निश्चित रूप से डिस्प्ले और डी-फ्लिपफ्लॉप को नियंत्रित करते हुए गणना करते हैं। जब आप वास्तविक डिवाइस को देखते हैं तो आप देखेंगे कि मैं डिस्प्ले के आठ अंकों में से केवल सात का उपयोग करता हूं। मैं ऐसा कई कारणों से करता हूं।

पहला यह है कि इनपुट आवृत्ति की गणना एक विभाजन है, इसमें लगभग हमेशा एक शेष होगा, जिसे आप नहीं देखते हैं क्योंकि यह एक पूर्णांक विभाजन है। दूसरा यह है कि क्वार्ट्ज क्रिस्टल थरथरानवाला तापमान स्थिर नहीं है।

कैपेसिटर जो इसे सही 10 मेगाहर्ट्ज पर ट्यून करते हैं, सिरेमिक हैं, तापमान परिवर्तन के प्रति बहुत संवेदनशील हैं। फिर तथ्य यह है कि TIMER0 में कैप्चर लॉजिक बिल्ड इन नहीं है, और इंटरप्ट फ़ंक्शन सभी को अपना काम करने में कुछ समय लगता है। मुझे लगता है कि सात अंक वैसे भी काफी अच्छे हैं।

सिफारिश की: