pregnancy

مشروع قياس درجة الحرارة بالحساس LM35


مشروع قياس درجة الحرارة بالحساس LM35 وعرضها على وحدات 7-segment وإنشاء نظام تحكم :
الحساس LM35 شائع الاستخدام وهو حساس دقيق لدرجة الحرارة بالدرجات المئوية , يمكن استخدامه لقياس درجة الحرارة بدقة نصف 0.5 درجة مئوية . يمكن ربط هذا الحساس بسهولة بالميكروكونترولر PIC وإنشاء مقاييس لدرجة الحرارة و متحكمات فى درجة الحرارة وأجهزة إنذار بالحريق و...
الحساس LM35 :

هذا الحساس له ثلاثة أطراف كما فى الشكل . جهد التغذية Vcc يمكن أن يكون من 4V إلى 20V .
لاستخدام الحساس ببساطة قم بتوصيل الطرف Vcc بالجهد +5V وطرف الأرضى (المشترك) GND بالأرضى وطرف الخرج Out بأحد أطراف المداخل التناظرية للميكروكونترولر . هذا الخرج يتغير خطيا مع درجة الحرارة وهو يساوى 10 ملى فولت لكل درجة مئوية . إذا كان الخرج 310 mV , على سبيل المثال , فإن درجة الحرارة تكون 31 درجة مئوية .
المحول ADC بالميكروكونترولر PIC بسعة 10 بت . إذا كان جهد المرجع المستخدم هو 5V فإن دقة التحويل (أقل جهد يمكن قياسه) تكون :
5/1024 = 5mV approx
بمعنى آخر : أقل نتيجة تحويل ADC هى البت أو الوحدة "1" , عندئذ يكون أقل جهد يمكن قياسه هو 5mV وهو يناظر درجة حرارة تساوى 0.5 درجة مئوية وهى دقة القياس .
ملحوظة :
القيمة الدقيقة هى 4.88mv .
مثال :
إذا كانت نتيجة التحويل ADC هى 10 فهذا يعنى أن جهد الدخل :
10 x 5mV = 50mV
وهو يناظر 5 درجة مئوية ( طل درجة مئوية تناظر 10 ملى فولت) .
يمكننا قراءة قيمة أى قناة تحويل ADC باستخدام الدالة ADC_Read(ch)" " حيث ch هى رقم القناة . إذا قمت بتوصيل الحساس LM35 إلى القناة RA0/AN0 عندئذ تصبح الدالة ADC_Read(0)" " . هذه القراءة يجب حفظها فى متغير ليصبح شكل العبارة:
result = ADC_Read(0);
هذه العبارة تعنى تخزين القراءة الحالية لنتيجة التحويل ADC فى المتغير result . بيانات هذا المتغير يجب أن تكون من نوع 0 .. 65535" unsigned (int)" حيث أن مدى قيمة نتيجة التحويل هو 0-1023 .
كما ذكرنا : قيمة نتيجة التحويل ADC تكون نتيجة "لمضاعفات" القيمة 5mV ونظرا لأن كل واحد درجة مئوية تنتج 10mV فى خرج الحساس , نتيجة لذلك يمكننا القول " كل وحدتين من وحدات نتيجة التحويل ADC تساوى واحد درجة مئوية" . لذلك , للحصول على درجة الحرارة يتم قسمة قيمة المتغير result على 2 أى :
result = result /2;
ملحوظة :
معامل القسمة الدقيق هو 2.05 , أى :
result = result /2.05;
فى النهاية يمكنك عرض هذه القيمة على وحدات العرض المختلفة .
فى هذا المشروع سوف نستخدم وحدتين 7 segment لعرض درجة الحرارة
الدائرة الكهربية :


البرنامج وبه جميع التعليقات :
Code:
/*Project: Temperature display and controller using two 7 segment and LM35 Connection as in QL200 : segments connected to PORTD-Common Anodes :RA4>tens & RA5>ones LED : connected to RB0 Buzzer :connected to RC2 MCU : PIC16F877A MikroC PRO ENG.F.ABDELAZIZ http://www.eeecb.com/vb/index.php */ //---------------------------------------------------------------------------------------------------------- //define the table of constant 0-9 (mask) const char TABLE[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; unsigned int result=0x00; //define ADC convert result register unsigned short i; // for loop counter void init(); //I/O PORT initialize function declare void display(int result); //display function declare //--------------------------------------------------------------------------------------------------------------- //main program void main() { init(); //call initialize function while(1) { result=0x00; //clear the convert result result = ADC_Read(0);// read and stor ADCresult as "0-1023" //result=result/2; // covert from "0-1023" to "temperature in degree result=result/2.05; // exact conversion from "0-1023" to "temperature in degree display(result); //call display function // Temperature controller part if(result>75) PORTB.B0=1; else PORTB.B0=0; // LED if(result>85) PORTC.B2=1; else PORTC.B2=0;//Buzzer } } //----------------------------------------------- //initialize function void init() { ADCON1=0X8E; //set RA0 pin > ADC input ,the others general I/O TRISA=0X01; //set RA0 INPUT,the others OUTPUT TRISD=0X00; //set D PORT all OUTPUT TRISB.B0=0; //For LED TRISC.B2=0; //For Buzzer PORTD=0XFF; //close all display } //----------------------------------------------- //display function void display(int result) { int TEN,ONE,temp; //define 3 temporary variable temp=result; //temporary keep AD convert result TEN = temp/10 ; //get display tens bit ONE = (temp % 10) ; //get display ones bit //----------------------------- for (i = 0; i<=50; i++) { PORTD=TABLE[TEN]; //get the display tens bit code from table PORTA=0x2F; //RA4 OUTPUT low,light tens bit display Delay_ms(1); //delay some time,ensure display brightness PORTD=TABLE[ONE]; //get the display ones bit code from table PORTA=0x1F; //RA5 OUTPUT low,light ones bit display Delay_ms(1); //delay some time,ensure display brightness } //------------------------------------------- }


شكرا لتعليقك

فهرس




    اندرويد