جدول المحتويات:

عداد تردد عالي الدقة: 5 خطوات (بالصور)
عداد تردد عالي الدقة: 5 خطوات (بالصور)

فيديو: عداد تردد عالي الدقة: 5 خطوات (بالصور)

فيديو: عداد تردد عالي الدقة: 5 خطوات (بالصور)
فيديو: جبت لك أفضل اعدادات الصورة في شاشات سامسونج | Samsung TV Picture Settings. 2024, شهر نوفمبر
Anonim

يوضح هذا التوجيه عداد تردد متبادل قادر على قياس الترددات بسرعة وبدقة معقولة. إنه مصنوع من مكونات قياسية ويمكن صنعه في عطلة نهاية الأسبوع (استغرق الأمر وقتًا أطول قليلاً:-))

تحرير: الرمز متاح الآن على GitLab:

gitlab.com/WilkoL/high-resolution-frequency-counter

الخطوة 1: حساب تردد المدرسة القديمة

عد تردد المدرسة القديمة
عد تردد المدرسة القديمة
عد تردد المدرسة القديمة
عد تردد المدرسة القديمة

تتمثل الطريقة القديمة في قياس تردد الإشارة في استخدام بوابة AND المنطقية ، وتغذية الإشارة المراد قياسها في منفذ واحد وإشارة إلى المنفذ الآخر بوقت مرتفع يبلغ 1 ثانية بالضبط وحساب المخرجات. يعمل هذا بشكل جيد مع إشارات بضعة كيلوهرتز جيدًا في GHz. ولكن ماذا لو كنت تريد قياس إشارة منخفضة التردد بدقة جيدة؟ لنفترض أنك تريد قياس تردد التيار الكهربائي (هنا 50 هرتز). باستخدام طريقة المدرسة القديمة ، سترى 50 ثابتًا على شاشتك إذا كنت محظوظًا ، ولكن على الأرجح سترى تبديل الشاشة من 49 إلى 50 أو 50 إلى 51. الدقة هي 1 هرتز ، وهذا كل شيء. لن ترى أبدًا 50.002 هرتز إلا إذا كنت على استعداد لزيادة وقت البوابة إلى 1000 ثانية. هذا أكثر من 16 دقيقة ، في عملية قياس واحدة!

أفضل طريقة لقياس إشارات التردد المنخفض هي قياس الفترة الزمنية لها. إذا أخذنا الخطوط الرئيسية كمثال مرة أخرى ، فإن فترة 20 مللي ثانية. خذ نفس المنطق AND-gate ، وقم بتغذيتها ، على سبيل المثال 10 MHz (0.1 نبضات أمريكية) وإشاراتك على المنفذ الآخر وخرج 200000 نبضة ، وبالتالي فإن الفترة الزمنية هي 20000.0 دولارًا أمريكيًا وهذا يترجم مرة أخرى إلى 50 هرتز. عندما تقيس فقط 199650 نبضة ، يكون التردد 50.087 هرتز ، وهذا أفضل كثيرًا ، ويتم قياسه في ثانية واحدة فقط. للأسف هذا لا يعمل بشكل جيد مع الترددات الأعلى. خذ على سبيل المثال ، نريد الآن قياس 40 كيلو هرتز. مع نفس تردد الإدخال 10 ميجاهرتز مثل المرجع ، نقيس الآن 250 نبضة فقط. عندما نحسب فقط 249 نبضة ، نحصل على 40161 هرتز ومع 251 تكون النتيجة 39840 هرتز. هذا ليس قرارًا مقبولًا. بالطبع تؤدي زيادة التردد المرجعي إلى تحسين النتائج ، ولكن هناك حدًا لما يمكنك استخدامه في وحدة التحكم الدقيقة.

الخطوة الثانية: الطريقة المتبادلة

الطريقة التبادلية
الطريقة التبادلية
الطريقة التبادلية
الطريقة التبادلية

الحل الذي يعمل لكل من الترددات المنخفضة والعالية هو عداد التردد المتبادل. سأحاول شرح مبدأه. تبدأ بوقت قياس يبلغ ثانية واحدة تقريبًا ، ولا يلزم أن يكون دقيقًا للغاية ولكنه وقت معقول للقياس. قم بتغذية إشارة 1 هرتز هذه في D-flipflop على إدخال D. لا شيء يحدث حتى الآن على الإخراج (ق). قم بتوصيل الإشارة التي تريد قياسها بإدخال CLOCK في D-flipflop.

بمجرد انتقال هذه الإشارة من LOW إلى HIGH ، ينقل إخراج D-flipflop حالة إدخال D إلى الإخراج (Q). تُستخدم إشارة RISING هذه لبدء عد إشارة الدخل بالإضافة إلى إشارة الساعة المرجعية.

لذا فأنت تحسب إشارتين في نفس الوقت بالضبط ، الإشارة التي تريد قياسها وساعة مرجعية. يجب أن يكون لهذه الساعة المرجعية قيمة دقيقة وأن تكون مستقرة ، ومذبذب بلوري عادي جيد. القيمة ليست مهمة جدًا طالما أنها عالية التردد وقيمتها معروفة جيدًا.

بعد مرور بعض الوقت ، قل بضعة أجزاء من الثانية ، يمكنك جعل إدخال D لـ D-flipflop منخفضًا مرة أخرى. عند إدخال CLOCK التالي ، يتبع الإخراج Q حالة الإدخال ، ولكن لا يحدث أي شيء آخر لأن وحدة التحكم الصغيرة مضبوطة على الاستجابة للإشارة الصاعدة فقط. بعد ذلك ، بعد انتهاء وقت القياس (ثانية واحدة تقريبًا) ، تجعل D-input عاليًا.

مرة أخرى عند إدخال CLOCK التالي ، يتبع إخراج Q وهذه الإشارة الصاعدة تؤدي إلى تشغيل وحدة التحكم الصغيرة ، هذه المرة لإنهاء عد كلا العددين.

النتيجة هي رقمان. الرقم الأول هو عدد النبضات المحسوبة من المرجع. نظرًا لأننا نعرف التردد المرجعي ، فإننا نعرف أيضًا الوقت المستغرق لحساب تلك النبضات.

الرقم الثاني هو عدد النبضات من إشارة الدخل التي نقيسها. نظرًا لأننا بدأنا بالضبط عند الحواف الصاعدة لهذه الإشارة ، فإننا واثقون جدًا من عدد نبضات إشارة الإدخال هذه.

الآن هي مجرد عملية حسابية لتحديد وتيرة إشارة الدخل.

على سبيل المثال ، لنفترض أن لدينا هذه الإشارات ونريد قياس مدخلات f. المرجع هو 10 ميجا هرتز ، تم إنشاؤه بواسطة مذبذب بلوري كوارتز. f_input = 31.416 هرتز f_reference = 10000000 هرتز (10 ميجا هرتز) ، وقت القياس تقريبًا. 1 ثانية

في هذا الوقت قمنا بإحصاء 32 نبضة. الآن ، تستغرق فترة واحدة من هذه الإشارة 1 / 31.416 = 31830.9 دولارًا أمريكيًا. لذا فقد استغرقتنا 32 فترة 1.0185892 ثانية ، وهو ما يزيد قليلاً عن ثانية واحدة.

في هذه 1.0186 ثانية ، سنحسب أيضًا 10185892 نبضة للإشارة المرجعية.

هذا يعطينا المعلومات التالية: input_count = 32 reference_count = 10185892 f_reference = 10000000 هرتز

الصيغة لحساب التردد الناتج هي: freq = (input_count * f_reference) / ref_count

في مثالنا هذا: f-input = (32 * 10000000) / 10185892 = 31.416 Hz

وهذا يعمل جيدًا للترددات المنخفضة وكذلك الترددات العالية ، فقط عندما تقترب إشارة الإدخال (أو حتى أعلى من) من التردد المرجعي ، فمن الأفضل استخدام طريقة القياس القياسية "ذات البوابات". ولكن بعد ذلك يمكننا أيضًا إضافة مقسم تردد إلى إشارة الإدخال لأن هذه الطريقة المتبادلة لها نفس الدقة لأي تردد (حتى المرجع مرة أخرى). لذا ، سواء كنت تقيس 100 كيلو هرتز مباشرة مقسومة على مقسم خارجي 1000x ، فإن الدقة هي نفسها.

الخطوة 3: الأجهزة وتخطيطها

الأجهزة وتخطيطها
الأجهزة وتخطيطها
الأجهزة وتخطيطها
الأجهزة وتخطيطها

لقد قمت بعمل عدد قليل من هذا النوع من عدادات التردد. منذ فترة طويلة ، صنعت واحدة باستخدام ATMEGA328 (نفس وحدة التحكم الموجودة في Arduino) ، لاحقًا باستخدام وحدات التحكم الصغيرة ARM من ST. تم صنع الأحدث باستخدام STM32F407 الذي تم تسجيله بسرعة 168 ميجاهرتز. لكنني الآن تساءلت ماذا لو فعلت الشيء نفسه مع أصغر بكثير. اخترت ATTINY2313 ، الذي يحتوي على 2 كيلو بايت فقط من ذاكرة فلاش و 128 بايت من ذاكرة الوصول العشوائي. العرض الذي أملكه هو MAX7219 مع 8 شاشات ذات سبعة أجزاء ، هذه الشاشات متوفرة على موقع Ebay مقابل 2 يورو فقط. يمكن شراء ATTINY2313 مقابل 1.5 يورو تقريبًا ، أما الأجزاء المتبقية التي استخدمتها ، فتكلف سنتًا فقط للقطعة. ربما كان أغلى صندوق مشروع بلاستيكي. في وقت لاحق قررت تشغيله على بطارية ليثيوم أيون ، لذلك كنت بحاجة إلى إضافة (LDO) 3.3V مثبت جهد للبطارية ووحدة شحن البطارية والبطارية نفسها. هذا يزيد السعر إلى حد ما ، لكن أعتقد أنه يمكن بناؤه بأقل من 20 يورو.

الخطوة 4: الكود

الرمز
الرمز
الرمز
الرمز

تمت كتابة الكود في C باستخدام Atmel (Microchip) Studio 7 وبرمجته في ATTINY2313 باستخدام OLIMEX AVR_ISP (استنساخ؟). افتح (main.c) في الملف المضغوط أدناه إذا كنت تريد اتباع الوصف هنا.

التهيئة

أولاً ، تم تعيين ATTINY2313 لاستخدام بلورة خارجية لأن مذبذب RC الداخلي غير مفيد لقياس أي شيء. أستخدم بلورة بتردد 10 ميجاهرتز لضبطها على التردد الصحيح 1000000 هرتز باستخدام مكثف متغير صغير. تهتم التهيئة بإعداد المنافذ على المدخلات والمخرجات ، وإعداد المؤقتات وتمكين المقاطعات وتهيئة MAX7219. يتم إعداد TIMER0 لعد ساعة خارجية ، TIMER1 الساعة الداخلية وأيضًا لالتقاط قيمة العداد عند الحافة الصاعدة لبرنامج المقارنات الدولية ، القادمة من D-flipflop.

سأقوم بمناقشة البرنامج الرئيسي أخيرًا ، لذا فيما يلي إجراءات المقاطعة.

TIMER0_OVF

نظرًا لأن TIMER0 يعد حتى 255 (8 بتات) ثم يتدحرج إلى 0 ، فإننا نحتاج إلى مقاطعة لحساب عدد الفائض. هذا كل ما يفعله TIMER0_OVF ، فقط احسب عدد الفائض. في وقت لاحق يتم دمج هذا الرقم مع قيمة العداد نفسه.

TIMER1_OVF

يمكن لـ TIMER1 العد حتى 65536 (16 بت) ، لذا فإن المقاطعة TIMER1_OVF تحسب أيضًا عدد الفائض. لكنها تفعل المزيد. يتناقص أيضًا من 152 إلى 0 والذي يستغرق حوالي ثانية واحدة ثم يقوم بتعيين دبوس الإخراج ، والانتقال إلى إدخال D في flipflop. وآخر شيء يتم القيام به في روتين المقاطعة هذا هو إنقاص عداد المهلة ، من 765 إلى 0 ، والذي يستغرق حوالي 5 ثوانٍ.

TIMER1_CAPT

هذه هي مقاطعة TIMER1_CAPT التي يتم تشغيلها في كل مرة يرسل فيها D-flipflop إشارة ، عند الحافة الصاعدة لإشارة الإدخال (كما هو موضح أعلاه). يعتني منطق الالتقاط بحفظ قيمة عداد TIMER1 في لحظة الالتقاط ، ويتم حفظه بالإضافة إلى عداد الفائض. لسوء الحظ ، لا يحتوي TIMER0 على وظيفة التقاط المدخلات ، لذا تتم قراءة قيمته الحالية وقيمته الحالية لعداد الفائض. يتم تعيين متغير الرسالة على واحد ليخبر البرنامج الرئيسي أن هذه بيانات جديدة.

فيما يلي وظيفتان للتحكم في MAX7219

SPI

بينما توجد واجهة تسلسلية عالمية (USI) متوفرة في الشريحة ، اخترت عدم استخدامها. يجب التحكم في شاشة MAX7219 عبر SPI وهذا ممكن مع USI. لكن bitbanging SPI بسيط جدًا لدرجة أنني لم آخذ الوقت الكافي للقيام بذلك مع USI.

ماكس 7219

يعد بروتوكول إعداد MAX7219 أيضًا بسيطًا جدًا بمجرد قراءة الدليل الخاص به. يحتاج إلى قيمة 16 بت لكل رقم يتكون من 8 بتات لرقم الرقم (من 1 إلى 8) متبوعًا بـ 8 بتات للرقم الذي يحتاج إلى عرضه.

البرنامج الرئيسي

آخر شيء هو شرح البرنامج الرئيسي. إنه يعمل في حلقة لا نهائية (بينما (1)) ولكنه يفعل شيئًا ما في الواقع فقط عندما تكون هناك رسالة (1) من روتين المقاطعة أو عندما ينخفض عداد المهلة إلى الصفر (لا توجد إشارة إدخال).

أول شيء يجب القيام به عند ضبط الرسالة المتغيرة على واحد ، هو إعادة تعيين عداد المهلة ، بعد كل ما نعرفه أن هناك إشارة موجودة. تتم إعادة ضبط D-flipflop لجعله جاهزًا للمشغل التالي الذي سيأتي بعد وقت القياس (انتظر ثانية).

تتم إضافة الأرقام المسجلة في مقاطعة الالتقاط لإعطاء العدد المرجعي وعدد تردد الإدخال. (علينا أن نتأكد من أن المرجع لا يمكن أن يكون صفرًا لأننا سنقسم عليه لاحقًا)

التالي هو حساب التردد الفعلي. بالتأكيد لا أريد استخدام الأرقام العائمة على متحكم دقيق بسعة 2 كيلو بايت فقط من الفلاش و 128 بايت فقط من ذاكرة الوصول العشوائي أستخدم الأعداد الصحيحة. لكن يمكن أن تكون الترددات مثل 314.159 هرتز ، مع عدة أرقام عشرية. لذلك أقوم بضرب تردد الإدخال ليس فقط مع التردد المرجعي ولكن أيضًا مع المضاعف ، ثم أضف رقمًا إلى المكان الذي يجب أن تذهب إليه الفاصلة العشرية. ستصبح هذه الأرقام كبيرة جدًا عند القيام بذلك. على سبيل المثال مع إدخال 500 كيلو هرتز ، ومرجع 10 ميغا هرتز ومضاعف 100 ، وهذا يعطي 5 × 10 ^ 14 ، وهذا ضخم حقًا! لن يتناسبوا مع رقم 32 بت لذا أستخدم أرقام 64 بت التي ستصل إلى 1.8 × 10 ^ 19 (هذا يعمل بشكل جيد على ATTINY2313)

وآخر شيء يجب فعله هو إرسال النتيجة إلى شاشة MAX7219.

يتم تجميع الشفرة في حوالي 1600 بايت ، لذا فهي تناسب فلاش 2048 بايت المتاح في ATTINY2313.

يجب أن تقرأ سجلات الصمامات على النحو التالي:

تم تمديد 0xFF

ارتفاع 0xDF

منخفضة 0xBF

الخطوة الخامسة: الدقة والدقة

الإحكام والدقة
الإحكام والدقة
الإحكام والدقة
الإحكام والدقة
الإحكام والدقة
الإحكام والدقة

الدقة والدقة نوعان من الوحوش المنفصلة. الدقة هنا هي سبعة أرقام ، وتعتمد الدقة الفعلية على الجهاز والمعايرة. لقد قمت بمعايرة 10 ميجاهرتز (5 ميجاهرتز على نقطة الاختبار) باستخدام عداد تردد آخر يحتوي على مذبذب منضبط لنظام تحديد المواقع العالمي (GPS).

وهو يعمل جيدًا ، أقل تردد جربته هو 0.2 هرتز ، وهو أعلى 2 ميجا هرتز. إنه على الفور. فوق 2 ميجاهرتز ، تبدأ وحدة التحكم في فقد المقاطعات ، وهذا ليس مفاجئًا حقًا عندما تعلم أن إشارة الإدخال TIMER0 عند 2 ميجاهرتز تولد أكثر من 7800 مقاطعة في الثانية. ويتعين على ATTINY2313 القيام بأشياء أخرى أيضًا ، المقاطعات من TIMER1 ، بمعدل 150 مقاطعة أخرى في الثانية وبالطبع إجراء الحسابات والتحكم في العرض و D-flipflop. عندما تنظر إلى الجهاز الفعلي ، سترى أنني أستخدم سبعة أرقام فقط من أصل ثمانية أرقام للشاشة. أفعل هذا لعدة أسباب.

الأول هو أن حساب تردد الإدخال عبارة عن قسمة ، وستظل دائمًا تقريبًا تحتوي على الباقي ، والذي لا تراه لأنه قسمة عدد صحيح. ثانيًا ، مذبذب بلورات الكوارتز غير مستقر بدرجة الحرارة.

المكثفات التي تضبطها على 10 ميجاهرتز الصحيحة هي من السيراميك ، وهي حساسة للغاية لتغيرات درجة الحرارة. ثم هناك حقيقة أن TIMER0 لا يحتوي على منطق الالتقاط ، وأن وظائف المقاطعة كلها تستغرق بعض الوقت للقيام بعملها. أعتقد أن سبعة أرقام جيدة بما يكفي على أي حال.

موصى به: