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

متوسط التشغيل لمشاريع وحدة التحكم الدقيقة الخاصة بك: 6 خطوات
متوسط التشغيل لمشاريع وحدة التحكم الدقيقة الخاصة بك: 6 خطوات

فيديو: متوسط التشغيل لمشاريع وحدة التحكم الدقيقة الخاصة بك: 6 خطوات

فيديو: متوسط التشغيل لمشاريع وحدة التحكم الدقيقة الخاصة بك: 6 خطوات
فيديو: الدرس الرابع - إعدادات نظام التشغيل الأساسية - مهارات رقمية - الأول المتوسط 2024, شهر نوفمبر
Anonim
متوسط التشغيل لمشاريع وحدة التحكم الدقيقة الخاصة بك
متوسط التشغيل لمشاريع وحدة التحكم الدقيقة الخاصة بك

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

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

الخطوة 1: حالة الاستخدام: تنعيم قياسات ADC

حالة الاستخدام: تنعيم قياسات ADC
حالة الاستخدام: تنعيم قياسات ADC

يحتوي Arduino على ADC لائق 10 بت مع ضوضاء قليلة جدًا. عند قياس القيمة على جهاز استشعار مثل مقياس الجهد أو المقاوم الضوئي أو مكونات أخرى عالية الضوضاء ، من الصعب الوثوق في أن القياس صحيح.

يتمثل أحد الحلول في إجراء قياسات متعددة في كل مرة تريد فيها قراءة المستشعر الخاص بك ومعدلها. في بعض الحالات يكون هذا حلاً قابلاً للتطبيق ولكن ليس دائمًا. إذا كنت تريد قراءة ADC 1000 مرة في الثانية ، فسيتعين عليك قراءة 10000 مرة إذا كنت قد أخذت متوسط 10 قياسات. مضيعة هائلة لوقت الحساب.

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

في الصورة أعلاه ، استخدمت متوسط تشغيل آخر 32 قياسًا. سترى أن هذه الطريقة ليست مقاومة للفشل بنسبة 100٪ ولكنها تحسن الدقة بشكل كبير (إنها ليست أسوأ من متوسط 32 عينة في كل مرة). إذا كنت تريد حساب متوسط 32 قياسًا في كل مرة ، فسيستغرق ذلك أكثر من 0.25 مللي ثانية على Arduino UNO للقياسات وحدها!

الخطوة 2: حالة الاستخدام: قياس مكون التيار المستمر لإشارة الميكروفون

حالة الاستخدام: قياس مكون التيار المستمر لإشارة الميكروفون
حالة الاستخدام: قياس مكون التيار المستمر لإشارة الميكروفون
حالة الاستخدام: قياس مكون التيار المستمر لإشارة الميكروفون
حالة الاستخدام: قياس مكون التيار المستمر لإشارة الميكروفون
حالة الاستخدام: قياس مكون التيار المستمر لإشارة الميكروفون
حالة الاستخدام: قياس مكون التيار المستمر لإشارة الميكروفون

يستطيع Arduino قياس الفولتية بين 0 و Vcc (عادةً 5 فولت). إشارة الصوت هي تيار متردد تمامًا وإذا كنت تريد قياسها على متحكم دقيق ، فيجب عليك تحيزها حول 1/2 Vcc. في مشروع Arduino UNO ، قد يعني ذلك تقريبًا 2.5 فولت (DC) + إشارة صوتية (AC). عند استخدام مزود طاقة 10 بت ADC و 5 فولت ، يجب أن يساوي انحياز 2.5 فولت قياس 512. لذا للحصول على قيمة AC للإشارة ، يجب طرح 512 من قياس ADC وهذا هو ، أليس كذلك؟

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

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

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

نحن نعلم أن متوسط قيمة أي إشارة تيار متردد هو 0. وباستخدام هذه المعرفة يمكننا استنتاج أن متوسط قيمة إشارة التيار المتردد + التيار المتردد يمثل تحيزًا للتيار المستمر. لإزالته ، يمكننا أخذ متوسط تشغيل للقيم القليلة الأخيرة وطرحه من قراءة ADC الحالية. لاحظ أنك تحتاج إلى استخدام متوسط تشغيل طويل بما يكفي. بالنسبة إلى الصوت ، يجب أن يكون عُشر الثانية (يعتمد عدد العينات على معدل العينة الخاص بك) كافيًا ولكن يجب أن تعلم أن المتوسطات الأطول تعمل بشكل أفضل. في الصورة الأولى ، يمكنك رؤية مثال لحساب تحيز DC الحقيقي بمتوسط تشغيل مع 64 عنصرًا بمعدل عينة 1 كيلو هرتز (أقل مما أوصيت به ولكنه لا يزال يعمل).

الخطوة 3: الحساب

عملية حسابية
عملية حسابية

يمكنك أن تتخيل متوسط الجري باعتباره متوسط وزن الأشخاص في غرفة انتظار الطبيب. ينهي الطبيب فحص مريض واحد ويدخل في نفس الوقت مريض جديد إلى غرفة الانتظار.

لمعرفة متوسط وزن جميع المرضى المنتظرين في غرفة الانتظار ، يمكن للممرضة أن تسأل كل مريض عن وزنه ، وتجمع هذه الأرقام وتقسيمها على عدد المرضى. في كل مرة يقبل فيها الطبيب مريض جديد ، تكرر الممرضة العملية برمتها.

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

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

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

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

الرمز
الرمز

من أجل حساب المتوسط الجاري ، تحتاج أولاً إلى طريقة لتخزين قيم N الأخيرة. يمكن أن يكون لديك مصفوفة تحتوي على عناصر N وتحريك المحتويات بالكامل في مكان واحد في كل مرة تضيف فيها عنصرًا (من فضلك لا تفعل ذلك) ، أو يمكنك الكتابة فوق عنصر قديم وضبط المؤشر إلى العنصر التالي ليتم التخلص منه (يرجى القيام بذلك:)

يجب أن يبدأ المجمع على 0 ، وينطبق نفس الشيء على جميع العناصر في سطر التأخير. في حالة أخرى ، سيكون متوسط التشغيل لديك دائمًا خاطئًا. سترى أن delayLine_init تهتم بتهيئة خط التأخير ، يجب أن تهتم بالمراكم بنفسك.

إن إضافة عنصر لتأخير السطر أمر سهل مثل إنقاص فهرس العنصر الأحدث بمقدار 1 ، مع التأكد من أنه لا يشير إلى جانب صفيف خط التأخير. بعد تناقص الفهرس عندما يكون 0 ، سوف يدور حوله إلى 255 (لأنه عدد صحيح 8 بت بدون إشارة). سيضمن مشغل Modulo (٪) بحجم مصفوفة خط التأخير أن الفهرس سيشير إلى عنصر صالح.

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

الحق سهلة؟

لا تتردد في تجربة استخدام الكود المرفق لفهم كيفية عمل كل هذا بشكل أفضل. كما هو الحال حاليًا ، يقرأ اردوينو القيمة التناظرية على الدبوس التناظري A0 ويطبع "[قيمة ADC] ، [متوسط التشغيل]" على المنفذ التسلسلي بمعدل باود 115200. إذا فتحت راسمة اردوينو التسلسلية على معدل باود صحيح ، فسترى سطرين: قيمة ADC (أزرق) وقيمة ناعمة (أحمر).

الخطوة 5: الإضافات

إضافات
إضافات

هناك بعض الأشياء التي لا تحتاج بالضرورة إلى معرفتها من أجل استخدام متوسط التشغيل في مشروعك ، ولن يضر بمعرفتها.

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

المضي قدما.

التهيئة: عندما تحدثت عن تهيئة عناصر التراكم والتأخير ، قلت إنه يجب تهيئتها جميعًا إلى 0. بدلاً من ذلك ، يمكنك تهيئة سطر التأخير إلى أي شيء تريده ولكن يجب أن يبدأ المجمع كمجموع من العناصر N الجديدة في سطر التأخير (حيث N هو عدد العناصر في المتوسط الجاري الخاص بك). إذا بدأ المُراكم كأي قيمة أخرى ، فسيكون المتوسط المحسوب خاطئًا - إما منخفض جدًا أو مرتفع جدًا ، دائمًا بنفس المقدار (بافتراض نفس الشروط الأولية). أقترح أن تحاول معرفة سبب ذلك باستخدام بعض "محاكاة القلم والورق".

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

الحيلة: تستهلك خطوط التأخير الطويلة قدرًا كبيرًا من الذاكرة. يمكن أن يصبح بسرعة مشكلة. إذا كانت ذاكرتك مقيدة للغاية ولا تهتم كثيرًا بالدقة ، فيمكنك تقريب متوسط التشغيل عن طريق حذف التأخير تمامًا والقيام بذلك بدلاً من ذلك: طرح تراكم 1 / N * من المجمع وإضافة قيمة جديدة (على سبيل المثال 8 متوسط تشغيل طويل: المجمع = المجمع * 7/8 + newValue). تعطي هذه الطريقة نتيجة خاطئة ولكنها طريقة مناسبة لحساب متوسط التشغيل عند تشغيل ذاكرة منخفضة.

اللغويات: عادةً ما يتم استخدام "متوسط التشغيل / المتوسط" عند الإشارة إلى متوسط الوقت الفعلي بينما يعني "المتوسط / المتوسط المتحرك" عادةً تشغيل الخوارزمية على مجموعة بيانات ثابتة مثل جدول بيانات Excel.

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

آمل أن تكون هذه التعليمات سهلة بما يكفي لفهمها وأن تساعدك في مشاريعك المستقبلية. لا تتردد في نشر الأسئلة في التعليقات أدناه إذا كان هناك أي شيء غير واضح.

موصى به: