مشروع متحكم فى درجة حرارة (بيان وتحكم) مع استخدام موديول ADC والحساس LM35 و LCD و RS232 مع المترجم CCS C

استعرض الموضوع السابق استعرض الموضوع التالي اذهب الى الأسفل

مشروع متحكم فى درجة حرارة (بيان وتحكم) مع استخدام موديول ADC والحساس LM35 و LCD و RS232 مع المترجم CCS C

مُساهمة من طرف Admin في السبت يونيو 06, 2015 11:20 am

مشروع متحكم فى درجة حرارة (بيان وتحكم) مع استخدام موديول ADC والحساس LM35 و LCD و RS232 مع المترجم CCS C
الغرض :
هذا البرنامج البسيط يبين لك كيفية قراءة حساس درجة الحرارة LM35 باستخدام الميكروكونترولر بغرض بيان درجة الحرارة ، وبناء على هذا البيان يتم التحكم فى تشغيل وفصل جهاز (حمل) عند درجة حرارة محددة ، أى متحكم فى درجة الحرارة .
الأدوات المستخدمة :
• المترجم CCS PIC-C .
• برمجيات المحاكاة ضمن برنامج PROTEUS .

معلومات مساعدة :
المحول من تناظرى إلى رقمى ADC هو وحدة أو موديول داخل الميكروكونترولر يستخدم لقراءة الجهود التناظرية فى شكل تمثيل رقمى . فى هذا المشروع سوف نستخدم الميكروكونترولر PIC16F877A والذى يمتلك موديول ADC بدقة 10 بت وله 8 قنوات هى A0-A5 , E0-E2 .
أحد البارامترات الهامة لموديول ADC هو جهد مرجعه (Vref) ، وهو أقصى جهد يمكن للموديول ADC قراءته ، فى هذا المشروع سوف يكون Vref = 5V وهو جهد مصدر تغذية الميكروكونترولر .
بارامتر مهم آخر هو دقة التحويل للموديول ADC ، والتى تحدد أدنى قيمة جهد تناظرى يمكن قراءته ( تسمى خطوة التحويل) .
فعلى سبيل المثال ، موديول محول ADC بدقة 10 بت مع جهد مرجع 5V ، يكون مدى الجهود يبدأ من 0V وينتهى عند 5V ويكون مقسما إلى خطوات (أقسام) متساوية تبدأ من “0” وتنتهى عند “1023” (2^10 -1) . وهذا يعنى أنه إذا كان جهد الدخل التناظرى هو 5V ، والذى يمثل أقصى قيمة ، فأن المحول ADC سوف يقرأه فى شكل العدد “1023” ، وإذا كان جهد الدخل التناظرى 2.5V فإن القراءة سوف تكون 512 وهكذا .
يتم حساب خطوة (دقة) المحول ADC ببساطة باستخدام المعادلة Step = Vref/1024 ، وفى هذه الحالة تكون
4.883 mV ، وهذا الجهد هو أدنى جهد يمكن للمحول ADC قراءته ، ومن ثم فإن دخل تناظرى بالقيمة 4.883Mv يجب أن يعطى قراءة “001” ، ودخل بالقيمة 9.766mV يجب أن يعطى قراءة “002” وهكذا .
حساس درجة الحرارة LM35 :
هذا الحساس له 3 أطراف هى طرفى التغذية وطرف الخرج (Vcc,Output,GND) ، وهو حساس لدرجة الحرارة مرتفع الدقة ، حيث تبلغ دقته 10mV/C مبتدءا من عند 0V ، أى أن خرج 0V يمثل درجة حرارة 0C ، ومن ثم يكون :
10mV ---> 1C
20mV ---> 2C
370mV ---> 37.0C.
…………………
تحويل قراءة المحول ADC إلى الدرجات المئوية :
بمعلومية أن خطوة المحول ADC هى 4.883Mv ، فإن تحويل القراءة القمية مرة أخرى إلى جهد تناظرى يكون أمرا من السهل القيام به عن طريق ضرب القراءة الرقمية (عدد الخطوات) فى قيمة الخطوة الواحدة :
Vin (in Volts) = DigitalReading * 0.004883

الآن ، بمعلومية أن حساسية الحساس هى 10mV/C ، يكون من السهل القيام بتحويل هذا الجهد إلى درجات مئوية عن طريق قسمة جهد الدخل على “0.01” ، وبالتالى يكون :

Temperature (C) = Vin/0.01 = DigitalReading * 0.4883

أى ضرب القراءة الرقمية فى معامل الدقة الكلية وهو 0.4883 .

الدائرة الكهربية :





تدريب تمهيدى : قراءة درجة الحرارة وإرسالها خلال المنفذ RS232 إلى الكمبيوتر :



Admin
Admin

عدد المساهمات : 935
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

تدريب تمهيدى : قراءة درجة الحرارة وإرسالها خلال المنفذ RS232 إلى الكمبيوتر :

مُساهمة من طرف Admin في السبت يونيو 06, 2015 11:28 am

تدريب تمهيدى : قراءة درجة الحرارة وإرسالها خلال المنفذ RS232 إلى الكمبيوتر :




الكود:

#include <16F877A.h>
#device ADC=10
#USE DELAY(clock = 4000000)
#use RS232(baud = 9600, xmit = PIN_C6, rcv = PIN_C7)

void main ()
{
  float32 value, value1;
  setup_adc(ADC_CLOCK_INTERNAL);    // Internal
  setup_adc_ports (AN0);
  set_adc_channel (0);
  while (TRUE)
  {
      delay_ms (500);
      value = read_adc ();
      value1 = value * 0.4883;
      printf ("Temp:%5.1fC\n\r", (float)value1);
  }
}


شرح البرنامج :
أولا :رأس (مقدمة) البرنامج :
1- تحديد الميكروكونترولر المستخدم :

الكود:

#include <16F877A.h>
2- تحديد دقة موديول المحول ADC ، لاحظ وجود هذا التحديد قبل تحديد تردد ساعة التأخير :

الكود:

#device ADC=10
3- تحديد تردد الساعة المستخدم مع الميكروكونترولر :

الكود:

#USE DELAY(clock = 4000000)
4- تحديد خصائص الاتصال عبر المنفذ RS232

الكود:

#use RS232(baud = 9600, xmit = PIN_C6, rcv = PIN_C7)

ثانيا : الدالة الرئيسية :

الكود:

void main ()
{

1- إعلان المتغيرات ، لاحظ أن النوع يتناسب مع القيم التى سوف يتم حفظها فى المتغير :

الكود:

Int16 value; 
float value1;
2- تحديد إعدادات المحول ، وطرف المنفذ المستخدم ، والقناة المستخدمة .

الكود:

  setup_adc(ADC_CLOCK_INTERNAL);    // Internal
  setup_adc_ports (AN0);
  set_adc_channel (0);
3- الحلقة الغير منتهية :
الكود:

  while (TRUE)
  {
أ‌- تأخير مقترح لزوم الاستقرار

الكود:

      delay_ms (500);

ب‌- قراءة الجهد التناظرى وتحويله إلى نتيجة رقمية “0-1023” وحفظه فى المتغير value :

الكود:

    value = read_adc ();

ت‌- تحويل القراءة الرقمية إلى ما يقابلها من الدرجات المئوية

الكود:

    value1 = value * 0.4883;

ث‌- إرسال معلومات درجة الحرارة بتشكيل محدد عبر المنفذ RS232 :

الكود:

      printf ("Temp:%5.1fC\n\r", (float)value1);
  }
}



برنامج المتحكم :

Admin
Admin

عدد المساهمات : 935
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

برنامج المتحكم :

مُساهمة من طرف Admin في السبت يونيو 06, 2015 11:30 am

برنامج المتحكم :

الكود:

///////////////////////////////////////////////////////////////////////////////////////////////////////
/*
PIC16F877A and LM35-LCD Based Temperature Monitor
*/

#include <16f877a.h>
#device adc=10    // Set ADC resolution to 10Bit
#use delay(clock=4000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,ERRORS)
#include <lcd.c>

#define  LOAD  PIN_B7 //Relay
#define  THRES 30.0    // load switching threshold in Celsius

int16 digital_reading;  // ADC resolution is 10Bit, an 8Bit integer is not enough to hold the reading
float temp;

void main()
{
  /* ADC Initialization */
  setup_adc(ADC_CLOCK_INTERNAL); // initialize ADC with a sampling rate of Crystal/4 MHz
  setup_adc_ports(RA0_ANALOG);  // set PIN_A0 as analog input channel
  set_adc_channel(0);            // point ADC to channel 0 for ADC reading
  delay_ms(1);                  // ADC module is slow, needs some time to adjust.
   
  /* Peripherals Configurations */
  lcd_init();                  // Turn LCD ON, along with other initialization commands
  output_low(LOAD);            // the load is initially OFF
  lcd_gotoxy(1,1);              // point LCD cursor to col1 row1
  lcd_putc("Temperature is:");  // print on LCD
   
  while(1) // infinite loop
  {
      digital_reading = read_adc();    // capture current temperature reading
      delay_us(100);                  // 0.1ms delay for ADC stabilization
      temp = digital_reading * 0.4883; // convert reading to Celsius
      lcd_gotoxy(1,2);                // point LCD cursor to col1 row2
      printf(lcd_putc,"%2.1f C",temp); // print value on LCD
      printf("Temperature is: %2.1f C\r\n",temp); // print value on RS232
      if(temp>=THRES)  output_high(LOAD);  // if temp.>=30 then Control Load on
      else  output_low(LOAD); //else off
     
      delay_ms(1000);  // 1 second delay between readings
  }
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////


Admin
Admin

عدد المساهمات : 935
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

استعرض الموضوع السابق استعرض الموضوع التالي الرجوع الى أعلى الصفحة


 
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى