|
تحميل كتب مجانية, مراجع للتحميل كتب مجانية, كتب عربية للتحميل, كتب ألكترونية, كتب اجنبية, كتب تعليمية, مراجع عربية,كتب للتحميل, كتب للقراءة. |
| LinkBack | أدوات الموضوع | انواع عرض الموضوع |
#11
| ||
| ||
مقدمة : يتناول هذا المشروع إنشاء مقياس جهد رقمى بسيط DVM باستخدام الميكروكونترولر PIC16F877 . مدى القياس 0-20V ويمكن بالطبع زيادة أو نقصان مدى جهد الدخل كما ترغب بعد فهم طريقة معايرة التدريج scaling . يقوم الميكروكونترولر بقراءة جهد الدخل من خلال أحد القنوات الثمانية وتحويله إلى عدد رقمى باستخدام المحول ADC الداخلى . بإجراء بعض العمليات الرياضية على نتيجة التحويل فأن هذا العدد الرقمى يمكن تحويله كمقياس للجهد الفعلى . يتم عرض الجهد على وحدة LCD . الدائرة الكهربية والوصف : لا يمكنك تغذية إشارة الجهد 20V مباشرة إلى قناة مدخل الميكروكونترولر . هذه القيمة مرتفعة جدا عن جهد العمل وقد تسبب تلف الميكروكونترولر . لذلك فنحن نحتاج أولا إلى تخفيض جهد الدخل إلى قيمة جهد عمل آمن للميكروكونترولر . يمكن تحقيق ذلك باستخدام مقسم (مجزىء) جهد بسيط مكون من مقاومات كما فى الشكل . باستخدام المقاومتين R1 و R2 يمكن تخفيض جهد الدخل ليتحول من المدى 0-20V ويصبح فى المدى 0-5V . لقيم المقاومات R1 و R2 المختارة يمكنك رؤية أن جهد الخرج (Vout) من مقسم الجهد هو ربع 1/4 جهد الدخل . عندما يتعدى جهد الدخل 20V فسوف يزيد جهد الخرج عن 5V وهذا يسبب ضررا للميكروكونترولر . إذا تم توصيل زنر دايود بجهد 5.1V بين طرفى المقاومة R1 فإن الخرج Vout سوف لا يزيد أبد عن 5.1V . هذا يؤدى إلى حماية الميكروكونترولر من التلف المحتمل نتيجة زيادة جهد الدخل . يتم توصيل الجهد Vout إلى طرف القناة التناظرية AN0 للميكروكونترولر PIC16F877 . باقى الدائرة كما هو مبين بالشكل التالى : وحدة العرض LCD موصلة فى نظام 4-bit . إذا كانت وحدة LCD تمتلك 14 طرف فقط فلا يكون لديك إضاءة خلفية كما يمكنك تجاهل الطرفين 15 و 16 إن كانا موجودين .يتم التحكم فى التباين باستخدام المقاومة المتغيرة 5K المتصلة بين الجهد +5V والأرضى . المفتاح الضاغط لإعادة العمل reset خارجيا مفيد لوضع النظام فى حالة ابتدائية معروفة عندما يتوقف الميكروكونترولر عن تنفيذ تلبرنامج لأى سبب . البرنامج :
__________________ angel4angel4angel4angel4angel4 |
#12
| ||
| ||
البرنامج : قبل البدء فى كتابة كود هذا المشروع تحتاج لإجراء بعض العمليات الرياضية على نتيجة التحويل من تناظرى لرقمى . أنت تعلم أنه فى أى تطبيق يستخدم التحويل من تناظرى إلى رقمى يحتاج إلى جهد مرجع ثابت لكى نحصل على نتيجة رقمية دقيقة لإشارة الدخل التناظرى .إذا لم يكن جهد المرجع ثابت ومستقر فإن خرج المحول ADC سوف لا يكون له معنى أو دلالة . فى هذا المشروع يتم اختيار جهد المرجع الموجب ليساوى جهد المصدر أى Vdd(+5V) وجهد المرجع السالب ليساوى الصفر Vss . نتيجة لذلك سوف يقوم المحول ADC بتحويل أى جهد للدخل فى المدى بين 0-5 V إلى كود عدد رقمى بين 0-1023 . مصدر الخطأ الرئيسى فى هذا المشروع هو دقة المقاومات R1 و R2 الحسابات : أى قيمة لجهد الدخل التناظري بين 0 – 5 V تناظرها قيمة واحدة من 1024 مستوى (كعداد من 0 إلى 1023) أقل قيمة جهد يمكن تحويلها هى التى تناظر وحدة أو قسم أو عدة واحدة من الأقسام 1024 وهذا الجهد يعبر عن دقة عملية التحويل ويسمى بالقدرة على التحليل أو دقة القياس Resolution وواضح أنها تعدل ما قيمته قسم واحد من 1024 قسم وبالتالى يمكن التعبير عنها بقسمة أقصى جهد دخل ممكن وهو 5V على عدد الاقسام الكلى وهو 1024 لنحصل على الجهد المناظر لقسم واحد فقط ( أقل جهد يمكن قياسه) أى الدقة وتكون بالصيغة : Resolution = 5/1024 = 0.0049 V/Count or Div إى 0.0049 V لكل قسم واحد وهو أدنى جهد يمكن الاحساس به وتحويله إلى عدد رقمى هو الواحد .ولمعرفة عدد الأقسام N الناتجة عن التحويل والمناظرة لجهد دخل معين Vx : 5V----1024 أى نقسم الجهد على الدقة Vx-----N N = ( Vx/5) * 1024 Or N = Vx / 0.0049 Div فى هذا المشروع : أقصى جهد دخل فعلى لهذا المشروع هو Vx من خرج مقسم الجهد والذى يمكن التعبير عنه بالصيغة : Vx = Vin/4 Vin = 4 Vx But: Vx=( 5/1024) * N =0.0049 * N Then: Vin = 4 * 0.0049 * N = 0.02 * N Vin = 2*N الخلاصة : المعادلة السابقة تربط العلاقة بين الجهد المراد قياسه Vin وعدد أقسام المحول المناظرة N الناتجة . مثال توضيحى : نفترض أن جهد الدخل (قبل مقسم الجهد) Vin = 4.6V عندئذ يكون الجهد الواصل لمدخل الميكروكونترولر (بعد مقسم الجهد) يساوى نسبة قسمةالجهد ونفرض أنها 0.2457 (وهى الربع تقريبا) مضروبا فى جهد الدخل المطلوب قياسه أى : Vx = 0.2457*Vin = 1.13V وهذا الجهد هو يناظر كود عدد تحويل تناظرى قدره (نقسم على الدقة ) : N = 1.13/0.0049 = 231 بضرب هذا العدد فى 2 نحصل على 0462 فى شكل رقم بأربع خانات 2*231 = 0462 هذه النتيجة ذات الأربع أرقام (خانات) (0462) سوف يكون الرقمين الأولين 62 يمثلان أرقام العشرات والآحاد لكسر الجهد المقاس بينما الخانتين الأخيرتين 04يمثلان أرقام آحاد وعشرات العدد الصحيح لهذا الجهد لذلك يكون الجهد المقاس 04.62 V وسوف يتم عرض أول ثلاثة أرقام فقط لتكون (04.6 V) .سوف نحتاج إلى تعريف الطرف RA0/AN0 كمدخل تناظرى. ويتم استخدام الجهد Vdd = +5V كجهد مرجعى للمحول ADC . التعليق على البرنامج :
__________________ angel4angel4angel4angel4angel4 |
#13
| ||
| ||
التعليق على البرنامج : /* Project: Digital Voltmeter based on PIC16F877Oscillator @ 4MHz, MCLR Enabled, PWRT Enabled, WDT OFF */ 1- تعريف أطراف توصيل الميكروكونترولر بوحدة العرض LCD // LCD module connections· 6 أطراف بالمنفذ PORTC sbit LCD_RS at RB0_bit;sbit LCD_EN at RB1_bit; sbit LCD_D4 at RB4_bit; sbit LCD_D5 at RB5_bit; sbit LCD_D6 at RB6_bit; sbit LCD_D7 at RB7_bit; · و 6 خانات تحكم بسجل التحكم TRISC sbit LCD_RS_Direction at TRISB0_bit;sbit LCD_EN_Direction at TRISB1_bit; sbit LCD_D4_Direction at TRISB4_bit; sbit LCD_D5_Direction at TRISB5_bit; sbit LCD_D6_Direction at TRISB6_bit; sbit LCD_D7_Direction at TRISB7_bit; // End LCD module connections 2- تعريف (إعلان) الرسائل والمتغيرات المستخدمة قبل الدخول للدالة الرئيسية char Message1[] = “DVM Project”;· الرسالة الأولى ثابتة وتنص على DVM Project .
· والاشارة إلى متغير باسم volt يحتوى على نص عرض الجهد بالصيغة 00.0 char *volt = "00.0";3- الدالة الرئيسية : ونبدءها بإعدادات الميكروكونترولر : void main() {# تهيئة الطرف RA0/AN0 كمدخل تناظرى وباقى الأطراف كمداخل / مخارج رقمية ADCON1 = 0b00001110 ; // RA0/AN0 is analog input# تخصيص موديول المحول داخليا للقناة AN0 . ADCON0 = 0 ; // Analog channel select @ AN0# تهيئة جميع أطراف المنفذ PORTB والمنفذ PORTA كمخارج فيما عدا طرف الدخل التناظرى AN0 TRISB = 0b00000000; // PORTB All OutputsTRISA = 0b00000001; // PORTA All Outputs, Except RA0 · بعد ذلك تهيئة وحدة العرض LCD لبدء العمل Lcd_Init(); // Initialize LCD · ومسح الشاسة Lcd_Cmd(_LCD_CLEAR); // CLEAR display· ومنع ظهور (عرض) المؤشر على الشاشة Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off· ثم كتابة الرسالة الثابتة وهى الرسالة الأولى : DVM Project بدءا من الصف الأول والعامود الأول Lcd_Out(1,1,Message1);· ثم كتابة حرف V فى الصف الثانى والعامود العاشر لتظهر بعد قيمة الجهد . Lcd_Chr(2,10,'V'); · الدخول فى الحلقة الغير منتهية do{…} while(1) حيث يتم تنفيذ : do {# قراءة المدخل التناظرى من القناة رقم 0 ونسخ نتيجة التحويل إلى سجل المتغير ADC_Value . ADC_Value = ADC_Read(0);# ضرب محتويات سجل المتغير ADC_Value فى 2 ونسخ النتيجة لسجل المتغير DisplayVolt ( على سبيل المثال 0462 ) DisplayVolt = ADC_Value * 2;· الحصول على العدد الصحيح لخانة الآلاف : بالقسمة على 1000 وإضافة العدد 48 لتحويل العدد السابق لكود أسكى ونسخ العدد فى الخانة رقم 0 للمتغير volt ( 0462 / 1000 = 0 كعدد صحيح ). volt[0] = DisplayVolt/1000 + 48;· الحصول على العدد الصحيح للمئات : بقسمة محتويات سجل المتغير DisplayVolt على 100 ثم إيجاد باقى قسمة النتيجة على 10 . ثم يضاف العدد 48 للتحويل إلى كود أسكى وتخزين النتيجة بالخانة رقم 1 بسجل المتغير volt ( 0462/100 =4 كعدد صحيح وباقى قسمة النتيجة على 10 هى العدد 4 المطلوب ) . volt[1] = (DisplayVolt/100)%10 + 48;· نكرر بالنسبة للعدد الصحيح للعشرات ( 0462 /10 = 46 كعدد صحيح وباقى قسمة النتيجة على 10 هى العدد 6 المطلوب "القسمة تساوى أربعة صحيح والباقى 6 وهو المطلوب ) volt[3] = (DisplayVolt/10)%10 + 48;· ثم كتابة محتويات السجل volt بدءا من الصف الثانى والعامود الخامس Lcd_Out(2,5,volt);· التأخير لفترة 500 ملى ثانية للسماح بمشاهدة العرض . delay_ms(500); // Hold for 500 ms· تكرار العملية بصفة مستمرة لتحديث قراءة المدخل التناظرى والعرض . } while(1);} // End main()
__________________ angel4angel4angel4angel4angel4 |
#14
| ||
| ||
كود: /* Project: Digital Voltmeter based on PIC16F877 Oscillator @ 4MHz, MCLR Enabled, PWRT Enabled, WDT OFF */ // LCD module connections sbit LCD_RS at RB0_bit; sbit LCD_EN at RB1_bit; sbit LCD_D4 at RB4_bit; sbit LCD_D5 at RB5_bit; sbit LCD_D6 at RB6_bit; sbit LCD_D7 at RB7_bit; sbit LCD_RS_Direction at TRISB0_bit; sbit LCD_EN_Direction at TRISB1_bit; sbit LCD_D4_Direction at TRISB4_bit; sbit LCD_D5_Direction at TRISB5_bit; sbit LCD_D6_Direction at TRISB6_bit; sbit LCD_D7_Direction at TRISB7_bit; // End LCD module connections char Message1[] = "DVM Project"; unsigned int ADC_Value, DisplayVolt; char *volt = "00.0"; void main() { ADCON0 = 0 ; // Analog channel select @ AN0 ADCON1 = 0b00001110 ; // RA0/AN0 is analog input TRISB = 0b00000000; // PORTB All Outputs TRISA = 0b00000001; // PORTA All Outputs, Except RA0 Lcd_Init(); // Initialize LCD Lcd_Cmd(_LCD_CLEAR); // CLEAR display Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off Lcd_Out(1,1,Message1); Lcd_Chr(2,10,'V'); do { ADC_Value = ADC_Read(0); DisplayVolt = ADC_Value * 2; volt[0] = DisplayVolt/1000 + 48; volt[1] = (DisplayVolt/100)%10 + 48; volt[3] = (DisplayVolt/10)%10 + 48; Lcd_Out(2,5,volt); delay_ms(500); // Hold for 500 ms } while(1);} // End main()
__________________ angel4angel4angel4angel4angel4 |
#15
| ||
| ||
__________________ angel4angel4angel4angel4angel4 |
مواقع النشر (المفضلة) |
| |