هذا هو البرنامج التعليمي التاسع الخاص بنا لتعلم المتحكمات الدقيقة PIC باستخدام MPLAB و XC8. حتى الآن ، قمنا بتغطية العديد من البرامج التعليمية الأساسية مثل البدء مع MPLABX ، وميض LED مع PIC ، ومؤقتات في PIC ، وواجهات LCD ، وتفاعل 7 أجزاء وما إلى ذلك. إذا كنت مبتدئًا تمامًا ، فيرجى زيارة القائمة الكاملة لدروس الموافقة المسبقة عن علم هنا وابدأ التعلم.
في هذا البرنامج التعليمي ، سوف نتعلم كيفية استخدام ADC مع متحكم PIC PICF877A. ستشمل معظم مشاريع Microcontroller ADC (محول تناظري إلى رقمي) فيه ، لأنها إحدى أكثر الطرق استخدامًا لقراءة البيانات من العالم الحقيقي. تقريبًا جميع المستشعرات مثل مستشعر درجة الحرارة ومستشعر التدفق ومستشعر الضغط ومستشعرات التيار ومستشعرات الجهد والجيروسكوبات ومقاييس التسارع ومستشعر المسافة وكل مستشعر أو محول طاقة تقريبًا ينتج جهدًا تناظريًا من 0 فولت إلى 5 فولت بناءً على قراءة المستشعرات. قد يعطي مستشعر درجة الحرارة على سبيل المثال 2.1 فولت عندما تكون درجة الحرارة 25 درجة مئوية وترتفع إلى 4.7 عندما تكون درجة الحرارة 60 درجة مئوية. من أجل معرفة درجة حرارة العالم الحقيقي ، يجب على MCU قراءة جهد الخرج لمستشعر درجة الحرارة هذا وربطه بدرجة حرارة العالم الحقيقي. ومن ثم فإن ADC هي أداة عمل مهمة لمشاريع MCU وتتيح لنا معرفة كيفية استخدامها على PIC16F877A.
تحقق أيضًا من مقالاتنا السابقة حول استخدام ADC في وحدات التحكم الدقيقة الأخرى:
- كيفية استخدام ADC في Arduino Uno؟
- دروس Raspberry Pi ADC
- ربط ADC0808 مع متحكم 8051
ADC في PIC متحكم PIC16F877A:
هناك العديد من أنواع ADC المتاحة ولكل منها سرعته ودقته الخاصة. أكثر أنواع ADCs شيوعًا هي الفلاش والتقريب المتتالي و sigma-delta. يسمى نوع ADC المستخدم في PIC16F877A بالتقريب المتتالي ADC أو SAR باختصار. لذلك دعونا نتعلم قليلاً عن SAR ADC قبل أن نبدأ في استخدامه.
التقريب المتتالي ADC: يعمل SAR ADC بمساعدة المقارنة وبعض المحادثات المنطقية. يستخدم هذا النوع من ADC جهدًا مرجعيًا (وهو متغير) ويقارن جهد الدخل بالجهد المرجعي باستخدام المقارنة ، ويتم حفظ الفرق ، الذي سيكون ناتجًا رقميًا ، من البت الأكثر أهمية (MSB). تعتمد سرعة المقارنة على تردد الساعة (Fosc) الذي تعمل عليه الموافقة المسبقة عن علم.
الآن بعد أن عرفنا بعض الأساسيات عن ADC ، دعنا نفتح ورقة البيانات الخاصة بنا ونتعلم كيفية استخدام ADC على PIC16F877A MCU. للموافقة المسبقة عن علم التي نستخدمها ADC 10 بت 8 قنوات. هذا يعني أن قيمة خرج ADC الخاص بنا ستكون 0-1024 (2 ^ 10) وهناك 8 دبابيس (قنوات) على MCU الخاصة بنا والتي يمكنها قراءة الجهد التناظري. يتم الحصول على القيمة 1024 بمقدار 2 ^ 10 نظرًا لأن ADC لدينا هو 10 بت. تم ذكر المسامير الثمانية التي يمكنها قراءة الجهد التناظري في ورقة البيانات. لنلقي نظرة على الصورة أدناه.
يتم تمييز القنوات التناظرية من AN0 إلى AN7 لك. فقط هذه المسامير ستكون قادرة على قراءة الجهد التناظري. لذا قبل قراءة جهد الدخل ، يتعين علينا تحديد القناة التي يجب استخدامها لقراءة جهد الدخل في الكود الخاص بنا. في هذا البرنامج التعليمي سوف نستخدم القناة 4 مع مقياس الجهد لقراءة الجهد التناظري في هذه القناة.
تحتوي الوحدة النمطية A / D على أربعة سجلات يجب تهيئتها لقراءة البيانات من دبابيس الإدخال. هذه السجلات هي:
• A / D نتيجة السجل العالي (ADRESH)
• A / D نتيجة منخفضة التسجيل (ADRESL)
• سجل التحكم A / D 0 (ADCON0)
• A / D Control Register 1 (ADCON1)
البرمجة لـ ADC:
في برنامج لاستخدام ADC مع متحكم PIC بسيط جدا، لدينا فقط لفهم هذه السجلات أربعة ثم القراءة وأي جهد تمثيلي تكون بسيطة. كالمعتاد ، قم بتهيئة بتات التكوين ودعنا نبدأ بـ void main ().
داخل void main () ، يتعين علينا تهيئة ADC الخاص بنا باستخدام سجل ADCON1 وسجل ADCON0. يحتوي سجل ADCON0 على البتات التالية:
في هذا السجل ، يتعين علينا تشغيل وحدة ADC بجعل ADON = 1 وتشغيل ساعة تحويل A / D باستخدام بتات ADCS1 و ADCS0 ، ولن يتم تعيين الباقي في الوقت الحالي. في برنامجنا ، يتم تحديد ساعة تحويل A / D على أنها Fosc / 16 ، يمكنك تجربة الترددات الخاصة بك ومعرفة كيف تتغير النتيجة. التفاصيل الكاملة المتاحة على صفحة ورقة البيانات 127. ومن ثم سيتم تهيئة ADCON0 على النحو التالي.
ADCON0 = 0b01000001 ؛
يحتوي سجل ADCON1 الآن على البتات التالية:
في هذا السجل ، يتعين علينا جعل تنسيق نتيجة A / D مرتفعًا عن طريق ADFM = 1 وجعل ADCS2 = 1 لتحديد Fosc / 16 مرة أخرى. تبقى البتات الأخرى صفرًا كما خططنا لاستخدام الجهد المرجعي الداخلي. تتوفر التفاصيل الكاملة في صفحة ورقة البيانات 128. ومن ثم ، سنحدد ADCON1 على النحو التالي.
ADCON1 = 0x11000000 ؛
الآن بعد تهيئة وحدة ADC داخل وظيفتنا الرئيسية ، دعنا ندخل إلى حلقة while ونبدأ في قراءة قيم ADC. لقراءة قيمة ADC ، يجب اتباع الخطوات التالية.
- تهيئة وحدة ADC
- حدد القناة التناظرية
- ابدأ ADC بجعل Go / Done مرتفعًا
- انتظر حتى ينخفض بت Go / DONE
- احصل على نتيجة ADC من سجل ADRESH و ADRESL
1. تهيئة وحدة ADC: لقد تعلمنا بالفعل كيفية تهيئة ADC لذلك نحن فقط نسمي هذه الوظيفة أدناه لتهيئة ADC
تكون الدالة ADC_Initialize () الفارغة كما يلي.
ADC_Initialize () باطل {ADCON0 = 0b01000001 ؛ // ADC ON و Fosc / 16 محددًا ADCON1 = 0b11000000 ؛ // تم تحديد الجهد المرجعي الداخلي}
2. حدد القناة التناظرية: الآن علينا تحديد القناة التي سنستخدمها لقراءة قيمة ADC. لنقم بعمل وظيفة لهذا ، بحيث يكون من السهل علينا الانتقال بين كل قناة داخل حلقة while .
غير موقعة ADC_Read (قناة حرف غير موقعة) {// **** تحديد القناة ** /// ADCON0 & = 0x11000101؛ // مسح بتات تحديد القناة ADCON0 - = القناة << 3 ؛ // إعداد البتات المطلوبة // ** اكتمل اختيار القناة *** ///}
ثم يتم استقبال القناة المراد تحديدها داخل القناة المتغيرة. على الخط
ADCON0 & = 0x1100101 ؛
تم مسح اختيار القناة السابق (إن وجد). يتم ذلك باستخدام أحادي المعامل وعامل التشغيل "&". يتم إجبار البتات 3 و 4 و 5 على أن تكون 0 بينما تُترك الأجزاء الأخرى في قيمها السابقة.
ثم يتم تحديد القناة المرغوبة عن طريق إزاحة رقم القناة لليسار ثلاث مرات وضبط البتات باستخدام اتجاه البت أو عامل التشغيل "-".
ADCON0 - = قناة << 3 ؛ // ضبط البتات المطلوبة
3. ابدأ ADC بجعل Go / Done bit مرتفعًا: بمجرد تحديد القناة ، يتعين علينا بدء تحويل ADC ببساطة عن طريق جعل بت GO_nDONE مرتفعًا:
GO_nDONE = 1 ، // يهيئ تحويل A / D
4. انتظر حتى يصبح بت Go / DONE منخفضًا: سيبقى بت GO / DONE مرتفعًا حتى اكتمال تحويل ADC ، ومن ثم علينا الانتظار حتى تنخفض هذه البتة مرة أخرى. يمكن القيام بذلك باستخدام حلقة while loop.
بينما (GO_nDONE) ؛ // انتظر حتى يكتمل تحويل A / D
5. احصل على نتيجة ADC من سجل ADRESH و ADRESL: عندما ينخفض بت Go / DONE مرة أخرى ، فهذا يعني أن تحويل ADC قد اكتمل. ستكون نتيجة ADC قيمة 10 بت. نظرًا لأن MCU الخاص بنا عبارة عن MCU 8 بت ، يتم تقسيم النتيجة إلى 8 بت أعلى وأقل 2 بت. يتم تخزين نتيجة 8 بت العليا في السجل ADRESH ويتم تخزين 2 بت السفلي في السجل ADRESL. ومن ثم يتعين علينا إضافة هذه إلى السجلات للحصول على قيمة ADC 10 بت الخاصة بنا. يتم إرجاع هذه النتيجة بواسطة الوظيفة كما هو موضح أدناه:
العودة ((ADRESH << 8) + ADRESL) ؛ // إرجاع النتيجة
تظهر هنا الوظيفة الكاملة التي تستخدم لتحديد قناة ADC ، وتشغيل ADC وإرجاع النتيجة.
ADC_Read int غير موقعة (قناة حرف غير موقعة) {ADCON0 & = 0x11000101؛ // مسح بتات تحديد القناة ADCON0 - = القناة << 3 ؛ // إعداد البتات المطلوبة __delay_ms (2) ؛ // وقت الاستحواذ لشحن مكثف الضغط GO_nDONE = 1 ؛ // تهيئة تحويل A / D أثناء (GO_nDONE) ؛ // انتظر حتى يكتمل تحويل A / D إلى ((ADRESH << 8) + ADRESL) ؛ // نتائج الإرجاع}
الآن لدينا وظيفة ستأخذ اختيار القناة كمدخل وتعيد لنا قيمة ADC. ومن ثم يمكننا استدعاء هذه الوظيفة مباشرة داخل حلقة while الخاصة بنا ، نظرًا لأننا نقرأ الجهد التناظري من القناة 4 في هذا البرنامج التعليمي ، فستكون استدعاء الوظيفة على النحو التالي.
أنا = (ADC_Read (4)) ؛ // تخزين نتيجة adc في "i".
من أجل تصور إخراج ADC الخاص بنا ، سنحتاج إلى نوع من وحدات العرض مثل شاشة LCD أو الجزء السابع. في هذا البرنامج التعليمي ، نستخدم شاشة عرض ذات 7 مقاطع للتحقق من المخرجات. إذا كنت تريد معرفة كيفية استخدام مقطع 7 مع الموافقة المسبقة عن علم ، اتبع البرنامج التعليمي هنا.
يتم تقديم الرمز الكامل أدناه ويتم شرح العملية أيضًا في الفيديو في النهاية.
إعداد واختبار الأجهزة:
كالمعتاد ، قم بمحاكاة الكود باستخدام Proteus قبل الانتقال فعليًا إلى أجهزتنا ، تظهر مخططات المشروع أدناه:
اتصالات وحدة العرض المكونة من 4 أرقام المكونة من سبعة أجزاء مع وحدة التحكم الدقيقة PIC هي نفسها مثل المشروع السابق ، لقد أضفنا للتو مقياس جهد إلى الدبوس 7 وهو القناة التناظرية 4. من خلال تغيير الوعاء ، سيتم إرسال جهد متغير إلى MCU والتي ستتم قراءتها بواسطة وحدة ADC وعرضها على وحدة العرض المكونة من 7 مقاطع. تحقق من البرنامج التعليمي السابق لمعرفة المزيد عن العرض المكون من 4 أرقام المكون من 7 أجزاء وتفاعله مع PIC MCU.
هنا استخدمنا نفس لوحة متحكم PIC التي أنشأناها في البرنامج التعليمي الوامض LED. بعد التأكد من الاتصال ، قم بتحميل البرنامج إلى الموافقة المسبقة عن علم وسترى ناتجًا مثل هذا
لقد قرأنا هنا قيمة ADC من الوعاء وقمنا بتحويلها إلى الجهد الفعلي عن طريق تعيين الناتج 0-1024 على أنه 0-5 فولت (كما هو موضح في البرنامج). ثم يتم عرض القيمة على المقطع 7 والتحقق منها باستخدام جهاز القياس المتعدد.
هذا كل شيء ، الآن نحن على استعداد لاستخدام جميع المستشعرات التناظرية المتوفرة في السوق ، فابدأ وجرب ذلك وإذا واجهتك أي مشاكل كالمعتاد ، استخدم قسم التعليقات ، سنكون سعداء لمساعدتك