الأربعاء، 4 مارس 2020

Arduino Voltage Reference اردوينو الجهد المرجعي

اردوينو الجهد المرجعي Arduino Voltage Reference
يوجد مرجع جهد اردوينو (1.1 فولت) مدمج في بعض ميكروكنترولر اردوينو. لدى كل من Uno و Nano واحد ، وعدد قليل من Arduinos الآخرين لديهم.
عادةً ما تقوم بإعداد Arduino ADC باستخدام مزود الطاقة المتحكم كمرجع للجهد (لأنه سهل! وهو الوضع الافتراضي لبرنامج Arduino). المشكلة في ذلك هي أن رقاقة مزود الطاقة ستحدد بعد ذلك دقة قياسك ، بمعنى أنه لن يكون لديك أدنى فكرة إذا كانت دقيقة أو مستقرة مع درجة الحرارة.

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

على سبيل المثال ، يمكن أن يعمل Arduino Uno / Nano من 1V8 إلى 5V5 واستخدام خليتين من AA يسمح بالعمل (ولكن فقط إذا قمت بضبط الساعة على 4MHz - راجع قسم ورقة البيانات 29.3 "درجات السرعة"). يمكنك استخدام مرجع الجهد الداخلي لمراقبة حالة البطارية - بدون مكونات إضافية.
تحاول هذه الصفحة أن تحدد ، بطريقة بسيطة ، ما إذا كان مرجع جهد Arduino يعتبر جيدًا أم لا.


فجوة نطاق الجهد المرجعي

نوع المرجع في ATMega328P هو نوع ذو فجوة نطاق. يستخدم هذا عنصرين ، أحدهما مع معامل درجة الحرارة السلبية والآخر مع معامل درجة حرارة موجبة يلغي تأثيرات درجة الحرارة.
بينما لا تمنحك قراءات الجهد فائقة الدقة في Arduino ، فقد صُممت الدائرة لتكون مستقرة ضد التغيرات في درجات الحرارة والجهد الكهربائي.

يستخدم هذا النوع من تخطيط الدوائر في المراجع الحديثة على سبيل المثال MAX6143. ومع ذلك ، في ATMega328 وما شابه ذلك ، فإن عملية التحكم في تخطيط الرقاقة على السيليكون لم يتم تعريفها جيدًا ولا تستخدم التشذيب بالليزر ، وبالتالي فإن الدقة الأولية السيئة لمرجع جهد Arduino (± 9٪).

يمكنك معرفة كيفية التخلص من هذا الإزاحة لاحقًا في هذه الصفحة.

ملاحظة: إذا كنت تستخدم مرجعًا خارجيًا ، فسيكون قياس ADC أكثر دقة نظرًا لأنك تتحكم في مواصفات الشريحة.
ومع ذلك ، تذكر أن ADC الداخلي في Arduino ليس دقيقًا على أي حال (انظر ورقة بيانات ATMega328: الدقة المطلقة 2LSB (بما في ذلك INL و DNL وأخطاء التقدير والكسب والإزاحة).

تحذير: لا تستخدم مطلقًا مرجعًا للجهد الخارجي وتمكّن في الوقت نفسه المرجع الداخلي - هناك شيء سينكسر!
يستخدم لمرجع الجهد اردوينو
يمكن استخدام مرجع الجهد اردوينو في واحدة من خمس طرق مختلفة:
للكشف عن اللون البني (انظر ورقة البيانات لتمكين).
كقيمة القياس في ADC (تغذية في أحد المدخلات).
كمرجع لقياسات ADC.
كمدخل إلى المقارنة.
قياس درجة الحرارة (يجب أن تستخدم ADC المرجع الداخلي).

براون خارج الكشف

يتيح الكشف عن اللون البني للمعالج تحديد متى انخفض جهد التيار الكهربائي عن عتبة ولكن لم يذهب إلى الصفر تمامًا. يستخدم هذا للإشارة إلى المعالج أن الذاكرة قد تكون مكتوبة بشكل سيء. إنه يوفر طبقة إضافية من الموثوقية لتطبيق ما.
مدخلات إلى ADC
من شأن قياس المرجع عند إدخال ADC أن يتيح معايرة مصدر مرجعي مختلف ، على سبيل المثال العرض (انظر هنا) أو كمقارنة خام مع مدخلات ADC الأخرى (إلا إذا كنت تقوم بمعايرة المرجع أولاً كما هو موضح في هذه الصفحة - وفي هذه الحالة يمكن أن تكون دقيقة للغاية (~ 1٪)).
مرجع ADC
باستخدام مرجع الجهد اردوينو كما كنت تتوقع أن تستخدم!
نصيحة: استخدام مرجع 1V1 يعني أن ADC 10 بت له قيمة LSB ~ 1mV (1.074mV / LSB).
المدخلات المقارنة
باستخدام مرجع الجهد يسمح المقارنة الخام أي يمكنك فقط مقارنة أي جهد الدخل إلى 1V1. نقطة واحدة مثيرة للاهتمام هي أن أي من مدخلات ADC يمكن مقارنتها من قبل المقارنة - وهذا دون استخدام أي مكونات خارجية أخرى. انظر القسم 23.2 من ورقة البيانات المسمى "المدخلات المقارنة التناظرية المضاعفة".

يمكنك طرح السؤال "لماذا تهتم باستخدام المقارنة عندما يمكنك بسهولة حساب النتيجة باستخدام ADC؟" الجواب هو السرعة.

يمكن للمقارن مقارنة فولتين خلال 100 ثانية من النانوثانية في حين أن ADC هو نوع تقريبي متعاقب ويستغرق حوالي 13us لجمع قيمة ADC. يجب استرداد هذه القيمة بواسطة المعالج ، ثم تقوم بمقارنة القيمة بإعداد حد ، مما يتطلب وقتًا أطول بكثير.
قياس الحرارة
نظرًا لأن مرجع جهد Arduino مستقل عن درجة الحرارة ، فيمكن مقارنته بإخراج دائرة تعتمد على درجة الحرارة - دائرة داخل الشريحة. يتيح لك ذلك قياس درجة الحرارة في ATMega328P.

يمكن ضبط عنصر استشعار درجة الحرارة في ADC على أحد مدخلات ADC. تنص ورقة البيانات على أن معامل درجة الحرارة هو 1mV / ° C ولكن الدقة الأولية هي ± 10 ° C بسبب تباين العملية في تصنيع الرقاقة. (انظر القسم 24.8 من  المسمى "قياس درجة الحرارة"). للحصول على قراءة دقيقة يتطلب معايرة هذا النظام.

اردوينو الجهد المرجعي الأداء

تشير المعلومات الموجودة في ورقة البيانات على مرجع Arduino للجهد إلى أن قيمها القصوى والدنيا هي 1.0V ~ 1.2V و 1 V1 الاسمية. بخلاف هذا لا يوجد المزيد من المعلومات على الإطلاق.

لا توجد معلومات حول التكرار أو الاستقرار. تشير إلى أن الجهد يمكن أن يختلف بنسبة٪ 9٪ حول 1.1 فولت.

لذا فإن السؤال الحقيقي هو:


    هل مرجع الجهد اردوينو أي خير على الإطلاق؟


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

يوجد في هذه الصفحة بعض القياسات المرجعية للجهد - هذه ليست شاملة ولكنها ستعطيك نكهة أداء مرجع فجوة النطاق.
اردوينو الجهد إشارة الأسئلة
الأسئلة المطروحة هنا هي:
كيف يتغير الجهد المرجعي مع درجة الحرارة؟
كيف يتغير الجهد المرجعي مع Vcc؟
ما مدى استقرار الجهد المرجعي بشكل عام؟
تذكر أن هذه القياسات تعتمد على اختبار عدد قليل من الرقائق ومجموعة واحدة أو مجموعتين من القياسات. وبالتالي سوف تعطي انطباعا وليس الجواب المطلق.

ملاحظة: تم إجراء جميع قياسات الجهد باستخدام ADS1115 على لوحة جانبية. تم إجراء جميع قياسات الجهد في الوضع التفاضلي ADS1115. أجريت قياسات درجة الحرارة باستخدام MAX6675 والنوع J الحرارية.

الدقة الأولية
الدقة الأولية سيئة عند ± 9٪ ولكن معايرة مرجع جهد Arduino يسمح لك بالتخلص من هذا الخطأ.
ملاحظة: تبلغ دقة MAX6143 الأولية 0.05٪ (180 مرة أفضل ، 9٪).


استقرار النتائج Arduino Uno USB Stability Measurements

يتم قياس لوحين ، الأول هو لوحة Arduino uno القياسية والثاني هو لوحة Arduino Nano. كلاهما يستخدم نفس المعالج ATMega328P.

أعطت القياسات التي أجريت في أوقات / أيام مختلفة من Arduino Uno مدعوم من مزود الطاقة USB (hub) النتائج التالية:
اردوينو أونو USB قياسات الاستقرار
اردوينو أونو (PDIP)



Arduino Uno USB Stability Measurements , mechatronics  اردوينو اونو

Arduino Uno USB Stability Measurements




يختلف جهد USB بنسبة 2.4٪ إلى 3.6٪ وهذا ليس له تأثير كبير على تباين الخطأ في المرجع (انظر قياسات الجهد أدناه).
لاحظ كيف يظل الجهد المرجعي ثابتًا ، أي أنه يحتوي على خطأ إزاحة ثابت. على الرغم من أن مرجع الجهد يبدأ من قيمة 1.070V فإنه يحتفظ بالقرب من تلك القيمة. قد يكون هذا بسبب عملية التصنيع ويبدو أنه يظل ثابتًا بمرور الوقت.
للحصول على أفضل مجموعة من النتائج ، يتم الحصول على التزويد من لوحة وصل USB مع ناتج الطاقة الخاص بها بينما في الأسفل يكون مخرج USB مباشر للكمبيوتر الشخصي. هذا الأخير يبدو أكثر استقرارا قليلا (نانو).
في كلتا الحالتين ، فإن استخدام مرجع الجهد الداخلي على متن الطائرة سوف يعطي نتيجة أكثر اتساقًا حيث سيكون له تنظيم أكثر تشددًا للجهد.
ملاحظة: تذكر أنك تستخدم وحدة تزويد USB 5V مباشرة (عند العمل على المقعد) أو تستخدم وحدة طاقة خارجية. يحتوي منظم 5 فولت على متن الطائرة - LD1117AG (نفس NCP1117) - على خطأ تشديد في المواصفات (0.1 فولت في 5 فولت = 2٪) من طاقة USB (انظر قياسات حساسية التزويد أدناه).
استنتاج حول الاستقرار
على الرغم من أن مرجع جهد Arduino يحتوي على خطأ إزاحة أولي (ربما بسبب عملية التصنيع) ، فإن استقرار المرجع لا يزال جيدًا. مع القياسات هنا تظهر بين 0.21 ٪ ~ 0.31 ٪ التغيير.
امدادات التيار الكهربائي الاستقرار
.استخدام ATMega382p على لوح لحام دون توصيله بجهد إمداد متغير

استنتاج بشأن امدادات التيار الكهربائي

إشارة الجهد ذات فجوة الحزمة تبدو جيدة جدًا ، كونها غير حساسة لتوفير التغييرات في الجهد. ينخفض ​​بمقدار 1.2mV لكل انخفاض في إمدادات فولت يبدأ من 0،05 ٪ خطأ في 5.26V العرض. إذا تم الإبقاء على الإمداد ثابتًا ، فيمكن أيضًا إزالة خطأ الإزاحة هذا عن طريق معايرة المرجع.
درجة الحرارة الاستقرار
باستخدام المزدوجات الحرارية (النوع J) مع رقاقة MAX6675 و MSOP Arduino Nano. تسخين الشريحة لمدة دقيقة والانتظار حتى تستقر درجة الحرارة. يحتوي MAX6675 الحرارية على خطأ في درجة حرارة الإزاحة ولكن ما نريده حقًا هو التغير في درجة الحرارة وكيف يرتبط الناتج المرجعي. يتم قياس درجة الحرارة المحيطة أيضًا باستخدام جهاز مختلف لإعطاء نقطة مرجعية للحرارية المزدوجة.
قياسات اردوينو نانو
لدرجات الحرارة المحيطة نانو تقاس الحرارية 24.5 درجة مئوية (يقول مقياس الحرارة الأصلي 23 درجة مئوية) قريبة جدا. درجة الحرارة رقاقة 30 درجة مئوية.

القياس الأول:
Vref هو 1.0674V.
Vref هي رقاقة تسخين 1.0659kV إلى 75 درجة مئوية
السقوط هو: -1.5mV
تغير على درجة الحرارة
للحصول على درجة حرارة 35 درجة مئوية ، يتغير الجهد المرجعي بمقدار -1.5mV. تقريبًا -1.5 / 35 = -0.043mV / ° C. لكن هذا يعتمد فقط على جهاز واحد وقياس واحد!

    التغيير هو -0.043mv / ° C

لزيادة درجة الحرارة من 25 درجة مئوية إلى 125 درجة مئوية (دلتا 100 درجة مئوية) يجب أن ينخفض ​​المرجع بنسبة 4.28mV. من حيث النسبة المئوية (4.28e-3 / 1.1) * 100 = 0.39٪.

للحصول على انخفاض في درجة الحرارة من 25 درجة مئوية إلى -40 درجة مئوية (دلتا -65 درجة مئوية) ، يجب زيادة المرجع بنسبة 2.79mV. من حيث النسبة المئوية (2.79e-3 / 1.1) * 65 = 0.16٪.

إذا كنت تفكر في ترانزستور بسيط يحتوي على تغيير في درجة الحرارة -2.1mV / ° C ثم لنفس دلتا درجة الحرارة ستحصل على تغيير جهد 201mV (تغيير بنسبة 18.2 ٪) لذلك فإن دائرة فجوة النطاق تعمل بشكل جيد!

القياس الثاني:
Vref هو 1.0665V.Temp 30 درجة مئوية
Vref هو رقاقة تسخين 1.0652kV إلى 75 درجة مئوية
السقوط هو: -1.3mV - هذه نتيجة مشابهة للنتيجة الأولى.

القياس الثالث:
Vref هو 1.0688V.Temp 30 درجة مئوية
Vref هي رقاقة تسخين 1.0683kV إلى 75 درجة مئوية
السقوط هو: -0.5mV - مختلف قليلاً ، ولكن في نفس النطاق.
استنتاج حول درجة الحرارة
أداء درجة الحرارة جيد مع تغيير مرجعي بنسبة 0.55٪ فقط على مدى درجة الحرارة الكامل (يقدر من 35 درجة مئوية إلى 75 درجة مئوية).

يتغير الجهد المرجعي بمقدار 0.003٪ لكل درجة مئوية (تقديري) [0.55٪ / 165 (تقديري)].
ملاحظة: يتمتع MAX6143 بأداء أفضل في درجات الحرارة بمقدار 1000 مرة عند 3ppm / ° C.

على مدى درجة الحرارة الكاملة (-40 درجة مئوية إلى + 125 درجة مئوية) ، سيتغير المرجع بحوالي 0.55 ٪ (0.39 ٪ + 0.16 ٪) = 0.55 ٪ (من 1V1) وهو أمر ليس سيئا للغاية.


يجب تغيير مرجع الجهد بمقدار + 2.79mV ~ -4.28mV (من 1V1) على درجات الحرارة هذه.
استنتاجات بشأن مرجع الجهد اردوينو
يمكن أن يكون للمرجع إزاحة كبيرة (بسبب عملية التصنيع) ± 9٪ وبالتالي قد تكون دقتها الأولية سيئة.
حساسية امدادات التيار الكهربائي: ~ -1.2mV لكل انخفاض امدادات فولت.
        هذا هو ~ -11 ٪ لكل انخفاض امدادات فولت.
درجة الحرارة الاستقرار: ~ 0.003 ٪ لكل درجة مئوية (المقدرة)
        ~ 0.55 ٪ على مدى درجة الحرارة الكاملة.
استقرار الجهد الناتج: ~ 0.31 ٪
للحصول على أفضل النتائج من مرجع جهد Arduino ، يجب معايرة ذلك. سيؤدي ذلك بعد ذلك إلى القضاء على الفولتية الناتجة عن عملية التصنيع وحساسية الفولتية في الإمداد (إذا ظل مصدر الجهد ثابتًا ، أي تم توفيره من خلال منظم).


هذا سيعطي ثباتًا عند 0.55 + 0.31 = ~ 0.86٪.
تذكر أن هذا تقدير يستند إلى عدد قليل جدًا من العينات ، لذلك قد تختلف نتائجك ، لكن ذلك يوضح أن المرجع يمكن أن يصبح أكثر استقرارًا إذا تمت معايرته. كما يوضح أن مرجع جهد Arduino قد يكون أكثر فائدة مما تتخيل.
كيفية قياس امدادات التيار الكهربائي
يمكنك تشغيل متحكم (ATMega328p - Uno و Nano) من 1V8 إلى 5V5. لا يستطيع المتحكم الدقيق اكتشاف هذه القيمة "الحقيقية" لجهد التزويد هذا إلا إذا كنت تستخدم جهد مرجعي معروف لمعرفة ذلك. هذا لأن ADC يقيس كل شيء بالنسبة إلى مرجع ، أي أن الجهد الكهربائي هو المرجع!

تحذير: في VCC = يمكن أن تكون الساعة 4.5V 20MHz وفي VCC = 2.7V يجب أن تكون سرعة الساعة <= 10MHz ، وبالنسبة لـ VCC = 1.8V يجب أن تكون سرعة الساعة <= 4MHz). راجع القسم "29.3 درجات السرعة" الذي يوضح أنه يجب تقليل تردد الساعة خطيًا مع تقليل جهد التيار الكهربائي.


إنها طريقة الفرز العكسي لقياس ADC. بدلاً من استخدام مرجع الجهد الكهربائي "كمرجع" ، يمكنك استخدام جهد التيار الكهربائي كمرجع و "مرجع الجهد الداخلي Arduino" باعتباره الكمية المراد قياسها.
يتم ذلك بهذه الطريقة لأنه لا يمكنك تحديد جهد Vcc كمدخل إلى ADC. راجع "مخطط كتلة ADC Mux" أدناه.
في هذه الحالة ، فإن الجهد الكهربائي "المرجعي" هو:
    VBIN = VCC / 1024 V / LSB [الأسرى (2،10) = 1024]
في المعادلة أعلاه VCC غير معروف (إلى متحكم!).
بقياس المرجع 1V1 ، والحصول على قيمة ADC لذلك ، يمكنك حل المعادلة
    VBIN = VREF / ADCVALUE

وبالتالي:
    VCC / 1024 = VREF / ADCVALUE
وبالتالي
    VCC = 1024 * (VREF / ADCVALUE)

و ...
    VCC = 1024 * (1V1 / ADCVALUE)
هنا 1024 هو الصحيح

(1024 هو مقسوم لـ VCC للجهد المرجعي).
نصيحة: نصيحة: للحصول على نتيجة أفضل قم بمعايرة مرجع جهد Arduino.
لمعرفة قيمة جهد التيار الكهربائي باستخدام مرجع جهد Arduino:
قم بتعيين مصدر مرجع ADC على Vcc.
(هذا خيار في ADC mux - انظر الرسم البياني أدناه)
تأخذ قراءة ADC من الجهد ذات فجوة الحزمة (مرجع الجهد اردوينو).
يمكنك استخدام المعادلات أعلاه لحساب جهد التيار الكهربائي أو اتباع المثال التالي.
مثال Sketch1 قياس الجهد العرض
ضع الكود التالي في المخطط داخل وظيفة setup ().

إذا قمت بمعايرة المرجع ، فقم بتغيير قيمة ...
arduinoADCcal
... لقيمتك المقاسة. تمثيل 1.1V هو 11000 وهو تمثيل عشري ثابت حيث يفترض أن تكون العلامة العشرية مكان واحد إلى اليمين. لذلك يمكنك التفكير في 11000 يمثل عدد 0.1mVs في الجهد الفعلي ، أي 11000 x 0.1e-3 = 1.1V
باستخدام ADS1115 أو الفولتميتر جيدة سوف تعطيك أرقام كافية. إذا كنت تستخدم DVM قياسي ، فستحصل على 3 أرقام فقط (على مدى 2 فولت) ، لذا اضبط آخر رقمين على الصفر.
البرنامج 
////////////////////////////////////////////////////////////////
void selfMeasureVcc(char *buf) {
uint8_t low,high; // ADC bytes.
// Default reference value. Set this to your measured reference voltage (or leave as is).
// The value uses an integer fixed point representation
// with the assumed decimal point one place to the right.
static unsigned long arduinoADCcal = 11000;

   if (strlen(buf)>1) {
      if (strlen(buf)<6)
         Serial.print(F("Not enough digits"));

      else if (strlen(buf)>6)
         Serial.print(F("Too many digits"));
      else
         arduinoADCcal = atoi(&buf[1]); // delay<nnn>

   } else if (strlen(buf)==1)
      Serial.print(F("Ref calibration value: ")); Serial.println(arduinoADCcal);


   // ADCSRA |= _BV(ADEN); // Enable ADC. Enabled by init() in Arduino code.

   ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); // Set VCC ref and band gap as input.
   delay(2); // Vref settling time delay

   // Throw away 1st result as datasheet says
   // After switch, ref may be invalid.
   // Datasheet: "24.5.2 ADC Voltage Reference".
   ADCSRA |= _BV(ADSC); // Start conversion
   while ( bit_is_set(ADCSRA, ADSC) ); // Wait for conversion complete.

   ADCSRA |= _BV(ADSC); // Start conversion
   while ( bit_is_set(ADCSRA, ADSC) ); // Wait for conversion complete.

   // ADCL must be read first, then ADCH, to ensure that the content
   // of the Data Registers belongs to the same conversion
   // Datasheet Section "24.2 Overview"
   low = ADCL;  // Read ADCL first which blocks ADCH updates.
   high = ADCH; // After reading ADCH both registers can be updated by the chip.

   long ADCValue = (high << 8) | low;
   Serial.print(F("ADC value of 1V1 ref: "));  Serial.println(ADCValue);

   #define BINS 1024L // VCC/1024 is the value of each LSB of the ADC.

   Serial.println( (arduinoADCcal)* BINS );
   Serial.println( ((arduinoADCcal * BINS)+5L) );
   Serial.println( ((arduinoADCcal * BINS)+5L) / 10L );

   // Note +5 = middle of LSB bin
   // Calculate Vcc (in mV); 1125300 = 1.1*1024*1000
   // Here ccal value is 1.1*10e4 so no need for *1000 and must divide by 10.

   uint32_t res = (((arduinoADCcal * BINS)+5L) / 10L) / ADCValue;

   // Calculate Vcc (in mV); 1126400 = 1.1*1024*1000
   // should be 1024 / ADCValue = 1125300L / ADCValue; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
   // internal1.1Ref = 1.1 * Vcc1 (per voltmeter) / Vcc2 (per readVcc() function)
   Serial.print(F("Measured (mV) ")); Serial.print(res); Serial.println(F(" mV"));
}

ترجمة البرنامج بالعربي
////////////////////////////////////////////////// //////////////
باطل selfMeasureVcc (char * buf) {
uint8_t منخفضة ، عالية ؛ // ADC بايت.
// القيمة المرجعية الافتراضية. اضبط هذا على الجهد المرجعي المقاس (أو اتركه كما هو).
// تستخدم القيمة عددًا صحيحًا من النقاط الثابتة
// مع العلامة العشرية المفترضة مكان واحد إلى اليمين.
ثابت غير موقعة طويلة arduinoADCcal = 11000 ؛

   if (strlen (buf)> 1) {
      إذا (strlen (buf) <6)
         Serial.print (F ("الأرقام غير كافية")) ؛

      وإلا إذا (strlen (buf)> 6)
         Serial.print (F ("عدد كبير جدًا من الأرقام")) ؛
      آخر
         arduinoADCcal = atoi (& buf [1])؛ // التأخير <nnn>

   } آخر إذا (strlen (buf) == 1)
      Serial.print (F ("Ref calibration value:"))؛ Serial.println (arduinoADCcal)؛


   // ADCSRA | = _BV (ADEN)؛ // تمكين ADC. يتم التمكين بواسطة init () في كود Arduino.

   ADMUX = _BV (REFS0) | _BV (MUX3) | _BV (MUX2) | _BV (MUX1) ؛ // تعيين المرجع VCC والفجوة الفرقة كمدخل.
   تأخير (2) ؛ // Vref تسوية تأخير الوقت

   // رمي النتيجة الأولى كما تقول ورقة البيانات
   // بعد التبديل ، قد يكون المرجع غير صالح.
   // ورقة البيانات: "24.5.2 ADC Voltage Reference".
   ADCSRA | = _BV (ADSC) ؛ // ابدأ التحويل
   بينما (bit_is_set (ADCSRA ، ADSC)) ؛ // انتظر التحويل كاملاً.

   ADCSRA | = _BV (ADSC) ؛ // ابدأ التحويل
   بينما (bit_is_set (ADCSRA ، ADSC)) ؛ // انتظر التحويل كاملاً.

   يجب قراءة // ADCL أولاً ، ثم ADCH ، لضمان أن المحتوى
   // سجلات البيانات ينتمي إلى نفس التحويل
   // قسم ورقة البيانات "24.2 نظرة عامة"
   منخفض = ADCL ؛ / / اقرأ ADCL أولاً الذي يمنع تحديثات ADCH.
   عالية = ADCH ؛ // بعد قراءة ADCH يمكن تحديث كلا السجلين بواسطة الشريحة.

   ADCValue طويل = (ارتفاع << 8) | منخفض؛
   Serial.print (F ("ADC value 1V1 ref:"))؛ Serial.println (ADCValue) ؛

   #define BINS 1024L // VCC / 1024 هي قيمة كل LSB من ADC.

   Serial.println ((arduinoADCcal) * BINS)؛
   Serial.println ((((arduinoADCcal * BINS) + 5L)) ؛
   Serial.println ((((arduinoADCcal * BINS) + 5L) / 10L)؛

   // ملاحظة +5 = منتصف صندوق LSB
   / / حساب Vcc (في بالسيارات) ؛ 1125300 = 1.1 * 1024 * 1000
   / / هنا تبلغ قيمة ccal 1.1 * 10e4 لذلك لا داعي لـ * 1000 ويجب قسمة على 10.

   uint32_t res = (((arduinoADCcal * BINS) + 5L) / 10L) / ADCValue؛

   / / حساب Vcc (في بالسيارات) ؛ 1126400 = 1.1 * 1024 * 1000
   يجب أن يكون // 1024 / ADCValue = 1125300L / ADCValue؛ / / حساب Vcc (في بالسيارات) ؛ 1125300 = 1.1 * 1023 * 1000
   // internal1.1Ref = 1.1 * Vcc1 (لكل الفولتميتر) / Vcc2 (لكل وظيفة readVcc ())
   Serial.print (F ("Measured (mV)")) ؛ Serial.print (res)؛ Serial.println (F ("mV")) ؛
}

اردوينو الجهد المرجعي بلوك المخططات
اردوينو أونو / نانو ADC مسك الغزال الرسم البياني
اردوينو adc mux لعملية مرجعية ذات فجوة الحزمة الجهد
Arduino Voltage Reference اردوينو الجهد المرجعي

المصدر: ورقة بيانات ATMega328P

مرجع الجهد الداخلي ATTiny85

يتم ترتيب إشارة الجهد ATTiny85 ، والتي يمكن اختيارها إما 1V1 أو 2.56V ، بشكل مختلف قليلاً في ADC. لا يمكن إعداد دبوس AREF إلا كمدخل (لا يوجد تبديل FET يربط mux المرجع الداخلي بدبوس AREF). لذلك لا يمكنك إعداد مرجع جهد Arduino للقياس عند طرف AREF.

لذلك لا يمكنك معايرة ذلك مباشرة. قد تفترض إما أن لها القيمة المعلنة أو تقيس عرض Vcc بدقة ثم تأخذ قراءة ADC (لكن تذكر أن ADC لديها أخطاءها الخاصة أيضًا!).

إحدى الطرق التي من شأنها القضاء على أخطاء ADC هي التغذية بجهد متغير لإدخال ADC - الذي تقيسه. ثم قارنها بالقراءة من مرجع الجهد (قراءة ADC). بمجرد أن تتطابق القراءتان مع الجهد الكهربي للإدخال ، سيكشف الجهد المرجعي الحقيقي لـ Arduino (بالطبع فقط إلى دقة 1LSB).
اردوينو ATTiny85 ADC Mux بلوك الرسم البياني
إشارة الجهد الداخلي ATtiny85
Arduino Voltage Reference اردوينو الجهد المرجعي

المصدر: ورقة بيانات ATTiny85

معايرة مرجع الجهد اردوينو
لمعايرة المرجع في Uno أو Nano ، عليك فقط تشغيل المرجع وقياس الجهد عند دبوس المرجع. تذكر فقط

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

تحذير: لا تقم بتوصيل أي إشارة جهد أخرى إلى دبوس VREF عند تشغيل مرجع الجهد Arduino (Uno / Nano) - لا توجد حماية ويمكن أن تتلف إما المرجع الخارجي أو الدائرة المرجعية الداخلية.


تشغيل المرجع يستخدم ببساطة كود Arduino التالي:

    التناظرية (الداخلي) ؛

ومع ذلك ، سوف تحتاج إلى تنشيط ADC لتمكين المرجع ، لذلك ستفعل قراءة بسيطة.

    analogRead (0) ؛ // يمكن أن يكون أي قناة

هذا بسبب الطريقة التي يتم بها كتابة التعليمات البرمجية "الأسلاك" - سجلات mux و REFS0 / 1 تتم كتابتها فقط قبل أمر قراءة ADC (داخل دالة analogRead () فقط).

لاردوينو ميجا يمكنك الاختيار من بين ما يلي:
    INTERNAL1V1
    INTERNAL2V56

ضع الكود أعلاه في جزء الإعداد () من Arduino Sketch.

الآن قم بتوصيل المتر المتعدد إلى دبوس VREF واكتب النتيجة (للاستخدام في التعليمات البرمجية الخاصة بك - انظر قياس الجهد الكهربائي للإمداد ، على وجه التحديد).

نصيحة: استخدم مقياس متعدد ، أو لمزيد من الأرقام ، استخدم ADS1115 في الوضع التفاضلي أو مقياس Fluke (مكلف للغاية).

نصيحة: أضف مكثفًا إلى دبوس Vref لتقليل الضوضاء الإضافية. يمكنني استخدام مكثف 100nF.

لضبط المرجع مرة أخرى لاستخدام العرض:

    التناظرية (DEFAULT) ؛

... مرة أخرى تليها ...

    analogRead (0) ؛ // يمكن أن يكون أي قناة

تم العثور على رمز العملية التناظرية هنا:
"C: / Program Files (x86) / Arduino/hardware/arduino/avr/cores/arduino/wiring_analog.c"

التعريفات (# تعريف) هنا:
C: / ملفات البرنامج (x86) / Arduino/hardware/arduino/avr/cores/arduino/Arduino.h

سيضع كود Arduino أعلاه (للاختيار المرجعي الداخلي) السجلات كما يلي (قسم ورقة البيانات: 24.9.1 سجل اختيار ADMUX ADC Multiplexer):

ADMUX بت 7 و 6 مجموعة عالية (REFS1 و REFS0).
بت ADMUX 3..0 لتعيين B1110.

ملاحظة: تنص ورقة البيانات على:
"قد تكون أول نتيجة لتحويل ADC بعد تبديل مصدر الجهد المرجعي غير دقيقة ، وينصح المستخدم بتجاهل هذه النتيجة."
(انظر قسم ورقة البيانات "24.5.2 ADC Voltage Reference").

لذلك يجب عليك التخلص من أول نتيجة ADC.

المصدر :