رسم تخطيطي لاردوينو لقناة واحدة
إعداد باطل () (autoadcsetup () ؛ DDRD | = (1<
البرنامج مكتوب في Arduino IDE لوحدة التحكم الدقيقة ATmega1280. في لوحة تصحيح الأخطاء الخاصة بي، يتم توجيه القنوات الثمانية الأولى لتلبية الاحتياجات الداخلية للوحة، لذلك يتم استخدام قناة ADC8. من الممكن استخدام هذا المخطط للوحة مع ATmega168، ولكن يجب عليك تحديد القناة الصحيحة.
داخل المقاطعات، نقوم بتشويه اثنين من دبابيس الخدمة لرؤية تردد رقمنة التشغيل بوضوح.
بضع كلمات حول مصدر المعامل 102 في البداية، تم توفير إشارة بسعات مختلفة من المولد، وتمت قراءة قيمة الجهد الفعال من راسم الذبذبات، وتم أخذ القيمة المحسوبة بوحدات ADC المطلقة من وحدة التحكم. .
اوماكس، V | أورمز، ب | عد |
3 | 2,08 | 212 |
2,5 | 1,73 | 176 |
2 | 1,38 | 141 |
1,5 | 1,03 | 106 |
1 | 0,684 | 71 |
0,5 | 0,358 | 36 |
0,25 | 0,179 | 19 |
عند هذه النقطة سوف نأخذ استراحة. في الجزء التالي، سننظر في الأسئلة الثلاثة الأخرى في هذه السلسلة وسننتقل بسلاسة إلى إنشاء الجهاز نفسه.
ستجد البرامج الثابتة المقدمة، بالإضافة إلى البرامج الثابتة الأخرى لهذه السلسلة (نظرًا لأنني أقوم بتصوير مواد الفيديو بشكل أسرع من إعداد المقالات) في المستودع الموجود على GitHub.
مخطط دائرة لجهاز محلي الصنع يعتمد على Arduino Uno، وهو مصمم لقياس التردد والجهد في المقبس وعرض النتائج على شاشة 1602A. من السهل جدًا تصنيع الجهاز بفضل استخدام وحدة ARDUINO UNO الجاهزة.
المؤشر عبارة عن شاشة LCD من النوع 1602A، وهو قياسي، استنادًا إلى وحدة التحكم HD44780. يعني التعيين 1602A في الواقع أنه موجود على سطرين يتكون كل منهما من 16 حرفًا.
أساس الجهاز هو ARDUINO UNO، وهي وحدة جاهزة غير مكلفة نسبيًا - لوحة دوائر مطبوعة صغيرة يوجد عليها متحكم ATMEGA328، بالإضافة إلى جميع "الأنابيب" اللازمة لتشغيلها، بما في ذلك مبرمج USB و مزود الطاقة.
يتم تشغيل الجهاز من التيار الكهربائي ويقيس المعلمات المذكورة أعلاه. يعمل مصدر الطاقة في نفس الوقت كجهاز استشعار للحصول على بيانات حول التردد والجهد في الشبكة الكهربائية. يتم تصنيع مصدر الطاقة على أساس محول T1 جاهز منخفض الطاقة ، والذي يحتوي على ملفين متطابقين بجهد متناوب 9 فولت لكل منهما.
أرز. 1. رسم تخطيطي لمقياس التردد والجهد في الشبكة الكهربائية، تم استخدام Arduino Uno و1602A.
يعمل ملف واحد على استقبال جهد الإمداد. يتم توفير الجهد المتردد منه إلى جسر المعدل باستخدام الثنائيات VD1-VD4. يعمل المكثف C3 على تنعيم تموجات الجهد المصحح.
يتلقى C3 جهدًا ثابتًا يبلغ حوالي 12 فولت، والذي يتم توفيره للموصل لتزويد الطاقة إلى لوحة ARDUINO UNO، وإلى مدخل منظم الجهد 5 فولت على هذه اللوحة، والذي يعمل على تشغيل اللوحة بأكملها ومؤشر H1.
يعمل الملف الثانوي الآخر للمحول كجهاز استشعار لقياس معلمات شبكة الطاقة. يتم توفير الجهد المتردد منه عبر R1 إلى جهاز تشكيل النبض بتردد التيار الكهربائي المصنوع على الترانزستور VT1 وفقًا لدائرة التبديل. يتم إرسال هذه النبضات إلى المنفذ الرقمي D10 للوحة ARDUINO UNO.
يتم قياس الجهد المتردد للشبكة باستخدام مقوم باستخدام الصمام الثنائي VD5 والمكثف C2. يتم تحديد حجم الجهد المتردد في الشبكة من خلال حجم الجهد المباشر على هذا المكثف ومن خلال مقسم قابل للتعديل على المقاومات R4 و R5، يتم توفيره إلى الإدخال التناظري A1 للوحة ARDUINO UNO.
ويرد في الجدول 1 برنامج C++ مع التعليقات التفصيلية. لقياس التردد، استخدم وظيفة النبض، التي تقيس بالميكروثانية مدة الحافة الإيجابية أو السلبية لنبضة الإدخال.
الجدول 1.
أرز. 2. الكود المصدري لبرنامج قياس قيمة التردد والجهد في الشبكة الكهربائية.
لذلك، من أجل معرفة الفترة، تحتاج إلى إضافة مدة نصف الدورات الإيجابية والسلبية، ولمعرفة التردد بالهرتز، تحتاج إلى تقسيم 1،000،000 على الفترة المحسوبة.
يتكون قياس مدة الفترة من جزأين: أولاً، يتم قياس فترات أنصاف الموجات الموجبة والسالبة بالخطوط:
Htime=pulseln(10,HIGH);
Ltime=pulseln(10,LOW);
ثم يتم حساب الفترة الكاملة في السطر:
Ttime=Htime+Ltime ;
ومن ثم حساب التردد في الخط:
التردد = 1000000/Ttime؛
يعتمد عمل برنامج قياس الجهد على قراءة البيانات من المدخلات التناظرية وحساب نتيجة القياس. يتم تحويل إخراج المنفذ التناظري إلى شكل رقمي بواسطة ADC الخاص بوحدة التحكم الدقيقة. للحصول على النتيجة بوحدات فولت، تحتاج إلى ضربها في 5 (في الجهد المرجعي، أي في جهد إمداد المتحكم الدقيق) والقسمة على 1024.
من أجل أن تكون قادرًا على قياس الفولتية الأكبر من 5 فولت، أو بالأحرى، أكبر من جهد إمداد المتحكم الدقيق، لأن الجهد الفعلي عند خرج المثبت 5 فولت على لوحة ARDUINO UNO قد يختلف عن 5 فولت، وعادةً ما يكون أقل قليلاً، تحتاج إلى استخدام مقسمات مقاومة تقليدية عند الإدخال. يوجد هنا مقسم جهد عبر المقاومات R5 و R4.
بالإضافة إلى ذلك، يلعب استخدام المحول دورًا، وكذلك الفرق بين قيمة الجهد المباشر والجهد المتردد. لذلك، يتم إضافة عامل القسمة الأصلي وهو 0.016. تتم قراءة البيانات من المنفذ التناظري في السطر:
vout=analogRead(analogInput);
ثم يتم حساب الجهد الفعلي مع الأخذ في الاعتبار نسبة تقسيم مقسم جهد الدخل:
فولت=فوت*5.0/1024.0/0.016;
في هذا الخط، الرقم 5.0 هو الجهد عند خرج مثبت لوحة ARDUINO UNO. من الناحية المثالية، يجب أن يكون 5 فولت، ولكن لكي يعمل الفولتميتر بدقة، يجب أولاً قياس هذا الجهد.
قم بتوصيل مصدر طاقة 12 فولت وقياس الجهد +5 فولت عند موصل الطاقة باللوحة باستخدام مقياس الفولتميتر الدقيق إلى حد ما. ماذا يحدث، أدخل في هذا السطر بدلاً من 5.0، فمثلاً إذا كان هناك 4.85V، فسيبدو السطر هكذا:
فولت=فوت*4.85/1024.0/0.016;
ثم يتم عرض نتائج القياس على شاشة LCD. يتم إدخال الجهد في السطر الأول من الشاشة والتردد في السطر الثاني. يشار إلى وحدات القياس بـ "V" و"هرتز". أما بالنسبة لقياس التردد، فلا حاجة لأي تعديل على الإطلاق. ولكن لقياس الجهد، تحتاج إلى معايرة الجهاز وفقًا للمعيار عن طريق ضبط المقاوم R5.
كارافكين ف.رك-10-17.
المدخلات التناظرية للوحة اردوينو.
تحتوي لوحة Arduino UNO على 6 مدخلات تناظرية مصممة لقياس إشارات الجهد. سيكون من الأصح أن نقول أن دبابيس اللوحة الستة يمكن أن تعمل في كل من وضعي الإخراج المنفصل والإدخال التناظري.
يتم ترقيم هذه الأطراف من 14 إلى 19. وقد تم تكوينها في البداية كمدخلات تناظرية ويمكن الوصول إليها باستخدام الأسماء A0-A5. ويمكن تهيئتها لتعمل كمخرجات منفصلة في أي وقت.
pinMode(A3, OUTPUT); // ضبط وضع الإخراج المنفصل لـ A3
الكتابة الرقمية (A3، LOW)؛ // ضبط الإخراج A3 منخفضًا
للعودة إلى وضع الإدخال التناظري:
pinMode(A3, INPUT); // ضبط وضع الإدخال التناظري لـ A3
المدخلات التناظرية ومقاومات السحب.
يتم توصيل مقاومات السحب إلى أطراف الإدخال التناظرية، وكذلك إلى المسامير المنفصلة. يتم تشغيل هذه المقاومات باستخدام الأمر
الكتابة الرقمية (A3، عالية)؛ // قم بتشغيل المقاوم السحب لإدخال A3
يجب تطبيق الأمر على الدبوس الذي تم تكوينه في وضع الإدخال.
يجب أن نتذكر أن المقاوم يمكن أن يؤثر على مستوى إشارة الدخل التناظرية. سيؤدي التيار القادم من مصدر الطاقة 5 فولت، عبر مقاومة السحب، إلى انخفاض الجهد عبر المقاومة الداخلية لمصدر الإشارة. لذلك من الأفضل فصل المقاوم.
محول تناظري إلى رقمي للوحة Arduino.
يتم إجراء قياس الجهد الفعلي عند المدخلات بواسطة محول تناظري إلى رقمي (ADC) مع مفتاح لـ 6 قنوات. تبلغ دقة ADC 10 بتات، وهو ما يتوافق مع الكود عند إخراج المحول 0...1023. لا يزيد خطأ القياس عن وحدتين من الرقم الأقل أهمية.
للحفاظ على أقصى قدر من الدقة (10 بت)، من الضروري ألا تتجاوز المقاومة الداخلية لمصدر الإشارة 10 كيلو أوم. يعد هذا المطلب مهمًا بشكل خاص عند استخدام مقسمات المقاومة المتصلة بالمدخلات التناظرية للوحة. لا يمكن أن تكون مقاومة مقاومات المقسم عالية جدًا.
وظائف برنامج الإدخال التناظري.
قراءة تناظرية دولية (منفذ)
يقرأ قيمة الجهد عند المدخل التناظري المحدد. يتراوح جهد الإدخال من 0 إلى مستوى الجهد المرجعي (غالبًا 5 فولت) ويتحول إلى رمز من 0 إلى 1023.
مع الجهد المرجعي 5 فولت، تكون الدقة 5 فولت / 1024 = 4.88 مللي فولت.
يستغرق التحويل حوالي 100 ميكروثانية.
int inputCod; // كود جهد الإدخال
تعويم جهد الإدخال؛ // جهد الإدخال في V
inputCod=analogRead(A3); // قراءة الجهد عند الإدخال A3
inputVoltage= ((float)inputCod * 5. / 1024.); // تحويل الكود إلى جهد (V)
مرجع تناظري باطل (نوع)
يضبط الجهد المرجعي لـ ADC. فهو يحدد الحد الأقصى لقيمة جهد الإدخال التناظري الذي يمكن لـ ADC تحويله بشكل صحيح. تحدد قيمة الجهد المرجعي أيضًا عامل تحويل الكود إلى الجهد:
جهد الإدخال = رمز ADC * الجهد المرجعي / 1024.
يمكن أن تأخذ وسيطة النوع القيم التالية:
تناظري(INTERNAL); // الجهد المرجعي هو 1.1 فولت
الفولتميتر ثنائي القناة على اردوينو.
كمثال لاستخدام وظائف الإدخال التناظرية، دعونا ننشئ مشروعًا لفولتميتر رقمي بسيط على الأردوينو. يجب على الجهاز قياس الفولتية عند مدخلين تناظريين للوحة، ونقل القيم المقاسة إلى الكمبيوتر عبر منفذ تسلسلي. باستخدام هذا المشروع كمثال، سأعرض مبادئ إنشاء أنظمة بسيطة للقياس وجمع المعلومات.
لنقرر أن الفولتميتر يجب أن يقيس الجهد في حدود 0...20 فولت على الأقل ونقوم بتطوير دائرة لتوصيل مدخلات الفولتميتر بلوحة Arduino UNO.
إذا قمنا بضبط الجهد المرجعي على 5 فولت، فإن المدخلات التناظرية للوحة ستقيس الجهد ضمن 0...5 فولت. ونحن بحاجة إلى 0...20 فولت على الأقل. وهذا يعني أننا بحاجة إلى استخدام مقسم الجهد.
يرتبط الجهد عند مدخلات ومخرجات المقسم بالعلاقة:
Uoutput = (Uinput / (R1 + R2)) * R2
نسبة الإرسال:
K = Uoutput / Uinput = R2 / (R1 + R2)
نحن بحاجة إلى نسبة نقل 1/4 (20 فولت * 1/4 = 5 فولت).
للحفاظ على أقصى قدر من الدقة (10 بت)، من الضروري ألا تتجاوز المقاومة الداخلية لمصدر الإشارة 10 كيلو أوم. لذلك نختار المقاومة R2 وتساوي 4.22 كيلو أوم. نحسب مقاومة المقاوم R1.
0.25 = 4.22 / (R1 + 4.22)
R1 = 4.22 / 0.25 – 4.22 = 12.66 كيلو أوم
لقد وجدت مقاومات بمقاومة 15 كيلو أوم بأقرب قيمة. مع المقاومات R1 = 15 كيلو أوم و R2 = 4.22:
5 / (4.22 / (15 + 4.22)) = 22.77 فولت.
ستبدو دائرة الفولتميتر المعتمدة على الأردوينو بهذا الشكل.
يتم توصيل مجزئين للجهد بالمدخلين التناظريين A0 وA1. تشكل المكثفات C1 وC2، مع مقاومات المقسم، مرشحات تمرير منخفض تعمل على إزالة الضوضاء عالية التردد من الإشارات.
لقد قمت بتجميع هذه الدائرة على اللوح.
لقد قمت بتوصيل المدخل الأول للفولتميتر بمصدر طاقة منظم، والثاني بمصدر طاقة 3.3 فولت للوحة Arduino. لمراقبة الجهد، قمت بتوصيل الفولتميتر بالمدخل الأول. كل ما تبقى هو كتابة البرنامج.
برنامج لقياس الجهد باستخدام لوحة الاردوينو.
الخوارزمية بسيطة. ضروري:
سأعطيك مخططًا كاملاً للبرنامج على الفور.
// برنامج قياس الجهد
// على المدخلات التناظرية A0 وA1
#يشمل
زمن فترة القياس
#تعريف R1 15. // مقاومة المقاوم R1
#تعريف R2 4.22 // مقاومة المقاوم R2
تعويم u1، u2؛ // الفولتية المقاسة
الإعداد باطل() (
Serial.begin(9600); //
MsTimer2::start(); // تمكين المقاطعة
}
حلقة فارغة() (
// الفترة 500 مللي ثانية
إذا (timeCount >= MEASURE_PERIOD) (
timeCount= 0;
//
// قراءة رمز القناة 2 والتحويل إلى الجهد
u2= ((float)analogRead(A1)) * 5. / 1024. / R2 * (R1 + R2);
// نقل البيانات عبر المنفذ التسلسلي
Serial.print("U1 = "); Serial.print(u1, 2);
Serial.print("U2 ="); Serial.println(u2, 2);
}
}
// معالجة المقاطعة 1 مللي ثانية
مقاطعة باطلة ()
timeCount++;
}
اسمحوا لي أن أشرح السطر الذي يتم فيه تحويل رمز ADC إلى جهد:
// قراءة رمز القناة 1 وتحويلها إلى الجهد
u1= ((float)analogRead(A0)) * 5. / 1024. / R2 * (R1 + R2);
لنقم بتحميل البرنامج على اللوحة ونطلق شاشة المنفذ التسلسلي.
يُظهر شريطان قيد التشغيل قيم الفولتية المقاسة. كل شيء يعمل.
قياس متوسط قيمة الإشارة.
لنقم بتوصيل القناة الأولى لجهاز الفولتميتر الخاص بنا بمصدر جهد بمستوى تموج عالٍ. سوف نرى هذه الصورة على الشاشة.
ترتعش قيم الجهد للقناة الأولى على شاشة الشاشة وتقفز باستمرار. وقراءات جهاز قياس الفولتميتر مستقرة تمامًا. وذلك لأن الفولتميتر المرجعي يقيس متوسط قيمة الإشارة، بينما تقوم لوحة الاردوينو بقراءة العينات الفردية كل 500 مللي ثانية. وبطبيعة الحال، فإن اللحظة التي يقرأ فيها ADC تقع في نقاط مختلفة في الإشارة. وعلى مستوى عال من النبضات، تكون السعة عند هذه النقاط مختلفة.
بالإضافة إلى ذلك، إذا تمت قراءة الإشارة في عينات متفرقة منفصلة، فإن أي ضوضاء نبضية يمكن أن تؤدي إلى خطأ كبير في القياس.
الحل هو أخذ عدة عينات متكررة ومتوسط القيمة المقاسة. لهذا:
مشكلة من كتاب الرياضيات للصف الثامن. فيما يلي رسم تخطيطي للبرنامج، وهو عبارة عن فولتميتر متوسط القيمة ثنائي القناة.
// برنامج قياس الجهد المتوسط
// على المدخلات التناظرية A0 وA1
#يشمل
#تعريف القياس_الفترة 500 // زمن فترة القياس
#تعريف R1 15. // مقاومة المقاوم R1
#تعريف R2 4.22 // مقاومة المقاوم R2
int timeCount; // عداد الوقت
طويلة sumU1، sumU2؛ // المتغيرات لجمع رموز ADC
متوسط طويل U1، متوسط U2؛ // مجموع رموز ADC (متوسط القيمة * 500)
العلم المنطقي جاهز؛ // مؤشر جاهزية بيانات القياس
الإعداد باطل() (
Serial.begin(9600); // تهيئة المنفذ، السرعة 9600
MsTimer2::set(1, timerInterupt); // مقاطعات الموقت، الفترة 1 مللي ثانية
MsTimer2::start(); // تمكين المقاطعة
}
حلقة فارغة() (
إذا (flagReady == صحيح) (
flagReady= false;
// التحويل إلى الجهد ونقله إلى الكمبيوتر
Serial.print("U1 = ");
Serial.print((float)avarageU1 / 500. * 5. / 1024. / R2 * (R1 + R2)، 2)؛
Serial.print("U2 =");
Serial.println((float)avarageU2 / 500. * 5. / 1024. / R2 * (R1 + R2)، 2)؛
}
}
// معالجة المقاطعة 1 مللي ثانية
مقاطعة باطلة ()
timeCount++; // +1 عداد متوسط العينات
sumU1+=analogRead(A0); // جمع رموز ADC
sumU2+=analogRead(A1); // جمع رموز ADC
// التحقق من عدد العينات المتوسطة
إذا (timeCount >= MEASURE_PERIOD) (
timeCount= 0;
avarageU1= sumU1; // متوسط القيمة الزائدة
avarageU2= sumU2; // متوسط القيمة الزائدة
مجموعU1= 0;
sumU2= 0;
flagReady= true; // نتيجة قياس الإشارة جاهزة
}
}
تمت إضافة /500 إلى صيغة تحويل كود ADC إلى جهد - عدد العينات. قم بتحميل وتشغيل مراقب المنفذ (Cntr+Shift+M).
الآن، حتى مع وجود مستوى كبير من النبض، تتغير القراءات بمقدار أجزاء من المئات. هذا فقط لأن الجهد غير مستقر.
ويجب اختيار عدد العينات مع الأخذ بعين الاعتبار:
المصدر الرئيسي للتداخل في الإشارات التناظرية هو شبكة 50 هرتز. ولذلك، فمن المستحسن اختيار متوسط الوقت الذي يكون مضاعفًا لـ 10 مللي ثانية - زمن نصف الدورة لشبكة ذات تردد 50 هرتز.
تحسين العمليات الحسابية.
تستهلك حسابات النقطة العائمة ببساطة موارد وحدة التحكم الدقيقة 8 بت. تتطلب أي عملية للفاصلة العائمة إلغاء تطبيع الجزء العشري، وتشغيل النقطة الثابتة، وتطبيع الجزء العشري، وتصحيح الترتيب... وجميع العمليات بأرقام 32 بت. لذلك، من الضروري تقليل استخدام حسابات الفاصلة العائمة. سأخبرك بكيفية القيام بذلك في الدروس التالية، ولكن دعونا على الأقل نقوم بتحسين حساباتنا. سيكون التأثير كبيرا.
في برنامجنا، تتم كتابة تحويل كود ADC إلى جهد على النحو التالي:
(تعويم) متوسطU1 / 500. * 5. / 1024. / R2 * (R1 + R2)
هناك الكثير من الحسابات هنا، جميعها باستخدام النقطة العائمة. لكن معظم الحسابات هي عمليات ذات ثوابت. جزء من الخط:
/ 500. * 5. / 1024. / ر2 * (ر1 + ر2)
(تعويم) متوسطU1 * 0.00004447756
يتعرف المترجمون الأذكياء أنفسهم على الحسابات ذات الثوابت ويحسبونها في مرحلة التجميع. لدي سؤال حول مدى ذكاء مترجم Andruino. قررت التحقق من ذلك.
لقد كتبت برنامجًا قصيرًا. فهو ينفذ دورة مكونة من 10000 تمريرة ثم ينقل وقت تنفيذ تلك الدورات الـ 10000 إلى الكمبيوتر. أولئك. فهو يسمح لك بمعرفة وقت تنفيذ العمليات الموضوعة في نص الحلقة.
// التحقق من تحسين الحساب
كثافة العمليات س= 876;
تعويم ذ؛
عدد صحيح غير موقعة؛
وقت طويل غير موقع الحالي، الوقت السابق؛
الإعداد باطل() (
Serial.begin(9600);
}
حلقة فارغة() (
العد++;
// y= (float)x / 500. * 5. / 1024. / 4.22 * (15. + 4.22);
// ص = (تعويم)x * 0.00004447756 ;
إذا (العدد >= 10000) (
العد= 0;
timeCurrent= ميلي();
Serial.println(timeCurrent - timePrev);
timePrev= timeCurrent;
}
}
في الخيار الأول، عندما يتم التعليق على عمليات الفاصلة العائمة في الحلقة وعدم تنفيذها، ينتج البرنامج نتيجة تبلغ 34 مللي ثانية.
أولئك. يتم إكمال 10000 حلقة فارغة في 34 مللي ثانية.
ثم فتحت السطر:
ص= (تعويم)x / 500. * 5. / 1024. / 4.22 * (15. + 4.22);
يكرر حساباتنا. نتيجة 10000 تمريرة في 922 مللي ثانية أو
(922 - 34) / 10000 = 88.8 ميكروثانية.
أولئك. يستغرق هذا السطر من حسابات النقطة العائمة 89 ميكروثانية لإكماله. اعتقدت أنه سيكون هناك المزيد.
الآن أغلقت هذا السطر بتعليق وفتحت السطر التالي، مضروبًا في ثابت محسوب مسبقًا:
ص= (تعويم)x * 0.00004447756 ;
نتيجة 10000 تمريرة في 166 مللي ثانية أو
(166 - 34) / 10000 = 13.2 ميكروثانية.
نتيجة مذهلة. لقد وفرنا 75.6 ميكروثانية لكل سطر. لقد أكملناها أسرع بنحو 7 مرات. لدينا سطرين من هذا القبيل ولكن يمكن أن يكون هناك المزيد منهم في البرنامج.
الخلاصة - يجب إجراء العمليات الحسابية ذات الثوابت بنفسك على الآلة الحاسبة واستخدامها في البرامج كمعاملات جاهزة. لن يقوم مترجم Arduino بحسابها في مرحلة التجميع. وفي حالتنا يجب أن نفعل هذا:
#تعريف ADC_U_COEFF 0.00004447756 // عامل تحويل رمز ADC إلى الجهد
Serial.print((float)avarageU1 * ADC_U_COEFF, 2);
الخيار الأمثل للأداء هو نقل رمز ADC إلى الكمبيوتر، ومعه جميع حسابات الفاصلة العائمة. وفي هذه الحالة يجب أن يقوم برنامج متخصص على الكمبيوتر باستقبال البيانات. لن تعمل شاشة المنفذ من Arduino IDE.
سأتحدث عن طرق أخرى لتحسين برامج Arduino في الدروس المستقبلية حسب الحاجة. ولكن بدون حل هذه المشكلة، من المستحيل تطوير برامج معقدة على متحكم 8 بت.
ظهر درس آخر على الموقع (
اردوينويحتوي على العديد من المدخلات التناظرية، والتي يمكنك من خلالها قياس معلمات الكميات التناظرية. يمكن أن يكون هذا الجهد والتيار والمقاومة ودرجة الحرارة والضوء وما إلى ذلك. في بعض الحالات، قد تكون هناك حاجة إلى أجهزة استشعار خاصة لتحويل الكميات الفيزيائية إلى إشارات كهربائية. سأتحدث اليوم عن استخدام واختبار أداء المحول التناظري إلى الرقمي (ADC) اردوينو. سأقوم بإجراء الاختبار باستخدام اللوحة الأصلية اردوينو ميجا 2560، والذي يعتمد على متحكم دقيق ATMega 2560 يعمل بتردد 16 ميجاهرتز. متحكم ATMega328، والتي يرتكزون عليها اردوينو أونوو اردوينو نانو، تعمل أيضًا بتردد 16 ميجاهرتز، لذلك من المرجح أن يكون كل ما سبق صحيحًا بالنسبة لهذه اللوحات واللوحات المماثلة.
دعونا نرى كم من الوقت يستغرق التحويل من تمثيلي إلى رقمي باستخدام الوظيفة القياسية قراءة تناظرية.
لتحديد بداية ونهاية التحويل، سأستخدم الدبوس 12 كعلامة. أولا، دعونا نكرر التجربة التي وصفتها في المقال. سوف نقوم بتغيير مستوى الجهد على الدبوس الرقمي 12 بين الحالات قليلو عالي. لنقاء التجربة سأضعها بالداخل حلقةدورة لا نهاية لها.
يبدو المخطط الذي يطبق التبديل البسيط على الدبوس الرقمي 12 كما يلي:
إعداد باطل () (DDRB = B01000000؛ // ضبط الدبوس 12 على وضع الإخراج) حلقة باطلة () (بينما (1) ( PORTB = B01000000؛ // ضبط الدبوس 12 على الحالة العالية PORTB = B00000000؛ // ضبط الدبوس 12 على الحالة منخفضة ))
دعونا نستخدم راسم الذبذبات وننظر إلى معلمات التوقيت لهذا البرنامج:
من هذا يمكننا أن نرى أن وقت تبديل حالة الدبوس يستغرق 62 نانو ثانية (مدة النبضة الإيجابية).
الآن دعونا نغير الرسم قليلاً ونضيف وظيفة لقراءة الإشارة التناظرية بين المفاتيح قراءة تناظريةعلى دبوس التناظرية 3:
int AnalogPin = 3; // الإدخال التناظري intanalogValue = 0; إعداد باطل () (DDRB = B01000000؛ // ضبط الدبوس 12 على وضع الإخراج) حلقة باطلة () (بينما (1) ( PORTB = B01000000؛ // ضبط الدبوس 12 على الحالة العاليةanalogValue =analogRead(analogPin);//قراءة الإشارة التناظرية PORTB = B00000000؛ // ضبط الدبوس 12 على LOWanalogValue =analogRead(analogPin);
إنت التناظرية = 3 ؛ // إدخال دبوس التناظرية قيمة التناظرية int = 0 ؛ // قيمة الإشارة التناظرية الإعداد باطل() DDRB = B01000000 ; // اضبط الدبوس 12 على وضع الإخراج حلقة فارغة() بينما(1) بورتب = B01000000 ; // اضبط الدبوس 12 على الحالة العالية // قراءة الإشارة التناظرية بورتب = B00000000 ; // قم بتعيين الدبوس 12 على الحالة المنخفضة AnalogValue =analogRead(analogPin); // قراءة الإشارة التناظرية |
سيبدو الآن مخطط ذبذبات الإشارة على الدبوس الرقمي 12 كما يلي:
مدة التبديل 62 ns وزمن العودة الدوري لبدء البرنامج 124 ns لا تتجاوز خطأ القياس على هذا المقياس الزمني ويمكننا إهمال هذه الفواصل الزمنية. من هذا يمكننا أن نرى أن الوقت المستغرق في التحويل من التناظري إلى الرقمي يبلغ حوالي 112 ميكروثانية، وبالتالي فإن الحد الأقصى لمعدل أخذ العينات عند استخدام الوظيفة قراءة تناظريةلا يتجاوز 8.9 كيلو هرتز.
مساوئ الاستخدام قراءة تناظريةهو ذلك أيضا اردوينولا يمكن تنفيذ تعليمات برمجية أخرى أثناء انتظار نتيجة التحويل.
لأن ATMega2560لا يستخدم نواة المعالج عند التقاط الإشارات التناظرية، فهو مضيعة لقدرات المعالجة. خاصة عندما نحتاج إلى أخذ عينات مستمرة من الإشارة. يمكن تنفيذ هذا أخذ العينات بطريقة أكثر تعقيدًا قليلاً باستخدام المقاطعات. نظرًا لعدم وجود وظيفة مضمنة لتعيين التحويل التناظري باستخدام المقاطعات، يجب معالجة السجلات المرتبطة بـ ADC يدويًا.
أخذ العينات لمرة واحدة
أخذ العينات لمرة واحدة هو في الواقع ما اردوينويفعل عند استدعاء وظيفة قراءة تناظرية. لن نكون قادرين على الحصول على فوائد كبيرة من خلال تنفيذ أخذ العينات المخصصة من خلال وسائل أخرى. نظرًا لأنه قبل بدء ADC، يتم فحص علامة جاهزية ADC أولاً، وهذا يعني أن التحقق من العلامة في الحلقة لا يختلف عما يفعله Arduino.
أخذ العينات المستمر
من الأفكار الجيدة عند أخذ عينات الإشارة بشكل مستمر هو استخدام المقاطعات. المتحكمات الدقيقة ATMega328و ATMega2560يمكن تحويله إلى وضع أخذ العينات المستمر ( وضع التشغيل الحر). في هذا الوضع، يبدأ ADC تلقائيًا بعد اكتمال المعالجة السابقة. في كل مرة ينتهي التحويل بإنشاء مقاطعة، والتي تستدعي وظيفة معالج المقاطعة ISR (ADC_vect)، حيث يمكن قراءة ومعالجة نتيجة التحويل من التناظري إلى الرقمي.
لتمكين وضع أخذ العينات المستمر، يجب تعيين ثلاثة سجلات: أدموكس, أدكسراو ADCSRB. يمكن العثور على وصف تفصيلي لهذه السجلات في الأدلة الفنية للمتحكم الدقيق.
مرجع داخلي 1.1 فولت وقناة إدخال تناظرية أدك3يتم اختيارها باستخدام أدموكس. يتم ضبط تردد الساعة باستخدام أدكسراوفي مثالنا تم تعيينه كمقسوم على ÷16. يستغرق التحويل التناظري الواحد 13 فترة زمنية. يمكن حساب تردد أخذ العينات بناءً على تردد ساعة المتحكم الدقيق: 16 ميجا هرتز/(16*13) ≈ 77 كيلو هرتز. عن طريق تحديد بت التسجيل 6 أدكسرافي حالة عالي، يبدأ أخذ العينات المستمر.
تتم قراءة نتيجة التحويل من التناظري إلى الرقمي في وظيفة خدمة المقاطعة ISR (ADC_vect). وبما أن النتيجة يبلغ طولها 10 بتات، فإنها مقسمة إلى سجلين ADCLو ADCH، حجم كل بايت واحد. لقراءة قيمة بشكل صحيح، تحتاج أولاً إلى قراءة قيمة التسجيل ADCL، ومن ثم التسجيل ADCH.
مثال على رسم يتم فيه نسخ النتيجة التي تم الحصول عليها من ADC إلى متغير عدد صحيح القيمة التناظرية:
القيمة التناظرية int = 0; // إعداد قيمة الإشارة التناظرية () (DDRB = B01000000؛ // الدبوس 12 في وضع الإخراج DIDR0 = 0x3F؛ // تعطيل المدخلات الرقمية ADMUX = 0x43؛ // القياس على ADC3، استخدم الجهد المرجعي الداخلي = 1.1 فولت ADCSRA = 0xAC // تمكين ADC، تمكين المقاطعات، المقسوم = 16 ADCSRB = 0x40؛ // تمكين قنوات التيار المتردد MUX، وضع أخذ العينات المنزلق bitWrite(ADCSRA, 6, 1); ) /*** إجراء معالجة مقاطعة ADC ***/ ISR(ADC_vect) ( PORTB = B00000000; // تم ضبط الطرف 12 على الحالة المنخفضةanalogValue = ADCL; // احفظ البايت المنخفض لنتيجة ADC تمثيلية += ADCH<< 8; // сохраняем старший байт АЦП PORTB = B01000000; // пин 12 переводим в состояние HIGH }
قيمة التناظرية int = 0 ؛ // قيمة الإشارة التناظرية الإعداد باطل() DDRB = B01000000 ; // الدبوس 12 في وضع الإخراج ديدر0 = 0x3F ; // تعطيل المدخلات الرقمية أدموكس = 0x43؛ // القياس على ADC3، استخدم الجهد المرجعي الداخلي = 1.1 فولت أدكسرا = 0xAC ; // تمكين ADC، تمكين المقاطعات، المقسوم = 16 أدكسرب = 0x40؛ // تمكين قنوات MUX AC، ووضع أخذ العينات المنزلق bitWrite(ADCSRA, 6, 1); // ابدأ التحويل عن طريق تعيين البت 6 (=ADSC) إلى ADCSRA sei(); // قم بتعيين علامة المقاطعة حلقة فارغة() /*** إجراء معالجة مقاطعة ADC ***/ ISR (ADC_vect) بورتب = B00000000 ; // تم تبديل الدبوس 12 إلى الحالة المنخفضة AnalogValue = ADCL ; // احفظ البايت المنخفض لنتيجة ADC قيمة تمثيلية + = ADCH<< 8 ; // احفظ البايت العالي لـ ADC بورتب = B01000000 ; // تم ضبط الدبوس 12 على الحالة العالية |
نتيجة البرنامج على شاشة الذبذبات:
لقياس وقت التنفيذ، نترجم حالة الدبوس إلى قليل، ثم نقرأ ADC، وبعد ذلك نحدد المستوى الأعلى مرة أخرى. يستغرق استدعاء معالج المقاطعة وقتًا، ولهذا السبب يكون الجزء الإيجابي من الفترة طويلًا جدًا.
دورة حلقةأصبح الآن مجانيًا تمامًا ويمكن استخدامه لمعالجة أي كود.
لقياس إشارة تناظرية، يجب أن يكون لدينا مستوى جهد معين للمقارنة به. في المتحكمات الدقيقة ATMega328و ATMega2560، والتي تستخدم في اردوينوالجهد المرجعي هو أيضًا أقصى جهد يمكن قياسه. يتم دائمًا قياس الفولتية بالنسبة للأرض. في اردوينوهناك ثلاثة مصادر محتملة للجهد المرجعي: AVcc- الذي يتصل بخط الطاقة الرقمي 5 فولت، الجهد الداخلي 1.1 فولت (ل اردوينو ميجاخيار آخر هو 2.56 فولت) ومصدر جهد مرجعي خارجي. نظرًا لأن قياسات جهد الدخل يتم إجراؤها بالنسبة إلى الجهد المرجعي، فإن التقلبات في الجهد المرجعي ستؤثر على النتيجة.
يمكن ضبط الجهد المرجعي باستخدام الوظيفة أو باستخدام البتات ردتفي السجل أدموكس.
مقياس الفولت AVcc
AVccهو الجهد المرجعي الافتراضي ويستخدم عندما تعتمد الفولتية المقاسة بشكل مباشر على جهد مصدر الطاقة. على سبيل المثال، في الحالة التي تحتاج فيها إلى قياس الجهد في نصف جسر المقاوم، كما هو موضح في الشكل أدناه.
استخدام جهد مرجعي 5 فولت عند قياس المقاومة في نصف الجسر
إذا انخفض جهد مصدر الطاقة لسبب ما، فإن الجهد عند النقطة التي تتصل فيها المقاومتان سينخفض بشكل متناسب. نظرًا لحقيقة أن الجهد المرجعي وجهد الإدخال يتغيران بشكل متناسب، فإن نتيجة ADC ستظل كما هي.
الجهد المرجعي الداخلي 1.1 فولت
استخدم الجهد المرجعي الداخلي 1.1 فولت لإجراء قياسات دقيقة للجهود الخارجية. يعتبر الجهد المرجعي 1.1 فولت أكثر استقرارًا ولا يتأثر بالتغيرات في جهد الإمداد أو درجة الحرارة. وبهذه الطريقة، يمكن إجراء قياسات القيمة المطلقة. في اردوينو ميجايتوفر أيضًا جهد مرجعي 2.56 فولت. يستخدم المثال أدناه جهدًا مرجعيًا 1.1 فولت ومقسم جهد 10:1 لقياس جهد خارجي يتراوح من 0 إلى 11 فولت.
استخدام الجهد المرجعي الخارجي أو الجهد الداخلي 1.1 فولت عند قياس الفولتية الخارجية
وفقا للدليل الفني لوحدة التحكم الدقيقة ATMega328و ATMega2560الجهد المرجعي هو 1.1 ± 0.1 فولت. وهذا تسامح كبير إلى حد ما. قياس الجهد المرجعي للجهاز قيد الاختبار اردوينو ميجاكان 2560 هو 1.089 فولت عند درجة حرارة محيطة تبلغ 21 درجة مئوية وكانت درجة حرارة علبة المتحكم الدقيق 29 درجة مئوية.
لقد قمت بتبريد علبة وحدة التحكم الدقيقة باستخدام رذاذ تبريد غير موصل الاتصال الكيميائي تجميد 75/200إلى درجة حرارة -18 درجة مئوية، في حين انخفض الجهد المرجعي المقاس إلى 1.084 فولت. وهكذا، كان انجراف درجة الحرارة حوالي 100 جزء في المليون(جزء في المليون)/درجة مئوية.
رسم الاختبار:
int AnalogPin = 3; // إدخال دبوس التناظرية إعداد الفراغ () (analogReference(INTERNAL1V1)؛ // تحديد الجهد المرجعي الداخلي 1.1V Serial.begin(9600)؛) حلقة باطلة () (intanalogValue =analogRead(analogPin)؛// اقرأ القيمة على الإدخال التناظري Serial.println (analogValue) // إخراجه إلى المنفذ التسلسلي تأخير (300)؛
إنت التناظرية = 3 ؛ // إدخال دبوس التناظرية الإعداد باطل() // حدد الجهد المرجعي الداخلي 1.1 فولت مسلسل. تبدأ (9600)؛ حلقة فارغة() // اقرأ القيمة عند الإدخال التناظري مسلسل. println(analogValue); // إخراجه إلى المنفذ التسلسلي تأخير (300)؛ |
تم توصيل الطرف التناظري 3 بمصدر جهد 0.545 فولت. عند درجة حرارة 29 درجة مئوية، يجب أن تكون النتيجة: (0.545/1.089) * 1024 = 512 (القيمة الفعلية التي تم الحصول عليها هي 511). عند درجة حرارة -18 درجة مئوية يجب أن تكون (0.545/1.084) * 1024 = 515 (القيمة الفعلية التي تم الحصول عليها هي 515 أيضًا).
كما أظهرت التجربة، فإن انحراف درجة الحرارة صغير ولقياسات دقيقة عند الاستخدام اردوينوفهو يحتاج إلى معايرته بسبب عدم اليقين الكبير في الجهد المرجعي الإجمالي والذي يبلغ حوالي 10%.
إحدى طرق قياس مستوى الضوضاء هي تحديد انتشار القيم التي تم الحصول عليها من ADC. للقيام بذلك، نطبق جهدًا ثابتًا ثابتًا على أحد المدخلات التناظرية ونستخدم القيم المحولة باستخدام ADC لإنشاء رسم بياني.
دائرة الاختبار
الدائرة في الشكل أدناه توفر جهد الاختبار اردوينو.
الدائرة التي توفر جهدًا مستمرًا منظمًا لمدخل Arduino التناظري
ينتج مصدر الطاقة المنظم المستقر جهدًا قدره 0.55 فولت، وهو نصف الجهد المرجعي البالغ 1.1 فولت. في الصورة أدناه، يمكنك أن ترى أن مقياس الفولتميتر المدمج في مصدر الطاقة المنظم الخاص بي يكذب بوضوح، ويظهر جهد خرج قدره 0.4 فولت .
يتم أيضًا تصفية الإشارة باستخدام سلسلة ر1, ج1, ج2ومتصلة من خلال المقاوم R2، وجود مقاومة 100 أوم للمدخل التناظري أ3 اردوينو. الأرض متصلة بالدبوس جي ان دي اردوينو.
مكون الضوضاء عند الإدخال اردوينوعلى النحو التالي:
يوضح هذا أن الجذر التربيعي لقيمة مربع سعة المكون المتناوب للجهد المقاس عند مدخل ADC اردوينوليست سوى بضعة ميلي فولت.
بينينج
متحكم ADC ATMega328و ATMega2560دقة 2 10 = 1024 بت. فكرة binning هي حساب تكرار ملاحظة قيمة معينة. يتم إنشاء مصفوفة تحتوي على 1024 قيمة، تسمى الصناديق، والتي تمثل كل قيمة من قيم ADC المحتملة. نظرًا لأن الذاكرة المتوفرة محدودة، فلا يمكن إنشاء سوى صناديق بحجم البايت. وبالتالي فإن عدد العينات يقتصر على 255.
البرامج
دعونا نختبر الضوضاء باستخدام الوظيفة قراءة تناظرية، ثم استخدم المقاطعات. يقوم البرنامجان بنفس الشيء بشكل أساسي: حيث يقومان بتحديد مصفوفة تتكون من 1024 خانة. فى مهمة يثبتتتم تهيئة جميع الصناديق إلى الصفر ويتم تحديد جهد مرجعي قدره 1.1 فولت.
يقوم كلا البرنامجين بإجراء 10000 قراءة وهمية للقيمة التناظرية. بعد ذلك، يبدأ التجميع، ولكل نتيجة ADC، تتم زيادة الحاوية المقابلة بمقدار واحد. إذا وصلت إحدى خانات 1024 إلى الحد الأقصى وهو 255 قيمة، يتوقف أخذ العينات ويتم إرسال جميع قيم 1024 خانة إلى الكمبيوتر.
رمز المثال لدمج القيم المقاسة باستخدام الوظيفة قراءة تناظرية:
إظهار/إخفاء الرمز
int AnalogPin = 3; // إدخال الدبوس التناظري int sendStatus = 0; // حالة النقل int startDelay = 0; قيمة البايت؛ // قيم الحاوية إعداد باطلة () (تناظرية (INTERNAL1V1)؛ // حدد الجهد المرجعي 1.1 فولت لـ (int i=0; i<=1023; i++) valueBin[i] = 0; // очищаем бины Serial.begin(9600); Serial.println("Start"); } void loop() { int analogValue = analogRead(analogPin); // выборка аналогового входа if (sendStatus == 0) { // ничего не делаем первые 10000 выборок if (startDelay < 10000) startDelay++; else { valueBin += 1; // увеличиваем значение бина if (valueBin == 255) sendStatus = 1; } } if (sendStatus == 1) { for (int i=0; i<=1023; i++) { // выводим значение бина Serial.print(i); Serial.print("\t"); Serial.println(valueBin[i]); } Serial.println("Done"); sendStatus = 2; } }
إنت التناظرية = 3 ؛ // إدخال دبوس التناظرية إنت سيندستاتوس = 0؛ // حالة نقل int startDelay = 0 ; قيمة البايت [ 1024 ] ; // قيم بن الإعداد باطل() مرجع تناظري(INTERNAL1V1); // حدد الجهد المرجعي 1.1 فولت من أجل (int i = 0؛ i<= 1023 ; i ++ ) valueBin [ i ] = 0 ; // очищаем бины مسلسل. تبدأ (9600)؛ حلقة فارغة() intanalogValue =analogRead(analogPin); // عينة من المدخلات التناظرية إذا (sendStatus == 0) // لا تفعل شيئًا لأول 10000 عينة إذا (startDelay< 10000 ) startDelay ++ ; آخر valueBin[analogValue] + = 1؛ // زيادة قيمة السلة // توقف إذا كانت السلة ممتلئة إذا (valueBin [analogValue] == 255) sendStatus = 1؛ إذا (sendStatus == 1) من أجل (int i = 0؛ i<= 1023 ; i ++ ) // عرض قيمة السلة مسلسل. طباعة (ط)؛ مسلسل. طباعة ("\ ر")؛ مسلسل. println(valueBin[i]); مسلسل. println("تم"); إرسال الحالة = 2 ; |
رمز المثال لربط القيم المقاسة باستخدام المقاطعات:
إظهار/إخفاء الرمز
int sendStatus = 0; // حالة النقل int startDelay = 0; قيمة البايت؛ // قيم الحاوية باطلة الإعداد () (TIMSK0 = 0x00؛ // تعطيل المؤقت (بسبب المقاطعات) DIDR0 = 0x3F؛ // تعطيل المدخلات الرقمية ADMUX = 0xC3؛ // القياس على ADC3، بدون تعديل، الجهد المرجعي الداخلي 1.1V ADCSRA = 0xAC; // تمكين ADC، تمكين المقاطعات، المقسم = 128 ADCSRB = 0x40; // تمكين قنوات MUX الخاصة بـ ADC، وضع أخذ العينات الثابت bitWrite(ADCSRA, 6, 1); عن طريق تعيين البت 6 (=ADSC)) في ADCSRA sei(); // تعيين علامة المقاطعة العامة لـ (int i=0; i<=1023; i++) valueBin[i] = 0; // очищаем бины Serial.begin(9600); Serial.println("Start"); } void loop() { if (sendStatus == 1) { for (int i=0; i<=1023; i++) { // выводим значения бинов Serial.print(i); Serial.print("\t"); Serial.println(valueBin[i]); } Serial.println("Done"); sendStatus = 2; } } /*** Процедура обработки прерывания АЦП ***/ ISR(ADC_vect) { int analogValue = ADCL; // сохраняем младший байт АЦП analogValue += ADCH << 8; // сохраняем старший байт АЦП if (sendStatus == 0) { // ничего не делаем первые 10000 выборок if (startDelay < 10000) startDelay++; else { valueBin += 1; // увеличиваем значение бина if (valueBin == 255) sendStatus = 1; { // останавливаемся, если бин полон } } }
إنت سيندستاتوس = 0؛ // حالة نقل int startDelay = 0 ; قيمة البايت [ 1024 ] ; // قيم بن الإعداد باطل() TIMSK0 = 0x00 ; // تعطيل الموقت (بسبب المقاطعات) ديدر0 = 0x3F ; // تعطيل المدخلات الرقمية أدموكس = 0xC3؛ // قياس على ADC3، دون تعديل، الجهد المرجعي الداخلي. 1.1 فولت أدكسرا = 0xAC ; // تمكين ADC، تمكين المقاطعات، المقسم = 128 أدكسرب = 0x40؛ // تمكين قنوات MUX ADC، وضع أخذ العينات الثابت bitWrite(ADCSRA, 6, 1); // ابدأ التحويل عن طريق تعيين البت 6 (=ADSC) إلى ADCSRA sei(); // قم بتعيين علامة المقاطعة العامة من أجل (int i = 0؛ i<= 1023 ; i ++ ) valueBin [ i ] = 0 ; // очищаем бины مسلسل. تبدأ (9600)؛ مسلسل. println("ابدأ"); حلقة فارغة() إذا (sendStatus == 1) من أجل (int i = 0؛ i<= 1023 ; i ++ ) { // عرض قيم الصندوق مسلسل. مطبعة(أنا) ; مسلسل. مطبعة("\ر") ; مسلسل. println(valueBin[ أنا] ) ; } مسلسل. println("منتهي") ; sendStatus= 2 ; // توقف إذا كانت السلة ممتلئة} } } |
الترددات التي تم اختبارها
تم إجراء الاختبار باستخدام وظيفة القراءة التناظرية وباستخدام وضع أخذ العينات المستمر. وبما أنه في الحالة الأخيرة يمكن تغيير تردد أخذ العينات، فقد تم اختبار أربعة ترددات مختلفة لأخذ العينات، تم تحديدها عن طريق تغيير القيمة في السطر أدكسرا = 0xAC. الترددات التي تم اختبارها: 9.6 كيلو هرتز (تردد الساعة clk÷128)، 19.2 كيلو هرتز ( clk÷64)، 38.4 كيلو هرتز ( clk÷32) و76.9 كيلو هرتز ( clk÷16). تردد أخذ العينات عند استخدام الوظيفة قراءة تناظرية، كما اكتشفنا أعلاه، يساوي تقريبًا 8.9 كيلو هرتز.
نتائج
وكانت النتائج لكلا الطريقتين وترددات أخذ العينات المختلفة متشابهة. تم تقسيم العينات إلى صندوقين وسقطت بعض قيم العينات فقط في الصندوق الثالث. وهذا يعني أن مستوى الضوضاء منخفض جدًا في جميع الحالات.
يتم اختيار المدخلات التناظرية في الخط AnalogPin=نأين نهو رقم الدبوس التناظري أو تغيير بتات اختيار القناة التناظرية موكسفي السجل أدموكس. يجب توخي الحذر بشكل خاص عند استخدام وضع أخذ العينات المستمر: يجب تحديد القناة التناظرية قبل بدء تحويل تناظري جديد. يقوم روتين المقاطعة بتحديد الإدخال التناظري الذي سيتم قراءته في المقاطعة التالية.
للتحقق من مستوى الضوضاء والخطأ عند تبديل المدخلات، تحتاج إلى تغيير طفيف في البرامج المذكورة أعلاه. يتم تطبيق الجهد الثاني على المدخلات التناظرية 5. وبالإضافة إلى ذلك، يتم تجاهل القيم المقاسة كما هو الحال في اختبار الضوضاء.
= 0xC3;كثافة العملياتimport org.analogValue= ADCL;
. . .
نتائج
كلا الجهدين المقاسين يظهران على شكل ذروتين في الرسوم البيانية. يوضح الشكل أدناه رسومًا بيانية لخمسة اختبارات: استخدام الوظيفة قراءة تناظريةأخذ العينات المستمر مع clk÷128، clk÷64، clk÷32 و clk÷16. القيم المقاسة للجهد الأول (نتيجة معالجة ADC = 511) لا تنحرف عن اختبار الضوضاء السابق. القياس لا يزال دقيقا. هناك عدد قليل جدًا من الصناديق المحيطة، مما يعني أن مستوى الضوضاء لم يرتفع.
يُظهر كل من الرسوم البيانية الخمسة منطقتين متعرجتين تمثلان الجهدين المقاسين
تُستخدم أيضًا الرموز التي تنفذ binning لتحليل الدقة وتكرار أخذ العينات. لهذا الاختبار، إلى المدخلات التناظرية اردوينوتم توصيل مولد الوظيفة كما هو موضح في الشكل أدناه.
يوفر مولد الوظيفة جهدًا من الذروة إلى الذروة يبلغ 25 مللي فولت وجهد إزاحة (= متوسط القيمة) يبلغ 0.55 فولت. وفي كل قياس، يتم تحديد تردد الإشارة بحيث يكون تردد أخذ العينات أعلى بمقدار 163 مرة.
تم اختيار الإشارة المثلثية لأن كل قيمة تحدث بشكل متساوٍ عند قياسها. عند تجميع مثل هذه الإشارة، يمكن أن تحتوي كل قيمة بن ذات الحد الأدنى والحد الأقصى لقيم الجهد على نفس عدد التكرارات.
نتائج
أظهرت نتائج الاختبار أن الوظيفة قراءة تناظرية، تعمل بمعدل أخذ عينات منخفض وأخذ العينات المستمر على تردد clk÷128 لها قمة مسطحة إلى حد ما: جميع القيم في النطاق تحدث بنفس عدد التكرارات. ولكن بمعدلات أخذ عينات أعلى ( clk÷64، clk÷32 و clk÷16) تحدث الانخفاضات في منطقة binning ويزداد الوضع سوءًا مع زيادة التكرار.
ارتفاع معدلات أخذ العينات يؤدي إلى الانخفاضات
في الوصف الفني لوحدات التحكم الدقيقة أتميجا
توفر هذه المقالة رسمًا تخطيطيًا مثيرًا للاهتمام لأولئك الذين يحبون التجربة والتجربة اردوينو. إنه يتميز بمقياس فولتميتر رقمي بسيط يمكنه قياس جهد التيار المستمر بأمان في نطاق من 0 إلى 30 فولت. يمكن تشغيل لوحة Arduino نفسها من مصدر قياسي 9 فولت.
كما تعلم، باستخدام مدخلات Arduino التناظرية، يمكنك قياس الجهد من 0 إلى 5 فولت (مع جهد مرجعي قياسي يبلغ 5 فولت). ولكن يمكن توسيع هذا النطاق باستخدام مقسم الجهد.
يقوم المقسم بتقليل الجهد المقاس إلى مستوى مقبول للإدخال التناظري. ثم يقوم الكود المكتوب خصيصًا بحساب الجهد الفعلي.
يكتشف المستشعر التناظري في Arduino الجهد عند المدخل التناظري ويحوله إلى تنسيق رقمي يمكن قراءته بواسطة المتحكم الدقيق. نقوم بتوصيل مقسم الجهد المكون من المقاومات R1 (100K) و R2 (10K) بالمدخل التناظري A0. مع قيم المقاومة هذه، يمكن توفير ما يصل إلى 55 فولت إلى Arduino، حيث أن معامل القسمة في هذه الحالة هو 11، وبالتالي 55V/11 = 5V. للتأكد من أن القياسات آمنة للوحة، فمن الأفضل قياس الجهد في النطاق من 0 إلى 30 فولت.
إذا كانت قراءات العرض لا تتطابق مع قراءات الفولتميتر التي تم التحقق منها، فاستخدم مقياسًا رقميًا متعدد الدقة للعثور على القيم الدقيقة لـ R1 وR2. في هذه الحالة، ستحتاج في الكود إلى استبدال R1=100000.0 وR2=10000.0 بالقيم الخاصة بك. ثم يجب عليك التحقق من مصدر الطاقة عن طريق قياس الجهد الموجود على اللوحة بين 5V وGND. يمكن أن يكون الجهد 4.95 فولت. ثم في الكود vout = (القيمة * 5.0) / 1024.0 تحتاج إلى استبدال 5.0 بـ 4.95. يُنصح باستخدام مقاومات دقيقة لا تزيد نسبة الخطأ فيها عن 1%. تذكر أن الجهد الزائد عن 55 فولت قد يؤدي إلى تلف لوحة الاردوينو!
العناصر المستخدمة: