|
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
|
|
نشاط [ F.Abdelaziz ]
قوة السمعة:328
|
|
05-11-2015, 11:28 AM
المشاركة 1
|
|
مشروع قياس درجة الحرارة بالحساس 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 أى :
ملحوظة :
معامل القسمة الدقيق هو 2.05 , أى :
كود:
result = result /2.05;
فى النهاية يمكنك عرض هذه القيمة على وحدات العرض المختلفة .
فى هذا المشروع سوف نستخدم وحدتين 7 segment لعرض درجة الحرارة
الدائرة الكهربية :
البرنامج :
كود:
/*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
}
//-------------------------------------------
}
|